PDO->fetchAll() 在远程服务器上返回空数组

Posted

技术标签:

【中文标题】PDO->fetchAll() 在远程服务器上返回空数组【英文标题】:PDO->fetchAll() returns empty array on remote server 【发布时间】:2014-05-20 04:26:59 【问题描述】:

基本上,在我的本地主机上一切正常。 这些是两种环境的 php 版本:

开发(本地主机):5.5.3

生产:5.3.27

我一直在寻找一个兼容性问题,但没有运气,这是我最后的手段。

在开发中返回请求数据但在生产中不返回的代码 sn-p:

function dbq($query, $array = array()) 
        $core = Core::getInstance();
        $STH = $core->dbh->prepare($query);
        $sth = $STH->execute($array);
        $res = $STH->fetchAll(PDO::FETCH_OBJ);
        print_r($res);

之前已成功建立连接,因此没有问题。 正如我之前所说的,'$res' 在生产环境中返回空数组。

该函数被其他函数调用,例如:

function first() 
    return $this->dbq("SELECT * FROM $this->class 
               ORDER BY id ASC LIMIT 1");       

注意:第二个参数用于准备好的语句,并不总是必需的。

【问题讨论】:

-1 表示第二个函数,它很容易被注入并破坏 PDO 准备语句的想法 为什么要设置 PDO::FETCH_OBJ 两次?你确定一次还不够吗? 我听到了您的担忧,但此功能不受用户输入的影响。 (用户永远无法给这个函数添加参数) 一个人永远无法分辨哪些会受到影响,哪些不会。一些项目不断增长,直到更多的开发人员加入,一个人无法控制他们的行为。这样的功能必须是防错的,没有任何沉默的考虑 公平点。会得到它。仍然没有关于我真正问题的实际信息:/ 【参考方案1】:

您可以使用$STH->debugDumpParams() 调试您的语句。 (documentation)

编辑:问题是由于 mysql 列名区分大小写或不区分大小写,具体取决于操作系统。 (reference)

【讨论】:

非常感谢你,我什至没有想到它会在旧版本中逃脱:) 随心所欲地调用它,'$this->class' 硬编码确实有问题,它解决了我的问题,得想办法解决。 有趣。因此,由于某种原因,较旧的 PHP 没有将 $this->class 识别为类属性。您可以尝试$this->class 或字符串连接。 不,找到了真正的问题...为混乱道歉...似乎较新版本的 php 或 mysql(不完全确定哪个)不会对区分大小写大惊小怪。看起来 $this->class 正在返回一个大写的类(用户),而表是小写的(用户)。很抱歉给您带来不便,再次感谢您部分帮助我解决问题:)【参考方案2】:

你是大写/小写错误:

$STH = $core->dbh->prepare($query);
$sth = $STH->execute($array);

$sth 和 $STH 不一样

【讨论】:

感谢您的帮助,我的问题已经解决了,我的代码中也解决了这个问题 :) 谢谢您的意见!

以上是关于PDO->fetchAll() 在远程服务器上返回空数组的主要内容,如果未能解决你的问题,请参考以下文章

MySQL PDO fetchAll作为格式的数组

如何从PDO的fetchAll结果中获取列名?

PDO::fetchAll 与 PDO::fetch 循环

PDO fetchAll 数组到一维

使用 PDO 的 fetchAll 辅助函数

PDO 循环并打印 fetchAll