У меня есть код:PDO errorinfo не возвращается информация
$stmt = $db->prepare(" bla bla ");
$stmt->execute();
print_r($db->errorInfo());
Это возвращает: Array ([0] => 00000 [1] => [2] =>)
Почему не возвращается информация об ошибке?
У меня есть код:PDO errorinfo не возвращается информация
$stmt = $db->prepare(" bla bla ");
$stmt->execute();
print_r($db->errorInfo());
Это возвращает: Array ([0] => 00000 [1] => [2] =>)
Почему не возвращается информация об ошибке?
SQLSTATE 00000 означает «Успех». Согласно PHP documentation:
Если код ошибки SQLSTATE не установлен или нет ошибки водителя конкретного, элементы следующего элемента 0 будут установлены в NULL.
Да, это проблема. –
следующие сообщения об ошибках, правильно:
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
if (($stmt = $dbh->prepare(" bla bla ")) === false) {
print_r($dbh->errorInfo());
}
if ($stmt->execute() === false) {
print_r($stmt->errorInfo());
}
Примечание в выше, что ошибки разбора, вызванные во время prepare()
сообщается против $dbh
. Если даже prepare()
преуспевает, то execute()
может вызвать ошибку, но эта ошибка указана в отношении $stmt
.
В тесте выше, я сразу же получил сообщение об ошибке после prepare()
:
Array
(
[0] => 42000
[1] => 1064
[2] => You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right
syntax to use near 'bla bla' at line 1
)
Но такое поведение меняется, если вы используете эмулировать готовит.
При включении этого атрибута prepare()
практически не работает. Он просто сохраняет строку запроса в $ stmt, а затем фактическая подготовка инструкции задерживается до тех пор, пока вы не вызовете execute()
. Таким образом, ошибка, если таковая имеется, сообщается с $stmt
, происходит ли это во время подготовки или во время выполнения.
Я испытал изменение линии ошибок отчетности следующим образом:
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
// prepare won't report SQL errors, it's virtually a no-op.
if (($stmt = $dbh->prepare(" bla bla ")) === false) {
print_r($dbh->errorInfo());
}
// execute will report errors of parsing or execution.
if ($stmt->execute() === false) {
print_r($stmt->errorInfo());
}
В этом случае, не было никаких сообщений об ошибке в prepare()
, и, но я получил ту же ошибку, как указано выше в execute()
. Опять же, вы должны изучить $stmt
, чтобы получить сообщение об ошибке после execute()
.
Вы пробовали 'print_r ($ stmt-> errorInfo());'? – andrewsi
Я не знаю, почему это не так, но в любом случае Исключения лучше. [Ошибка запроса PDO, но я не вижу ошибок. Как получить сообщение об ошибке из PDO?] (Http://stackoverflow.com/a/15990858/285587) –