【问题标题】:Error calling member function "FETCH_ASSOC" - what is wrong with my code?调用成员函数“FETCH_ASSOC”时出错 - 我的代码有什么问题?
【发布时间】:2012-12-27 09:59:30
【问题描述】:

我正在尝试连接到一个 PHP PDO 并对数据运行一个简单的查询,但我遇到了关于未创建对象的错误?我正在尝试使这尽可能简单,并被建议不要创建单例数据库类,而是在需要时定义数据库 PDO,这是针对此初始(简单)查询的。

这是我得到的错误。我需要做什么来修复代码?

致命错误:在第 11 行调用非对象 in/home/...index.php 上的成员函数 fetch()

<?php

$dbhost = "localhost";
$dbname = "x";
$dbuser = "y";
$dbpass = "z";

$db = new PDO("mysql:host=$dbhost;db_name=$dbname", $dbuser, $dbpass);
$query = $db->query("SELECT * FROM tablename");

while ($row = $query->fetch(PDO::FETCH_ASSOC)){
    echo $row['field_name'],'<br>';
}
?>

如果您有更好的方法来使用 php 从 mysql 表中选择数据,请告诉我。试图学习 PDO 而不是 mysqli。谢谢

【问题讨论】:

    标签: php pdo


    【解决方案1】:

    您必须在-&gt;query-&gt;fetch 之间进行选择。你不能混合使用这两种方法

    -&gt;query():

        $sql = 'SELECT * FROM tablename';
        foreach ($db->query($sql) as $row) {
            echo $row['field_name'],'<br>';
        }
    

    -&gt;fetch():

    $sth = $db->prepare("SELECT * FROM tablename");
    $sth->execute();
    
    while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
        echo $row['field_name'],'<br>';
    }
    

    【讨论】:

    • 我认为也可以从 query() (php.net/manual/en/pdo.query.php) 中获取 PDOStatement,然后在其上调用 fetch() (php.net/manual/en/pdostatement.fetch.php)。
    • 谢谢。 “PDO::FETCH_ASSOC”有什么问题?为什么我必须使用 PDO::FETCH_NUM 和 FETCH_ORI_NEXT 而不是 "PDO::FETCH_ASSOC" ?
    • Num 将返回一个带有数字键的数组,而 assoc 将返回一个以列名作为键的数组。这只是一个例子。你当然可以使用 assoc。
    • @j0k 我想使用 fetch->() 方法,因为它使用了 PDO 语句(这是我想要学习的)但是我在你的“while 循环”中不明白“你用过 $stmt 吗?不应该是$sth吗?谢谢
    【解决方案2】:

    查询可能有问题,比如拼写错误或表不存在。

    那么$query不是PDOStatement而是false,你不能调用false-&gt;fetch()

    【讨论】:

    • 我可以让 $query 成为 PDOStatement 吗?如果可以,怎么做?
    • 发出正确的 SQL 查询。 :) 在 query() 调用之后尝试var_dump($db-&gt;errorInfo());
    【解决方案3】:

    这是你的错字:

    $db = new PDO("mysql:host=$dbhost;db_name=$dbname", $dbuser, $dbpass);
    

    应该是:

    $db = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
    

    修正错字后,这段代码完美运行:

    $db = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
    
    $query = $db->query("SELECT * FROM wp_blogs");
    
    while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
        var_dump($row).'<br>';
    }
    

    【讨论】:

    • 好眼力!这是一个语法错误,但我仍然有同样的错误...:/事实上 $query 不是 PDOStatement ...我必须使用 fetch。
    猜你喜欢
    • 2018-06-16
    • 2016-01-04
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多