致命错误:在线上的非对象上调用成员函数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>
答案 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是否会对我的帖子进行缓存或编制索引,但它可能会帮助其他从该书中学习的人发现代码示例存在缺陷,而且在撰写本文时,错误未列在出版商网站上的勘误表。