2013-07-09 6 views
1

У меня есть код:PDO errorinfo не возвращается информация

$stmt = $db->prepare(" bla bla "); 
$stmt->execute(); 
print_r($db->errorInfo()); 

Это возвращает: Array ([0] => 00000 [1] => [2] =>)

Почему не возвращается информация об ошибке?

+4

Вы пробовали 'print_r ($ stmt-> errorInfo());'? – andrewsi

+0

Я не знаю, почему это не так, но в любом случае Исключения лучше. [Ошибка запроса PDO, но я не вижу ошибок. Как получить сообщение об ошибке из PDO?] (Http://stackoverflow.com/a/15990858/285587) –

ответ

-1

SQLSTATE 00000 означает «Успех». Согласно PHP documentation:

Если код ошибки SQLSTATE не установлен или нет ошибки водителя конкретного, элементы следующего элемента 0 будут установлены в NULL.

+0

Да, это проблема. –

3

следующие сообщения об ошибках, правильно:

$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().

Смежные вопросы