Каждый раз, когда вы получаете ...
"Предупреждение: mysqli_fetch_object () ожидает, что параметр 1 будет mysqli_result, логическое значение задано"
... вероятно, потому что есть проблема с вашим запросом. prepare()
или query()
может возвращать FALSE
(логическое значение), но это общее сообщение об ошибке не оставляет вас на пути подсказок. Как вы узнаете, что не так с вашим запросом? Вы спрашиваете !
Прежде всего, убедитесь, что отчеты об ошибках включены и видимы: добавьте эти две строки в начало файла (ов) сразу после открытия тега <?php
:
error_reporting(E_ALL);
ini_set('display_errors', 1);
Если ваше сообщение об ошибке установлено в php.ini, вам не придется об этом беспокоиться. Просто убедитесь, что вы корректно обрабатываете ошибки и никогда не раскрываете истинную причину каких-либо проблем для ваших пользователей. Раскрытие истинной причины для общественности может быть приглашением с золотой гравировкой для тех, кто хочет навредить вашим сайтам и серверам. Если вы не хотите отправлять ошибки в браузер, вы всегда можете отслеживать журналы ошибок вашего веб-сервера. Расположение журналов будет варьироваться от сервера к серверу, например, в Ubuntu журнал ошибок обычно находится в /var/log/apache2/error.log
. Если вы просматриваете журналы ошибок в среде Linux, вы можете использовать tail -f /path/to/log
в окне консоли, чтобы увидеть ошибки по мере их появления в режиме реального времени .... или по мере их возникновения.
Как только вы возьметесь за рамки стандартных отчетов об ошибках, добавив проверку ошибок в вашем соединении с базой данных и запросах, вы получите гораздо более подробную информацию о возникающих проблемах. Посмотрите на этот пример, где имя столбца неверно. Во-первых, код, который возвращает общее сообщение о фатальной ошибке:
$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();
Ошибка является общей и не очень полезна для решения происходящего.
С помощью пары строк кода вы можете получить очень подробную информацию, которую можно использовать для немедленного решения проблемы . Проверьте правильность заявления prepare()
и, если оно хорошо, вы можете перейти к обязательному исполнению и выполнению.
$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();
// any additional code you need would go here.
} else {
$error = $mysqli->errno . ' ' . $mysqli->error;
echo $error; // 1054 Unknown column 'foo' in 'field list'
}
Если что-то не так, вы можете выдать сообщение об ошибке, которое приведет вас непосредственно к проблеме. В этом случае в таблице нет столбца foo
, решение проблемы тривиально.
При желании вы можете включить эту проверку в функцию или класс и расширить ее, корректно обработав ошибки, как упоминалось ранее.