web-dev-qa-db-fra.com

Message d'erreur PDO?

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 je reçois cependant, c'est ceci:

Tableau ([0] => 00000)

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

36
JD Isaacks

Essayez plutôt ceci:

print_r($sth->errorInfo());

Ajoutez ceci avant votre préparation:

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

Cela modifiera le type de rapport d'erreur PDO et provoquera l'émission d'un avertissement en cas d'erreur PDO. Cela devrait vous aider à le retrouver, bien que votre errorInfo ait dû être défini.

90
Alan Geleynse

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.
}
4
lumonald

Peut-être que ce message est trop ancien, mais cela peut être une suggestion pour quelqu'un qui regarde autour de lui: Au lieu d'utiliser:

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

Utilisez la fonction PHP implode ():

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

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

J'espère que ça aide

3
Vikram

Du manuel:

Si le serveur de base de données prépare correctement l'instruction, PDO :: prepare () renvoie un objet PDOStatement. Si le serveur de base de données ne parvient pas à préparer correctement l'instruction, PDO :: prepare () renvoie FALSE ou émet PDOException (selon la gestion des erreurs).

L'instruction prepare a probablement provoqué une erreur car la base de données ne pourrait pas préparer l'instruction. Essayez de tester une erreur immédiatement après avoir préparé votre requête et avant de l'exécuter.

$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);
print_r($this->pdo->errorInfo());
2
thetaiko