PDO do PHP. número de erro ‘00000’ quando a consulta está correta

Eu tenho o código abaixo:

$sql3 = "update news set date='$time' where id='2'"; $sql3 = $connect->exec($sql3); if(!$sql3) { print_r($connect->errorInfo()); $error = $connect->errorInfo(); die ("Error: (".$error[0].':'.$error[1].') '.$error[2]); } 

Quando eu executo o script, às vezes eu recebo o número de erro ‘00000’. Quero dizer, vai introduzir o IF . e é tudo random. saída (às vezes):

 Array ( [0] => 00000 [1] => [2] => ) 

O que devo fazer para corrigir esse problema?
PS: O script é executado corretamente toda vez.

O código de erro PDO 00000 significa que tudo funciona bem. A razão pela qual você está batendo no código de verificação de erros é que $sql3 está retornando 0 (nenhuma linha foi efetuada) e o PHP avalia isso para falso. Tente verificar explicitamente se há um return false;

 if($sql3 === false) 

Se o exec não atualizar nenhuma linha, ele retornará 0. Isso faz com que se (! $ Sql3) avalie para falso, você deve fazer isso em vez disso:

 if($sql3 === false){ } 

Na minha experiência, consultas gravemente formadas (erros de syntax) e consultas falhadas (por exemplo, uma INSERT que não inseriu nada) também podem retornar o código de erro 00000. É preciso prosseguir e tentar executar a consulta completa em seu console SQL e ver por que falhou. Eu realmente não sei por que a mensagem de erro correta não é devolvida. Aqui está um trecho do código que usamos

  $r = $pdo->prepare($sql); if (!$r->execute($input_parameters)) { # query failed if ($bLogFailures) { error_log('query failed: ERROR['.$pdo->errorCode().':'.print_r($pdo->errorInfo(), true).'] QUERY['.$sql.']'); } return false; } 

00000 significa que funciona bem. Você deve mudar seu se para isso: $sql3 === false .

Acabei de ter uma situação semelhante no meu projeto php – ocorreu que a exceção PDO com código de erro ‘00000’ ocorreu quando tentei inserir linha com um campo definido como NULL enquanto a coluna que define o campo no database era do tipo ENUM('0', '1') e restrição NOT NULL . Depois de modificar o script PHP para colocar ‘0’ em vez de NULL , o erro pereceu.


Uma codificação adicional trouxe mais luz para a situação – eu estava executando mais de uma declaração PDO dentro de uma transação DB, mas verificando erros (no bloco de exception handling) baseando-se apenas na primeira declaração PDO executada enquanto ocorreu um erro real na terceira declaração DOP.

Eu tive o mesmo problema. Também me torturou muito, mas finalmente descobri.

Suponha que você tenha 7 colunas na sua tabela.

Você está inserindo dados em 4 deles.

Se, para as restantes 3 colunas, o valor padrão não estiver definido (diga NULL for alpha-numeric columns, CURRENT_TIMESTAMP for date-time related columns etc. ), então o problema acima indicado ocorre.

Se você estiver inserindo dados em todas essas 7 colunas ou pelo menos nas colunas para as quais o valor padrão não está definido , você não receberá nenhum erro e os dados serão inseridos.

A instrução PDO :: exec retorna um número inteiro para indicar o número de linhas que foram afetadas. Então, em seu caso particular, como o SomeKittens indica, se 0 linhas foram afetadas, seu código de erro seria acionado.

No entanto, se você estiver preocupado se a sua consulta funcionou, sua melhor ação pode ser usar a consulta DOP :: (em termos de seu código ($ returnObj = $ connect-> query ($ sql3) em vez de PDO :: exec.

O $ returnObj pode então ser verificado para ver se houve um erro na execução do SQL, e você pode então solucionar problemas da sua consulta SQL porque ele irá dizer-lhe qual foi o erro e onde ele estava localizado.

Sua melhor aposta para fazer isso seria:

 //set PDO to throw an error so you can wrap the query in a try / catch block. $connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql3 = "update news set date='$time' where id='2'"; try { $returnObj = $connect->query($sql3); } catch (PDOException $e) { print_r($returnOjb->errorInfo()); $error = $returnObj->errorInfo(); die ("Error: (".$error[0].':'.$error[1].') '.$error[2]); }