41 votes

Message d'erreur

Voici un extrait de mon code :

 $qry = '
    INSERT INTO non-existant-table (id, score) 
    SELECT id, 40 
    FROM another-non-existant-table
    WHERE description LIKE "%:search_string%"
    AND available = "yes"
    ON DUPLICATE KEY UPDATE score = score + 40
';
$sth = $this->pdo->prepare($qry);
$sth->execute($data);

print_r($this->pdo->errorInfo());

Cela devrait me donner une erreur car les tables n'existent même pas. Tout ce que j'obtiens cependant c'est ceci :

Tableau ( [0] => 00000 )

Comment puis-je obtenir une meilleure description de l'erreur afin de pouvoir déboguer le problème ?

104voto

Alan Geleynse Points 11842

Essayez plutôt ceci :

 print_r($sth->errorInfo());

Ajoutez ceci avant de préparer :

 $this->pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );

Cela changera le type de rapport d'erreur PDO et provoquera l'émission d'un avertissement chaque fois qu'il y a une erreur PDO. Cela devrait vous aider à le retrouver, bien que votre errorInfo ait dû être défini.

7voto

LukeKM7 Points 16

Vieux fil, mais peut-être que ma réponse aidera quelqu'un. J'ai résolu en exécutant d'abord la requête, puis en définissant une variable d'erreurs, puis en vérifiant si ce tableau de variables d'erreurs est vide. voir exemple simplifié :

 $field1 = 'foo';
$field2 = 'bar';

$insert_QUERY = $db->prepare("INSERT INTO table bogus(field1, field2) VALUES (:field1, :field2)");
$insert_QUERY->bindParam(':field1', $field1);
$insert_QUERY->bindParam(':field2', $field2);

$insert_QUERY->execute();

$databaseErrors = $insert_QUERY->errorInfo();

if( !empty($databaseErrors) ){  
    $errorInfo = print_r($databaseErrors, true); # true flag returns val rather than print
    $errorLogMsg = "error info: $errorInfo"; # do what you wish with this var, write to log file etc...         

/* 
 $errorLogMsg will return something like: 
 error info:  
 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 'table bogus(field1, field2) VALUES                                                  ('bar', NULL)' at line 1
 )
*/
} else {
    # no SQL errors.
}

5voto

Vikram Points 1363

Peut-être que ce post est trop ancien, mais cela peut aider comme suggestion pour quelqu'un qui cherche à ce sujet : À la place d'utiliser:

  print_r($this->pdo->errorInfo());

Utilisez la fonction PHP imploser () :

  echo 'Error occurred:'.implode(":",$this->pdo->errorInfo());

Cela devrait imprimer le code d'erreur, les informations d'erreur détaillées, etc. que vous obtiendriez généralement si vous utilisiez une interface utilisateur SQL.

J'espère que ça aide

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X