В моей локальной среде / среде разработки запрос MySQLi выполняется нормально. Однако, когда я загружаю его в среду своего веб-хоста, я получаю эту ошибку:
Неустранимая ошибка: вызов функции-члена bind_param () для не-объекта в ...
Вот код:
global $mysqli;
$stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?");
$stmt->bind_param('i', $cur_id);
$stmt->execute();
$stmt->bind_result($uid, $desc);
Чтобы проверить свой запрос, я попытался выполнить его через панель управления phpMyAdmin, и результат в порядке.
$mysqli
переменную?SELECT
запроса. Вы это проверили?Ответы:
Иногда ваш MySQLi код выдает ошибку , как
mysqli_fetch_assoc() expects parameter...
,Call to a member function bind_param()...
или аналогичный. Или даже без ошибок, но запрос все равно не работает. Это означает, что ваш запрос не был выполнен.Каждый раз, когда запрос терпит неудачу, MySQL выдает сообщение об ошибке, объясняющее причину . К сожалению, по умолчанию такие ошибки не передаются в PHP, и все, что у вас есть, это загадочное сообщение об ошибке, упомянутое выше. Следовательно, очень важно настроить PHP и MySQLi так, чтобы они сообщали вам об ошибках MySQL. И как только вы получите сообщение об ошибке, исправить ее будет проще простого.
Как получить сообщение об ошибке в MySQLi?
Прежде всего, всегда имейте эту строку перед подключением MySQLi во всех ваших средах:
После этого все ошибки MySQL будут перенесены в исключения PHP. Неперехваченное исключение, в свою очередь, вызывает фатальную ошибку PHP. Таким образом, в случае ошибки MySQL вы получите обычную ошибку PHP. Это сразу же даст вам понять причину ошибки. А трассировка стека приведет вас к тому месту, где произошла ошибка.
Как настроить PHP в разных средах
Вот суть моей статьи об отчетах об ошибках PHP :
отчеты об ошибках на сервере разработки и на живых серверах должны отличаться. На сервере разработки удобно отображать ошибки на экране, но на реальном сервере сообщения об ошибках должны регистрироваться вместо этого, чтобы вы могли найти их в журнале ошибок позже.
Следовательно, вы должны установить для соответствующих параметров конфигурации следующие значения:
На сервере разработки
error_reporting
должно быть установленоE_ALL
значение;log_errors
должен быть установлен в 1 (логи удобно вести и на компьютере разработчика)display_errors
должен быть установлен на 1На производственном сервере
error_reporting
должно быть установленоE_ALL
значение;log_errors
должен быть установлен на 1display_errors
должен быть установлен на 0Как на самом деле это использовать?
Просто удалите код , который проверяет наличие ошибок вручную , все эти
or die()
,if ($result)
и подобные. Просто напишите код взаимодействия с базой данных прямо сейчас:опять же, без каких-либо условий вокруг . В случае возникновения ошибки она будет рассматриваться как любая другая ошибка в вашем коде. Например, на ПК для разработки он просто появится на экране, тогда как на действующем сайте он будет зарегистрирован для программиста, тогда как для удобства пользователя вы можете использовать обработчик ошибок (но это другая история, которая не по теме для MySQLi, но вы можете прочитать об этом в статье, указанной выше).
Что делать с появившимся сообщением об ошибке?
Прежде всего вам нужно найти проблемный запрос. Сообщение об ошибке содержит имя файла и номер строки точного места, где произошла ошибка. Для простого кода этого достаточно, но если ваш код использует функции или классы, вам может потребоваться проследить трассировку стека, чтобы найти проблемный запрос.
Получив сообщение об ошибке, вы должны прочитать и понять его. Это звучит слишком очевидно, если не снисходительно, но учащиеся часто упускают из виду тот факт, что сообщение об ошибке - это не просто сигнал тревоги, а фактически содержит подробное объяснение проблемы . И все, что вам нужно, это прочитать сообщение об ошибке и исправить проблему.
Если вы не понимаете сообщение об ошибке, попробуйте погуглить. И при просмотре результатов придерживайтесь ответов, которые объясняют ошибку, а не прямо дают решение. Решение может не сработать в вашем конкретном случае, но объяснение поможет вам понять проблему и поможет вам решить проблему самостоятельно.
Вы также должны доверять сообщению об ошибке. Если он говорит , что количество маркеров не совпадает с числом связанных переменных , то он является так. То же самое и с отсутствующими таблицами или столбцами. Если у вас есть выбор, будь то ваша собственная ошибка или сообщение об ошибке, всегда придерживайтесь первого варианта. Опять же, это звучит снисходительно, но сотни вопросов на этом самом сайте доказывают, что этот совет чрезвычайно полезен.
Список вещей, которые вы никогда не должны делать в отношении отчетов об ошибках
@
)! Из-за этого программист не может прочитать сообщение об ошибке и, следовательно, не может исправить ошибку.die()
илиecho
или любую другую функцию для вывода сообщения об ошибке на экран безоговорочно. PHP может сам сообщать об ошибках и делать это правильно, в зависимости от среды, поэтому оставьте это PHP.if($result)
). При включенных исключениях ошибок такое условие будет просто бесполезным.try..catch
оператор для вывода сообщения об ошибке. Этот оператор следует использовать для обработки ошибок, например отката транзакции. Но никогда не используйте его только для сообщения об ошибках - как мы узнали выше, PHP уже может делать это правильно.PS
Иногда ошибки нет, но и результатов нет. Тогда это означает, что в базе данных нет данных, соответствующих вашим критериям . В этом случае вы должны признать этот факт, даже если вы можете поклясться, что данные и критерии верны. Они не. Вы должны проверить их еще раз. У меня есть статья, которая может помочь в этом вопросе: Как отлаживать взаимодействия с базой данных . Хотя написано для PDO, но принцип тот же. Просто следуйте этой инструкции шаг за шагом, и либо ваша проблема будет решена, либо у вас появится ответный вопрос для Stack Overflow.
источник