É porque
$pdo->errorInfo()
refere-se à última instrução que foi executada com sucesso. Desde $sql->execute()
retorna false, então ele não pode se referir a essa declaração (seja para nada ou para a consulta anterior). Por que
$sql->execute()
retorna false, não sei... ou há um problema com seu $params
array ou com sua conexão de banco de dados. Nota:O manual do PHP (http://php.net/manual/en/pdo .errorinfo.php ) não define exatamente o que significa "última operação no identificador do banco de dados", mas se houvesse um problema com os parâmetros de associação, esse erro teria ocorrido dentro do PDO e sem nenhuma interação com o banco de dados. É seguro dizer que se
$pdo->execute()
retorna true
, que $pdo->errorInfo()
é válido. Se $pdo->execute()
retorna false
, o comportamento de $pdo->errorInfo()
não está explicitamente claro na documentação. Se me lembro corretamente da minha experiência, execute retorna true
, mesmo se o MySQL retornar um erro, retornará false
se nenhuma operação foi feita. Como a documentação não é específica, pode ser específica do driver db. Esta resposta reflete a experiência prática de quando foi escrita em setembro de 2012. Como um usuário apontou, a documentação não reafirma explicitamente essa interpretação. Também pode refletir apenas a implementação do driver de banco de dados específico, mas deve ser sempre verdade que se
$pdo->execute()
retorna true
, que $pdo->errorInfo()
é válido. Você também pode definir PDO::ERRMODE_EXCEPTION em sua seqüência de conexão. O tratamento de exceção torna desnecessário verificar e consultar o erro.
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );