Неустранимая ошибка: вызов функции-функции-члена () для не-объекта в строке: $ 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>
Вероятнее всего, виновник этой линии:
return new mysqli($host, $user, $pwd, $db) or die ('Cannot open database');
Конструкция do xyz or die()
приводит к смешному поведению в сочетании с оператором return
(т. Е. Вся вещь интерпретируется как выражение OR, и поскольку new mysqli
никогда не будет ложным, «die» никогда не обрабатывается.). См. Аналогичный случай здесь .
Сделайте это вместо этого:
$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
сначала.
Я знаю, что на это ответили, но просто хотел добавить свои собственные 2 цента.
Я искал «вернуть новый mysqli», чтобы исправить эту проблему. Код – это фрагмент из электронной книги (PHP Solutions. Dynamic Web Design Made Easy.) – 2-е издание, если я не ошибаюсь! Как ни странно, книга должна преподавать основы PHP (в данном случае методы подключения DB) к бедным душам, таким как я и easyrider. У меня очень ограниченное понимание, так как эта книга является моим собственным введением в PHP-кодирование, но мне удалось понять, что создание или, скорее, создание реального объекта, передача его во временную переменную, а затем возвращение этой переменной было решением.
Досадно, это было правильно продемонстрировано в первом издании указанной публикации.
Я не знаю, будет ли Google кэшировать или индексировать мой пост, но он может помочь другим, которые учатся в книге, обнаружить, что пример кода ошибочен, а в качестве времени записи ошибка не указана в исправлениях на издателей.