问题描述
我想从我的MysqL表中获取页面列表。但是,如果$ user_id值为NULL,并且如果定义了$ user_id值,我想获取所有用户添加的页面列表,我需要获取该特定用户添加的页面列表。我觉得可能有一个简单的解决方案,但是很长时间以来我一直试图找到一种解决方案,但是我失败了,例如“ WHERE user_id不为null或user_id = $ user_id”。我该如何修改下面的代码以获得预期的结果?
public function getPagesList($user_id = NULL){
$this->db->query ('
SELECT `page_id`,`page_name`
FROM `pages`
WHERE `user_id` = :user_id
');
$this->db->bind(':user_id',$user_id);
return $this->db->resultSet();
}
解决方法
您可以在LIKE中使用通配符
正如Liam Sorsby正确指出的那样,所有页面可能都是很多页面,因此您应该考虑过时或限制行数
public function getPagesList($user_id = NULL){
$uid = is_null($user_id) ? '%' : $user_id;
$this->db->query ('
SELECT `page_id`,`page_name`
FROM `pages`
WHERE `user_id` LIKE :user_id
');
$this->db->bind(':user_id',$uid);
return $this->db->resultSet();
}
这样工作
create table numericstring ( pk INT auto_INCREMENT PRIMARY KEY,id INT );
insert into numericstring (id) values ( 20001 ),( 20002 ),( 30001 ),( 30002 ),( 30003 ),( 30004 ),( 37 ),( 937 ),( 21 ),( 3 ),( 222222 ),( 3333 ) ;
select * from numericstring WHERE id LIKE '3'
pk | id -: | -: 10 | 3
select * from numericstring WHERE id LIKE 3
pk | id -: | -: 10 | 3
select * from numericstring WHERE id LIKE '%'
pk | id -: | -----: 1 | 20001 2 | 20002 3 | 30001 4 | 30002 5 | 30003 6 | 30004 7 | 37 8 | 937 9 | 21 10 | 3 11 | 222222 12 | 3333
db 提琴here
,如果$ user_id值为NULL,并且如果定义了$ user_id值,我想获取所有用户添加的页面列表。我需要获取该特定用户添加的页面列表。
这将翻译为:
WHERE :user_id is NULL OR user_id = :user_id
当参数为null
时,将返回所有行;设置参数后,将用于过滤列user_id
。
您可以使用coalesce()
稍微缩短表达式,但效率可能会降低:
WHERE COALESCE(:user_id,user_id) = user_id
请注意,正如Liam Sorsby所评论的那样,最有效的选项可能是检查是否从应用程序中设置了参数,并相应地修改了查询字符串。如果未设置参数,则查询没有WHERE
子句;如果已设置,则为WHERE user_id = :user_id
。