Как получить информацию об ошибках 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, и результат в порядке.
2 ответа
Прежде всего, всегда используйте эту строку, прежде чем 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 может сделать это лучше, намного лучше.
Я не думаю, что вы создали объект.
$ mysqli = new mysqli ('localhost', 'my_user', 'my_password', 'world');
но я действительно рекомендую вместо этого использовать PDO.