【问题标题】:"Fatal error: Call to a member function fetch_assoc() on a non-object" when using PDO [closed]使用 PDO 时“致命错误:在非对象上调用成员函数 fetch_assoc()”[关闭]
【发布时间】:2013-02-01 23:43:27
【问题描述】:

如何解决以下错误?

致命错误:在非对象上调用成员函数 fetch_assoc() 在第 27 行的 index.php 中调用堆栈:0.0000 644064 1. {main}() index.php:0

这是我目前运行的代码:

$sql = 'SELECT * FROM pm_user WHERE name='.$_SESSION['pmname'].'';
$result = $pdo->query($sql);
$row = $result->fetch_assoc(); // line 27
echo $row['img'];

提前致谢

【问题讨论】:

  • 嗯。我不能像过去两年那样正确地将其标记为重复,因为“标记为重复”系统已被破坏。无论如何,请在发布问题之前进行搜索。这个问题已被回答 数十万次stackoverflow.com/questions/14656942/…
  • 另外,你到底为什么使用 PDO 而不是prepared statements

标签: php pdo


【解决方案1】:

问题是:

  • 您正在查询内部插入一个值。 这是错误的。您应该改用 PDO 的 prepared statements 功能。

  • 在做这个bad and wrong插值的过程中,你忘记添加字符串引号,导致你的SQL查询无效。

    李>
  • 您未能对->query() 进行任何错误检查;当query() 失败时,它返回FALSE,因此您尝试在FALSE 上执行->fetch()

解决所有这些问题。

【讨论】:

  • 我真的不喜欢首先告诉'使用准备好的语句,不要使用 mysql 扩展,你的问题的答案...... ähmmmm。不太重要'
  • @hek2mgl:很抱歉你“不喜欢”它,但无论如何,到目前为止,最重要的是我们继续努力阻止 reams 和大量危险的错误代码从流式传输到互联网。许多人在可能的几十年内的需求超过了 \@methusalah 在接下来的十分钟内的需求。大体如此。
【解决方案2】:

当您在程序中出现错误时,请检查您调用的所有函数的返回值

// use quote or prepared statements to prevent from 
// SQL injection attacks!
$pmname = $pdo->quote($_SESSION['pmname']);
$sql = "SELECT * FROM pm_user WHERE name=$pmname";

$result = $pdo->query($sql);
if($result === FALSE) {
    echo 'oops! the query failed! ';
    print_r($pdo->errorInfo());
}

$row = $result->fetch_assoc();

if($row) {
    echo $row['img'];
} else {
    echo 'the query return no records :(';
}

此外,您应该考虑设置 php.ini 指令 display_errors=1在开发过程中 以查看 php 错误消息而不是“白屏”。您还可以使用以下代码行为每个脚本启用它:

ini_set('display_errors', 1);

【讨论】:

  • 为什么要使用 PDO,然后插入一个变量?这真是愚蠢。
  • @LightnessRacesinOrbit 我使用 qoute()(在这个例子中)来保持简单,但至少提到了 SQL 注入的风险。你能告诉我在哪种情况下 quote() 不如准备好的语句安全吗?
  • 如果连接字符集正确,->quote() 就足够了。但是,quote - 正如它所说的那样 - 本身也会添加 SQL 字符串的单引号,因此插值变量周围的手动引号是多余的 / 会导致错误。
  • @mario yepp,你是对的。我只是不喜欢这个愚蠢的 10000 答案:在所有与 mysql 相关的问题上使用准备好的语句
  • @hek2mgl:相信我,我不喜欢这是必须写的第 10,000 个问题。为什么人们不会阅读学习?然后我们就可以停下来了。
猜你喜欢
  • 2016-08-30
  • 2012-09-26
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多