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

时间:2011-01-08 12:15:48

标签: mysqli php

致命错误:在线上的非对象上调用成员函数query(): $ result = $ conn-> query($ sql)或die(mysqli_error());

谁知道什么是错的以及如何解决?

<?php
function dbConnect($usertype, $connectionType = 'mysqli') {
  $host = 'localhost';
  $db = 'phpsols';
  if ($usertype  == 'read') {
    $user = 'psread';
    $pwd = '123';
  } elseif ($usertype == 'write') {
    $user = 'pswrite';
    $pwd = '123';
  } else {
    exit('Unrecognized connection type');
  }
  if ($connectionType == 'mysqli') {
    return new mysqli($host, $user, $pwd, $db) or die ('Cannot open database');
  } else {
    try {
      return new PDO("mysql:host=$host;dbname=$db", $user, $pwd);
    } catch (PDOException $e) {
      echo 'Cannot connect to database';
      exit;
    }
  }
}

// connect to MySQL
$conn = dbConnect('read');
// prepare the SQL query
$sql = 'SELECT * FROM images';
// submit the query and capture the result
**$result = $conn->query($sql) or die(mysqli_error());**
// find out how many records were retrieved
$numRows = $result->num_rows;
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Connecting with MySQLi</title>
</head>

<body>
<p>A total of <?php echo $numRows; ?> records were found.</p>
</body>
</html>

2 个答案:

答案 0 :(得分:8)

罪魁祸首很可能是这一行:

return new mysqli($host, $user, $pwd, $db) or die ('Cannot open database');

do xyz or die()构造导致与return语句结合的有趣行为(即整个事物被解释为OR表达式,因为new mysqli永远不会是假的,“死亡“永远不会被处理。”查看类似案例here

请改为:

$result = new mysqli($host, $user, $pwd, $db) ;
if (!$result) die (....);
return $result;

另外,稍微相关,我认为你永远不会捕获PDO连接错误,因为:

return new PDO("mysql:host=$host;dbname=$db", $user, $pwd);

始终退出该功能,并且永远不会到达catch块。与实际问题一样,解决方案是首先将对象传递给$result变量。

答案 1 :(得分:5)

我知道这已经得到了解答,但只想加上我自己的2美分......

我正在谷歌搜索“返回新的mysqli”来解决这个问题。该代码是电子书的一个片段(PHP解决方案。动态网页设计轻松。) - 第二版,如果我不是太错了!具有讽刺意味的是,本书应该教授PHP基础知识(在这种情况下是数据库连接方法)给像我这样的穷人和easyrider。我的理解非常有限,因为本书是我自己对PHP编码的介绍,但我设法说明创建或者实例化实际对象,将其传递给临时变量然后返回该变量就是解决方案。

令人讨厌的是,这在所述出版物的第一版中得到了正确证明。

我不知道Google是否会对我的帖子进行缓存或编制索引,但它可能会帮助其他从该书中学习的人发现代码示例存在缺陷,而且在撰写本文时,错误未列在出版商网站上的勘误表。