【问题标题】:Codeigniter active record where is not workingCodeigniter 活动记录不起作用
【发布时间】:2013-09-12 18:53:50
【问题描述】:

我正在使用活动记录运行 CodeIgniter。下面是我的表结构:

id (int)   user (int)   is_complete (tinyint)
------------------------------------------------
1          24           1
2          24           1
3          24           NULL
4          24           0
5          24           0

案例一

$this->db->where('user', 24);

查询:

SELECT * FROM `table` WHERE `user` = 24

有效并返回:

id   user   is_complete
--------------------------
1    24     1
2    24     1
3    24     NULL
4    24     0
5    24     0

案例 2

$this->db->where('user', 24);
$this->db->where('is_complete', 1);

查询:

SELECT * FROM `table` WHERE `user` = 24 AND `is_complete` = 1

有效并返回:

id   user   is_complete
--------------------------
1    24     1
2    24     1

案例 3

$this->db->where('user', 24);
$this->db->where('is_complete !=', 1);

查询:

SELECT * FROM `table` WHERE `user` = 24 AND `is_complete` != 1

不起作用并且正在返回:

id   user   is_complete
--------------------------
4    24     0
5    24     0 

案例 4

$this->db->where('user', 24);
$this->db->where('is_complete <>', 1);

查询:

SELECT * FROM `table` WHERE `user` = 24 AND `is_complete` <> 1

不起作用并且正在返回:

id   user   is_complete
--------------------------
4    24     0
5    24     0 

需要结果

应该返回:

id   user   is_complete
--------------------------
3    24     NULL
4    24     0
5    24     0

我是在使用where() 方法做错了什么,还是有更好的方法来完成这个?

【问题讨论】:

  • 如果您将其与0NULL 进行比较,您会得到想要的输出吗?
  • 0 不起作用,NULL 起作用
  • 更正0 有效,NULL 有效
  • 能否调试查询?我的意思是,输出那些命令创建的 sql 查询?
  • 使用echo $this-&gt;db-&gt;last_query(); 调试查询,将查询复制并粘贴到phpMyAdmin 中并检查它是否有效。

标签: php mysql codeigniter-2 codeigniter


【解决方案1】:

这是数据库级别的问题,尽管它不是错误 - 这就是 SQL 处理空值的方式。这个查询:

SELECT
    *
FROM
    `table`
WHERE
    `user` = 24 AND `is_complete` != 1

将返回 is_complete 不等于 1 但不为空的记录。如果您还希望包含空记录,则需要这样做:

SELECT
    *
FROM
    `table`
WHERE
    `user` = 24 AND
    (`is_complete` != 1 OR `is_complete` IS NULL)

通过将列与非空值进行比较,您自动排除了需要使用不同语法处理的空值。

您需要为查询添加一个额外的括号子句; see here for how.

【讨论】:

  • 所以如果is_complete 也有'2'和'3'的值,我会使用你提供的相同语法吗?因为!= 1 将处理除NULL 之外的所有值(0、2、3),而IS NULL 处理任何NULL 值?
  • 是的,没错:)。 “不等于”适用于任何实际值,但 null 除外。
  • 太棒了!刚刚试了一下,并完全按照我的意愿工作,我使用了带括号的where() 子句,这也有效。谢谢
  • 太棒了。我猜想在您将自己的值注入where() 字符串的地方,您需要手动清除它们。对于整数,您可以直接转换为 (int),但希望 CI ActiveRecord 中也有一个参数化系统。
【解决方案2】:

案例 3 有效NULL 在 SQL 中与数字不同,需要不同的比较器。我认为 NULL 是没有任何东西,而 0 是数字 0;这是一个微妙的区别。 所以!= 1 给出了除 1 之外的所有数字,而要找到 null,您必须使用 is / is not null 比较器。

找到你的查询必填结果是:

$this->db->where("((is_complete = 0) OR (is_complete is null))",NULL,FALSE);

搜索!= 1 与搜索= 0 不同。 (如果is_complete 的值可能是“3”。如果您搜索您想要的,而不是不应该存在的,您的代码中可能会遇到更少的问题)。

如果使用第三个 (FALSE) 参数来删除反引号,where 语句需要第二个参数。

【讨论】:

    【解决方案3】:

    最好使用活动记录来支持多数据库。

    您可以使用类似的活动记录进行查询

    案例 3

    $this->db->where('user', 24, FALSE);
    $this->db->where('is_complete !=', 1, FALSE);
    

    案例 4

    $this->db->where('user', 24, FALSE);
    $this->db->where('is_complete <>', 1, FALSE);
    

    第三个参数用于去除导致sql查询问题的反引号。

    【讨论】:

      猜你喜欢
      • 2014-06-18
      • 1970-01-01
      • 2014-02-25
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 2014-02-22
      • 2014-10-19
      • 1970-01-01
      相关资源
      最近更新 更多