Традиционно PHP был терпим к плохой практике и ошибкам в коде, что делает отладку довольно сложной.Проблема в этом конкретном случае заключается в том, что оба mysqli и PDO по умолчанию не сообщают вам о сбое запроса и просто возвращают FALSE
.(Я не буду говорить об ограниченном расширении mysql . Поддержка подготовленных операторов является достаточной причиной для переключения на PDO или mysqli .) Но вы можете изменить стандартное поведение PHP, чтобы оно всегда выдавало исключений при сбое запроса.
Для PDO : использовать $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
error_reporting(E_ALL);
$pdo = new PDO("mysql:host=localhost;dbname=test", "test","");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$result = $pdo->query('select emal from users');
$data = $result->fetchAll();
Это покажет вам следующее:
Неустранимая ошибка: необработанное исключение 'PDOException' с сообщением 'SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец' emal 'в' списке полей'' в E: \ htdocs \ test \ mysql_errors \ pdo.php в строке 8
PDOException: SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец 'emal' в 'списке полей' в E: \htdocs \ test \ mysql_errors \ pdo.php в строке 8
Как видите, он точно говорит вам, что не так с запросом и где его исправить в коде.
Без $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
вы получите
Неустранимая ошибка: вызов функции-члена fetchAll () для логического значения в E: \ htdocs \ test \ mysql_errors \ pdo.php в строке 9
для mysqli : используйте mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
error_reporting(E_ALL);
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'test', '', 'test');
$result = $mysqli->query('select emal from users');
$data = $result->fetch_all();
Вы получите
Неустранимая ошибка: необработанное исключение «mysqli_sql_exception» с сообщением «Неизвестный столбец« emal »в« списке полей »в E: \ htdocs \ test \ mysql_errors \ mysqli.php в строке 8
mysqli_sql_exception: Неизвестный столбец 'emal' в 'списке полей' в E: \ htdocs \ test \ mysql_errors \ mysqli.php в строке 8
Без mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
вы получите только
Неустранимая ошибка: вызов функции-члена fetch_all () для логического значения в E: \ htdocs \ test \ mysql_errors \ mysqli.php в строке 10
Конечно, вы можете вручную проверить ошибки MySQL,Но я бы сошел с ума, если бы мне приходилось делать это каждый раз, когда я делал опечатку - или еще хуже - каждый раз, когда я хотел бы запросить базу данных.