致命错误:在非对象上调用成员函数 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()