mysqli_fetch_assoc() ожидает ошибок параметра / вызова функции-члена bind_param (). Как получить фактическую ошибку mysql и исправить ее?

#php #mysql #mysqli

Вопрос:

В моей локальной среде/среде разработки запрос 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, и результат в порядке.

Комментарии:

1. Можем мы посмотреть, где вы инициируете $mysqli переменную ?

2. Возможно, вашему пользователю MySQL не хватает привилегий для выполнения SELECT запроса. Вы это проверили?

3. Что приходит на ум, так это то, что mysqli недоступен или вы указали неверные учетные данные для подключения к MySQL.

4. Я знаю, что этот пост действительно старый. Просто решил добавить комментарий. У меня была точно такая же ошибка, и проблема заключалась всего в одной орфографической ошибке имени поля в базе данных. Как только я это исправил, все заработало. Немного глупо, но все равно.

Ответ №1:

Иногда ваш код MySQLi выдает ошибку, подобную mysqli_fetch_assoc() expects parameter... Call to a member function bind_param()... или аналогичную. Или даже без каких-либо ошибок, но запрос все равно не работает. Это означает, что ваш запрос не удалось выполнить.

Каждый раз, когда запрос завершается неудачно, MySQL выдает сообщение об ошибке, объясняющее причину. К сожалению, по умолчанию такие ошибки не передаются в PHP, и все, что у вас есть, — это загадочное сообщение об ошибке, упомянутое выше. Следовательно, очень важно настроить PHP и MySQLi, чтобы сообщать вам об ошибках MySQL. И как только вы получите сообщение об ошибке, исправить это будет проще простого.

Как получить сообщение об ошибке в MySQLi?

Прежде всего, всегда имейте эту строку перед подключением MySQLi во всех ваших средах:

 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
 

После этого все ошибки MySQL будут перенесены в исключения PHP. Неучтенное исключение, в свою очередь, приводит к фатальной ошибке PHP. Таким образом, в случае ошибки MySQL вы получите обычную ошибку PHP. Это мгновенно сообщит вам о причине ошибки. И трассировка стека приведет вас к точному месту, где произошла ошибка.

Как настроить PHP в разных средах

Вот суть моей статьи об отчетах об ошибках PHP:
отчеты об ошибках на серверах разработки и живых серверах должны отличаться. На сервере разработки удобно, чтобы ошибки отображались на экране, но на реальном сервере сообщения об ошибках должны регистрироваться вместо этого, чтобы вы могли найти их в журнале ошибок позже.

Поэтому необходимо установить для соответствующих параметров конфигурации следующие значения:

  • На сервере разработки
    • error_reporting должно быть установлено E_ALL значение;
    • log_errors должно быть установлено значение 1 (также удобно иметь журналы на компьютере разработчика)
    • display_errors должно быть установлено значение 1
  • На рабочем сервере
    • error_reporting должно быть установлено E_ALL значение;
    • log_errors должно быть установлено значение 1
    • display_errors должно быть установлено значение 0

Как на самом деле его использовать?

Просто удалите любой код, который проверяет наличие ошибки вручную , все это or die() if ($result) и тому подобное. Просто напишите свой код взаимодействия с базой данных прямо сейчас:

 $stmt = $this->con->prepare("INSERT INTO table(name, quantity) VALUES (?,?)");
$stmt->bind_param("si", $name, $quantity);
$stmt->execute();
 

опять же, без каких-либо условий вокруг. Если произойдет ошибка, она будет рассматриваться как любая другая ошибка в вашем коде. Например, на компьютере разработчика он будет просто отображаться на экране, в то время как на живом сайте он будет зарегистрирован для программиста, тогда как для удобства пользователя вы можете использовать обработчик ошибок (но это другая история, которая не по теме для MySQLi, но вы можете прочитать об этом в статье, приведенной выше).

Что делать с полученным сообщением об ошибке?

Прежде всего, вы должны найти проблемный запрос. Сообщение об ошибке содержит имя файла и номер строки точного места, где произошла ошибка. Для простого кода этого достаточно, но если в вашем коде используются функции или классы, вам может потребоваться следовать трассировке стека, чтобы найти проблемный запрос.

После получения сообщения об ошибке вы должны прочитать и понять его. Это звучит слишком очевидно, если не сказать снисходительно, но учащиеся часто упускают из виду тот факт, что сообщение об ошибке является не просто сигналом тревоги, но на самом деле содержит подробное объяснение проблемы. И все, что вам нужно, это прочитать сообщение об ошибке и устранить проблему.

  • Скажем, если там написано, что определенной таблицы не существует, вы должны проверить орфографию, опечатки, регистр букв. Кроме того, вы должны убедиться, что ваш PHP-скрипт подключается к правильной базе данных
  • Или, если в нем говорится, что в синтаксисе SQL есть ошибка, вам необходимо изучить свой SQL. И проблемное место находится прямо перед частью запроса, указанной в сообщении об ошибке.

Если вы не понимаете сообщение об ошибке, попробуйте поискать его в Google. И при просмотре результатов придерживайтесь ответов, которые объясняют ошибку, а не прямо дают решение. Решение может не сработать в вашем конкретном случае, но объяснение поможет вам понять проблему и позволит вам решить ее самостоятельно.

Вы также должны доверять сообщению об ошибке. Если в нем говорится, что количество токенов не совпадает с количеством связанных переменных, то это так. То же самое касается отсутствующих таблиц или столбцов. Учитывая выбор, является ли это вашей собственной ошибкой или сообщение об ошибке неправильным, всегда придерживайтесь первого. Опять же, это звучит снисходительно, но сотни вопросов на этом самом сайте доказывают, что этот совет чрезвычайно полезен.

Список вещей, которые вы никогда не должны делать в отношении отчетов об ошибках

  • Никогда не используйте оператор подавления ошибок ( @ )! Это делает программиста неспособным прочитать сообщение об ошибке и, следовательно, не может исправить ошибку
  • Не используйте die() или echo или любую другую функцию для безусловной печати сообщения об ошибке на экране. PHP может сам сообщать об ошибках и делать это правильно в зависимости от среды — так что просто оставьте это для PHP.
  • Не добавляйте условие для проверки результата запроса вручную (например if($result) ). При включенных исключениях ошибок такое условие будет просто бесполезно.
  • Не используйте try..catch оператор для повторения сообщения об ошибке. Этот оператор следует использовать для выполнения некоторой обработки ошибок, например отката транзакции. Но никогда не используйте его только для сообщения об ошибках — как мы узнали выше, PHP уже может делать это правильным способом.

P.S.
Иногда ошибки нет, но и результатов тоже нет. Тогда это означает, что в базе данных нет данных, соответствующих вашим критериям. В этом случае вы должны признать этот факт, даже если вы можете поклясться, что данные и критерии в порядке. Это не так. Вы должны проверить их еще раз. У меня есть статья, которая может помочь в этом вопросе, как отлаживать взаимодействия с базой данных. Хотя он написан для PDO, но принцип тот же. Просто следуйте этой инструкции шаг за шагом и либо решите свою проблему, либо ответьте на вопрос о переполнении стека.

Комментарии:

1. @AdamWinter использование @ всегда неправильно, и в данном конкретном случае в десять раз. Сообщения об ошибках в вашей программе-это то же самое, что боль в вашем теле. Это говорит вам, что что-то не так, например, у вас сломана нога. И вы должны исправить ногу, а не просто принять обезболивающее и идти дальше. тоже самое. PHP сообщает вам, что нет никакой переменной, которую вы ожидаете. Поэтому вам нужно исправить форму или что-то еще, чтобы сделать эту переменную доступной. Не просто напишите код, чтобы обойти ошибку.

2. По большей части я согласен, однако с «Вашим здравым смыслом» я не согласен, «Не просто пишите код, чтобы обойти ошибку», что, по-вашему, делает try…catch, он обходит ошибку, чтобы предотвратить неконтролируемый выход из базы кода, некоторые ошибки, которые вы не можете исправить в коде, например, сервер БД исчез, вам просто нужно управлять ошибкой и обойти ошибку, чтобы получить действительный результат.

3. @Barkermn01 это ваша настоящая забота, но вы делаете из этого неправильные выводы. Конечно, ваше приложение должно выдавать действительный результат (который в случае ошибки «Mysql исчез» должен быть общей страницей ошибок 500). Но вы должны понимать, что такой действительный результат не относится к вашему коду базы данных. Ваш код, связанный с базой данных, должен работать с базой данных. В то время как отображение страницы с ошибкой должно быть связано с другим кодом. Смотрите здесь: phpdelusions.net/articles/error_reporting

4. я понимаю, что это были просто такие вещи, как «Но никогда не используйте его только для сообщения об ошибках», это как бы исключает полностью объективные кодовые базы, например, мой MVC, если мои модели сталкиваются с ошибкой, им нужно обработать ошибку, а затем вернуть ее обратно, чтобы мой контроллер, в котором используется модель, мог справиться с ошибкой и представить ошибку, в этом случае я использую это API, поэтому ошибка и вся информация о трассировке отправляются вызов API, если он пришел из нашей удаленной системы (проверка происхождения), так как сейчас много веб-материалов, которые

5. «Неперехваченное исключение, в свою очередь, приводит к фатальной ошибке PHP» Является ли причиной фатальной ошибки хорошей идеей на рабочем сервере (для ошибок mysql)? Разве не существует нескольких ситуаций, когда ошибка указывает на проблему, с которой ваш сценарий должен справиться, и продолжать, как он может; например, сообщить пользователю, что вы не можете предоставить ему эту информацию прямо сейчас, предупредив оператора о необходимости расследования? РЕДАКТИРОВАТЬ Я вижу, где нужно, вы пытаетесь..поймать ошибки mysql (которые вы преобразовали в ошибки php).