致命错误:在非对象上调用成员函数 fetchALL() - 在 Microsoft Access 数据库上使用 PDO

Posted

技术标签:

【中文标题】致命错误:在非对象上调用成员函数 fetchALL() - 在 Microsoft Access 数据库上使用 PDO【英文标题】:Fatal error: Call to a member function fetchALL() on a non-object - using PDO on a Microsoft Access Database 【发布时间】:2014-06-01 16:47:24 【问题描述】:

下午好!

我已经为 Microsoft Access 数据库创建了一个连接类(可以使用)。然而我的问题在于我试图使用这个类来执行一个简单的 SQL 语句,我收到错误消息:致命错误:调用非对象上的成员函数 fetchALL()。

我对 PDO 还很陌生,并且在网上阅读了很多文章,但无济于事。我想我理解我的问题,但并不完全,请有人能说明一下情况,并可能就我收到错误消息的原因提供答案吗?

connectionClass.php

class connection

      public $con;
      private $dbName;

      function __construct()
          $this->dbName = $_SERVER["DOCUMENT_ROOT"] . "\database\yakety1new.mdb";
       

      function connect()
          $this->con = new PDO("odbc:DRIVER=Microsoft Access Driver (*.mdb); DBQ=$this->dbName; Uid=Admin; Pwd=;");
          $this->con->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
          return $this->con;
            
      

      if (!ini_get('display_errors')) 
      ini_set('display_errors', '1');
      

testIndex.php

try
   include_once '\classes\connectionClass.php';


   $con = new connection();
   $pdoConnection = $con->connect();


   $sql = $pdoConnection->prepare("SELECT * FROM celebs");
   $result = $pdoConnection->exec($sql);
     while ($row = $result->fetchALL(PDO::FETCH_ASSOC)) 
       echo $row['firstname'];
       echo $row['surname'];
      
    catch (Exception $e)
       echo 'ERROR:'.$e->getMessage();
       file_put_contents('connection.errors.txt', $e->getMessage().PHP_EOL,FILE_APPEND);
       

       if (!ini_get('display_errors')) 
       ini_set('display_errors', '1');
      

错误信息与这一行有关:

while ($row = $result->fetchALL(PDO::FETCH_ASSOC)) 

非常感谢任何帮助,谢谢!

【问题讨论】:

【参考方案1】:

$result 只是一个布尔值,表示查询是否成功。 fetchAll 方法在PDOStatement 上,所以应该是:

while ($row = $sql->fetch(PDO::FETCH_ASSOC)) 

你也执行了错误的语句,应该是:

$result = $sql->execute();

您使用的方法是执行一个 SQL 字符串,而无需先准备它。你可以这样做:

$result = $pdoConnection->exec("SELECT * FROM celebs");
while ($row = $result->fetch(PDO::FETCH_ASSOC)) 

【讨论】:

谢谢!这已经消除了错误,但是,没有结果出现,我收到了这个警告:....警告:PDO::exec() 期望参数 1 是字符串,第 22 行中给出的对象 - 这是 - $result = $pdoConnection->exec($sql); 虽然只是一个警告,但它肯定还是应该显示我的sql语句的结果吗? 另外,我刚刚注意到你使用的是fetchAll,而你应该使用fetch 是的!非常感谢!...您先生,是一个传奇! 因为 fetchAll 一次返回所有行,但您使用的 while 循环仅将一行分配给 $row【参考方案2】:
ini_set('display_errors', '1');
include_once '\classes\connectionClass.php';
$con = new connection();
$pdoConnection = $con->connect();

$data = $pdoConnection->query("SELECT * FROM celebs")->fetchAll();
foreach ($data as $row) 
   echo $row['firstname'];
   echo $row['surname'];

这就是您需要的所有代码。

【讨论】:

以上是关于致命错误:在非对象上调用成员函数 fetchALL() - 在 Microsoft Access 数据库上使用 PDO的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:在非对象上调用成员函数 getLoginUrl()

致命错误:在非对象 cakephp 上调用成员函数 save()

PDO 致命错误:在非对象上调用成员函数 prepare()

致命错误:在非对象上调用成员函数 fetch_array()

Zend_Mail generateMessage() 导致致命错误:在非对象上调用成员函数 getContent()

FatalErrorException:错误:在非对象 symfony 上调用成员函数 has()