/ / Як отримати інформацію про помилки MySQLi в різних середовищах - php, mysqli, приготований оператор, середовище, повідомлення про помилки

Як отримати інформацію про помилку MySQLi в різних середовищах - php, mysqli, prepared-statement, environment, reporting errors

У моєму локальному / розробницькому середовищі запит 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 і результат OK.

Відповіді:

63 для відповіді № 1

Перш за все, завжди маєте цю лінію перед підключенням MySQLi все ваших середовищ:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

Після цього всі помилки MySQL будуть переданів PHP винятки. Невимовлене виключення, у свою чергу, робить фатальну помилку PHP. Таким чином, у випадку помилки MySQL, ви отримаєте звичайну помилку PHP. Це миттєво дасть вам знати про причину помилки.

Зверніть увагу, що ви повинні мати можливість бачити Помилки PHP в цілому. І тут дійсно йде справа різних середовищ:

  • На живому сайті ви повинні заглянути в журнали помилок, отже, параметри повинні бути

    error_reporting(E_ALL);
    ini_set("display_errors", 0);
    ini_set("log_errors", 1);
    
  • У той час як на локальному сервері розвитку це нормально, щоб зробити помилки на екрані:

    error_reporting(E_ALL);
    ini_set("display_errors", 1);
    

І невеликий список того, що ви не повинен:

  • Використовуйте оператор придушення помилок (@)
  • Використовуйте die() або echo або будь-яку іншу функцію для безумовного друку повідомлення про помилку. PHP може вже відреагувати, ніяка допомога не потрібна.
  • Тестування результату запиту вручну (наприклад, if($result)) просто не має сенсу. Або ваш запит не вдався, і ви вже отримаєте виняток помилки, або все було в порядку і нічого не перевіряти.
  • Використовуйте try..catch для відображення повідомлення про помилку. Знову ж таки, PHP може зробити це краще, краще.