【问题标题】:SQL query returns empty resultSQL 查询返回空结果
【发布时间】:2013-04-19 15:22:10
【问题描述】:

我有这个 SQL 查询:

SET @date_shift = DATE_SUB(NOW(), Interval 60 MINUTE);
SELECT hinfo.idx,
   hinfo.host_idx,
   hinfo.processor_load,
   hinfo.memory_total,
   hinfo.memory_free,
   hnames.idx,
   hnames.name,
   disks.hostinfo_idx,
   disks.id,
   disks.name,
   disks.size,
   disks.freespace,
   hinfo.probetime
FROM   systeminfo.hostinfo AS hinfo
   INNER JOIN systeminfo.hosts AS hnames
           ON hnames.idx = hinfo.host_idx
   INNER JOIN systeminfo.disksinfo AS disks
           ON disks.hostinfo_idx = hinfo.idx
WHERE   hinfo.probetime > @date_shift AND
      hinfo.probetime = (SELECT MAX(probetime) FROM systeminfo.hostinfo AS hi
                                    WHERE hi.probetime > @date_shift AND hi.host_idx = hinfo.host_idx)
GROUP  BY disks.id,
      hnames.name
ORDER  BY hnames.name,
      disks.id;

我尝试在 php 代码中执行它。我试过 mysql、mysqli 和 pdo。马最后的代码如下:

$db = new PDO("mysql:host=".$this->ip.";dbname=".$this->dbname.";charset=utf8", $this->username, $this->password);
$result = $db->query($query);
$fetch_data = $result->fetchAll(PDO::FETCH_ASSOC);

mysql_connect($this->ip, $this->username, $this->password);
mysql_query('SET NAMES utf8;');
mysql_select_db($this->dbname);
$result = mysql_query($query);

PHP 正确连接到数据库。简单的查询,例如 select * from tablename 有效。但是此查询返回 NO 数据但错误:

1064 : 您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 'SELECT hinfo.idx, hinfo.host_idx, hinfo.processor_load, hinfo.memory_total, ' 在第 2 行

在数据库客户端中执行的相同查询可以完美运行(这不是一个缓慢的查询,执行它只需不到 10 毫秒)。 此外,当我尝试直接从网页上的此功能打印查询并将其粘贴到 mysql 客户端时 - 它也可以完美运行!我在十六进制查看器中找不到任何特殊字符我试图强制 utf 编码,什么都没有。

有什么想法吗?我可以执行的测试?提前致谢!

【问题讨论】:

  • 它的链式查询实际上有 2 个查询。将您的 @date_shift 更改为实际的日期子函数,它应该可以工作。
  • mysql_* 函数不再支持,它们是 officially deprecated不再维护,将在 removed未来。您应该使用PDOMySQLi 更新您的代码,以确保您的项目在未来的功能。
  • @ka 我知道。我只是为了测试目的而这样做的。如果您阅读了我的帖子,我写道我在代码中使用了 PDO。这不是问题!

标签: php mysql pdo mysqli html5builder


【解决方案1】:

尝试将其作为两个单独的语句执行。从 GUI 工具或命令行工具运行查询不同于在代码中嵌入查询。所以它适用于数据库工具,但不适用于 php 代码。

【讨论】:

    【解决方案2】:

    PHP 的 mysql 适配器一次只能处理一个查询。您确实应该彼此分开运行查询。

    "@date_shift" 将在第二个查询中可用,假设您与 mysql 的连接在两个查询之间没有被破坏。

    【讨论】:

    • 这是最好的主意。它确实有效。 @date_shift 在第二个查询中确实可用。我还读到可以使用“nextRowset”方法在 PDO 中的多个查询结果之间切换。没试过,但应该也可以。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-08-03
    • 2011-04-11
    • 2021-03-18
    • 2021-11-20
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多