PHP:PDO查询不返回结果,但在phpmyadmin中同样的查询返回4个结果?

Posted

技术标签:

【中文标题】PHP:PDO查询不返回结果,但在phpmyadmin中同样的查询返回4个结果?【英文标题】:PHP: PDO Query returns no results, but the same query returns 4 results in phpmyadmin? 【发布时间】:2015-06-18 17:02:12 【问题描述】:

我编写了一个查询来返回帖子的所有 cmets,不包括该帖子中被阻止的用户。我已经在 phpmyadmin 中测试了查询,对于给定的帖子(其中 1 个用户被阻止),我得到了 4/5 可能的 cmets。

查询看起来像:

$query = "SELECT ent.Entity_Id, ent.Profile_Pic_Url, ent.First_Name, ent.Last_Name, ent.Last_CheckIn_Place, comments.Content
          FROM   checkin_comments AS comments
          JOIN   entity AS ent
          ON     comments.Entity_Id = ent.Entity_Id
          LEFT JOIN friends AS f
          ON     ent.Entity_Id = :entityId
          WHERE  comments.Chk_Id = :checkInId
          AND    f.Category != 4
          GROUP BY comments.Comment_Id
          ";

// Bind the parameters to the query
$data = Array(":checkInId" => (int)$checkInId, ":entityId" => (int)$userId);

如果我在 phpmyadmin 上使用 checkinId 值 1726 和 userId 值 1517 运行查询,我会得到预期的结果,但是在 PHP 中我得到 0 个结果。我使用 var_dump 打印数据的内容,它显示为:

array(2) 
[":checkInId"]=>
int(1726)
[":entityId"]=>
int(1517)

为什么我在 PHP 中遇到不同的结果?我所有其他查询都运行良好

编辑如果我将绑定变量换成数字值,则查询工作正常,这使我相信这是 PDO 将值绑定到查询的问题。当我执行绑定时,我使用执行以下方法的 PDO 包装类:

public function fetchAll($query, $data = null)

    $stmt = $this->prepareQuery($query, $data);
    return  $stmt->fetchAll();


private function prepareQuery($query, $data = null)

    $stmt = $this->connection->prepare($query);
    $stmt->execute($data);
    return $stmt;

这是否为任何更有经验的 PDO 用户提供了答案?

【问题讨论】:

您写道:checkinId 的值为 1726,userId 的值为 1527,但您绑定的是 1517 你在哪里实际准备和执行这个查询?仅仅分配给$data 是不够的。 我写了一个简单的 pdo 包装器。我知道你会认为这个问题很有必要,但我有大约 20 个其他查询在同一个包装器上运行,它们返回得很好。 “准备”查询和/或执行是否有任何错误?可能值得将该查询复制并粘贴到“sql ide”中,以确保其中没有无效字符。您可以随时向SQLFiddle 提供一些测试数据,我们可以在我们的机器上尝试完全相同的代码? 我从来没有遇到任何错误。下班回来我会做一个 Sql fiddle 【参考方案1】:

我认为您没有将参数包含在单引号中。试试这个代码

$query = "SELECT `ent`.`Entity_Id`, `ent`.`Profile_Pic_Url`, `ent`.`First_Name`, `ent`.`Last_Name`, `ent`.`Last_CheckIn_Place`, `comments`.`Content`
      FROM   `checkin_comments` AS `comments`
      JOIN   `entity` AS `ent`
      ON     `comments`.`Entity_Id` = `ent`.`Entity_Id`
      LEFT JOIN `friends` AS `f`
      ON     `ent`.`Entity_Id` = ':entityId'
      WHERE  `comments`.`Chk_Id` = ':checkInId'
      AND    `f`.`Category` != 4
      GROUP BY `comments`.`Comment_Id`
      ";

// Bind the parameters to the query
$data = Array(":checkInId" => (int)$checkInId, ":entityId" => (int)$userId);

我希望这会有所帮助。

【讨论】:

如有必要,会引用 PDO 的占位符。添加这样的引号可能会导致双重转义,并且在任何情况下都是毫无意义的。不要这样做。

以上是关于PHP:PDO查询不返回结果,但在phpmyadmin中同样的查询返回4个结果?的主要内容,如果未能解决你的问题,请参考以下文章

PDO 不从 mysql 查询返回结果

mysql“日期之间”查询在 phpmyadmin 中有效,但 PDO 不返回任何内容

在 PHP 中通过 ODBC(使用 PDO)查询雪花返回不正确的数据

PDO 不返回任何结果,而 MySQL 命令行返回预期结果

PDO:删除查询结果的重复项[重复]

PHP Mysql PDO查询来自foreach存储的多个值以供输出