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

eas*_*der 2 php mysqli

致命错误:在线上的非对象上调用成员函数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>
Run Code Online (Sandbox Code Playgroud)

Pek*_*ica 8

罪魁祸首很可能就是这条线:

return new mysqli($host, $user, $pwd, $db) or die ('Cannot open database');
Run Code Online (Sandbox Code Playgroud)

do xyz or die()结构导致与return语句结合的有趣行为(即整个事物被解释为OR表达式,因为new mysqli永远不会是假的,所以"die"永远不会被处理.).在这里查看类似的案例.

改为:

$result = new mysqli($host, $user, $pwd, $db) ;
if (!$result) die (....);
return $result;
Run Code Online (Sandbox Code Playgroud)

此外,有点相关,我认为你永远不会捕获PDO连接错误,因为这:

return new PDO("mysql:host=$host;dbname=$db", $user, $pwd);
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

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

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

我不知道谷歌是否会缓存或索引我的帖子,但它可能会帮助那些正在学习本书的人,发现代码示例存在缺陷,而且在编写时,错误未在错误列表中列出.出版商网站.