【问题标题】:fetchAll() returns empty array, looping with fetch() gets all resultsfetchAll() 返回空数组,用 fetch() 循环获取所有结果
【发布时间】:2016-11-23 23:28:21
【问题描述】:

任何人都知道为什么会发生这种情况

$stmt = $this->prepare($this->sql);
$exec = $stmt->execute($this->bindings);
// The below returns an empty array()
return $exec->fetchAll(PDO::FETCH_OBJ);
// This however will return rows if looped.
return $exec->fetch(PDO::FETCH_OBJ);

更奇怪的是,这仅发生在我们数据库中的某些 ID 范围内,例如,如果您搜索有关产品 ID 为 552 的项目的各种信息,上面的代码与 fetchAll() 一起工作没问题,但将其更改为553 并且它失败(空数组)。 554 然后再次工作。项目之间的数据库中的数据几乎没有差异(都只是整数和时间戳[地理位置数据])。

【问题讨论】:

  • 添加一些调试:在执行后检查 $stmt 的行数。如果完全失败,则 fetch/fetchall 返回布尔值 false。如果没有结果(但结果句柄有效),您将得到一个空数组。所以最有可能 fetch/fetchall 工作正常,而且它的查询不知何故没有找到任何东西。
  • rowCount 返回 23,columnCount 返回 2。fetch 和 fetchAll 都不返回 false。在命令行中执行原始 sql 命令(从准备好的 stmt 模拟)可以正常工作。
  • 啊,重新启动我们的服务器并停止并重新启动 MySQL,它现在正在工作。奇怪的问题。

标签: php mysql pdo


【解决方案1】:

你必须按照这个来解决问题;字符集=utf8

你的数据库连接代码应该是这样的

$db = new PDO("mysql:host=localhost;dbname=testdb;charset=utf8", "testuser", "testpass");

【讨论】:

    【解决方案2】:

    我想我会在这里回复一个答案,因为我们的服务器今晚早些时候再次打嗝。事实证明,这是之前一组项目数据(我实际上不知道它以前是什么编码)和我们的项目表现在使用的较新的 utf-8 编码之间的字符编码问题。 PHP 被几个没有很好转换的字符挂断(一些边缘情况和奇怪的字符),而 PHP 反过来返回一个有效的数组,但是 json_encode 无法处理并且会使脚本崩溃并静默失败(奇怪)在我们的 jQuery 客户端实现和我们自己的错误检查 php 后端(更奇怪,需要更多调查,但这超出了这个问题的范围)。

    我的解决方案是直接从 API 和项目模式将数据重新复制到新的编码,这些模式一开始就在 utf-8 中,因此无需担心交叉编码问题。用一小部分测试,这个问题似乎终于被搁置了。 :)

    【讨论】:

      猜你喜欢
      • 2021-05-21
      • 1970-01-01
      • 2014-09-04
      • 1970-01-01
      • 2014-02-02
      • 2018-06-27
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多