Mysql 查询在 Codeigniter 中返回空结果,但在本机 PHP 中工作正常

Posted

技术标签:

【中文标题】Mysql 查询在 Codeigniter 中返回空结果,但在本机 PHP 中工作正常【英文标题】:Mysql query return empty result in Codeigniter but working fine in native PHP 【发布时间】:2016-11-04 02:05:54 【问题描述】:

我无法弄清楚为什么我的查询总是在 Codeigniter 中返回空结果。在 phpmyadmin 的 SQL 框中运行时,相同的查询按预期工作。

我的表(用户)看起来像这样:

id | name        | registration
-------------------------------
 1 | John        | 2016-06-09 12:00:08
 2 | Mike        | 2016-06-12 12:45:23
 3 | Greg        | 2016-06-13 11:50:05
 4 | Anthony     | 2016-06-14 02:34:08
 5 | Adam        | 2016-06-14 04:34:18
 6 | Steven      | 2016-06-15 13:55:34
 7 | Joe         | 2016-06-16 07:23:45
 8 | David       | 2016-06-17 06:19:31
 9 | Richard     | 2016-06-17 11:20:27
10 | Jack        | 2016-06-17 12:00:08

等等。我只想获取注册日期在过去 7 天内的所有人的列表。 'registration' 列是 DATETIME 类型

这是我使用 Query Builder 在 CI 模型中的代码。已经自动加载数据库库

   function get_user()
   
    $query = $this->db->select('name')
                  ->where('registration','BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND NOW()')
                  ->get('users');
    return $query->result();
   

它返回空结果而没有错误。接下来我尝试像这样直接查询

    function get_user()
    
     $query = $this->db>query('SELECT name FROM users WHERE registration BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND NOW()');
    return $query->result();       
    

同样返回空结果而没有错误。所以出于好奇,我尝试在 Codeigniter 之外使用原生 PHP 运行相同的查询。这是代码:

   <?php
   $link = mysqli_connect("localhost", "myusername", "mypassword", "mydatabase");

   if (mysqli_connect_errno()) 
   printf("Connect failed: %s\n", mysqli_connect_error());
   exit();
   

   $query = "SELECT name FROM users WHERE registration BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND NOW()";
   $result = mysqli_query($link, $query);
   while($row = mysqli_fetch_array($result, MYSQLI_ASSOC))
   echo $row["name"];
   echo "<br>";
   

   mysqli_free_result($result);
   mysqli_close($link);
   ?>

瞧……它可以正常工作并按预期返回结果。那么知道在这种情况下 Codeigniter 有什么问题吗?任何输入将不胜感激。谢谢大家

【问题讨论】:

看来问题出在日期选择上。仍然不知道为什么它在 CI 中不起作用。如果我创建不涉及日期的查询,它就可以正常工作 我只是检查了这个查询并且工作正常 【参考方案1】:

我假设这是 CodeIgniter 3.x。这是文档中的相关页面。

http://www.codeigniter.com/user_guide/database/query_builder.html#looking-for-specific-data

要点是where() 的行为不像您希望的那样。如果给它两个字符串,它会将第一个视为列名,将第二个视为值并比较是否相等。您想在文档中的第 4 点中使用“自定义字符串”变体。

或者,由于您似乎很乐意编写自己的 SQL 字符串,因此您也可以考虑走这条路,根本不使用 CI 查询生成器。 $this-&gt;db-&gt;query() 运作良好。它甚至支持在查询字符串中使用 ?s 和一个值数组来替换它们。我认为它不像 PDO 那样支持命名绑定。

http://www.codeigniter.com/user_guide/database/queries.html

【讨论】:

是的,我正在使用 CI 3。感谢您的指出。我不知道文档中第 4 点中描述的“自定义字符串”。但即使使用它仍然会给我空的结果。

以上是关于Mysql 查询在 Codeigniter 中返回空结果,但在本机 PHP 中工作正常的主要内容,如果未能解决你的问题,请参考以下文章

004.CI4框架CodeIgniter, 配置mysql数据库,并进行数据库查询

使用 PHP/CodeIgniter 在 MySQL 中获取最后执行的查询

MySql 查询在 PHPmyadmin 中工作,但在 codeigniter 中不工作

如何测试我的 MySQL 更新查询在 CodeIgniter 中是不是成功? [复制]

为啥 CodeIgniter 不会在括号中返回 SQL 查询的结果?

mysql慢查询中的Codeigniter会话查询