Php &引用;致命错误:对非对象调用成员函数fetch_assoc();使用PDO时

Php &引用;致命错误:对非对象调用成员函数fetch_assoc();使用PDO时,php,pdo,Php,Pdo,如何解决以下错误 致命错误:对非对象调用成员函数fetch_assoc() 在index.php的第27行调用堆栈中:0.0000 644064 1。{main}() php:0 这是我目前正在运行的代码: $sql = 'SELECT * FROM pm_user WHERE name='.$_SESSION['pmname'].''; $result = $pdo->query($sql); $row = $result->fetch_assoc(); // line 27 ec

如何解决以下错误

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

这是我目前正在运行的代码:

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

提前感谢

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

// 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 :(';
}

另外,在开发过程中,应该考虑设置phpini指令<代码> DePysOrthReals= 1 ,以查看PHP错误消息而不是“白色屏幕”。您还可以使用以下代码行按脚本启用它:

ini_set('display_errors', 1);
问题是:

  • 您正在查询中插入一个值。 这是错误的。您应该使用PDO的prepared statements特性

  • 在执行此错误插值的过程中,您忘记添加字符串引号,使SQL查询无效

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


修复所有这些问题。

嗯。我不能像过去两年那样将此标记为重复,因为“标记为重复”系统已被打破。无论如何,请在发布问题之前进行搜索。这个问题已经被回答了数十万次。还有,你到底为什么要使用PDO而不是预先准备好的语句?为什么要使用PDO然后插入一个变量?这真是太傻了。@LightnessRacesinOrbit我使用qoute()(在本例中)来保持简单,但至少提到了SQL注入的风险。您能告诉我在哪种情况下quote()比预先准备好的语句更不安全吗?
->quote()
如果连接字符集正确就足够了。然而,正如它所说的那样,quote还添加了SQL字符串的单引号本身,因此围绕插值变量的手动引号是多余的/会导致错误。@mario yepp,你是对的。我只是不喜欢这个愚蠢的10000次回答:“在所有mysql相关的数据库上使用准备好的语句”questions@hek2mgl当前位置相信我,我不喜欢这是第10000个必须写的问题。为什么人们还没有阅读和学习呢?然后我们就可以停下来了。我真的不喜欢这样的回答:“使用准备好的语句,不要使用mysql扩展,你的问题的答案。。。ähmmmm。不太重要的是,@hek2mgl:很抱歉你“不喜欢”它,但无论如何,到目前为止,最重要的是我们继续努力阻止大量危险的错误代码流到互联网上。在未来的十分钟里,许多人在未来几十年内的需求超过了“玛土撒拉”的需求。非常如此。