web-dev-qa-db-fra.com

PHP AOP. numéro d'erreur '00000' lorsque la requête est correcte

J'ai le code ci-dessous:

$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]);
}

Lorsque j'exécute le script, je reçois parfois le numéro d'erreur '00000'. Je veux dire que cela va dans la IF. et tout est aléatoire. sortie (parfois):

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

Que dois-je faire pour résoudre ce problème?
PS: le script s’exécute correctement à chaque fois.

23
Siamak A.Motlagh

Le code d'erreur PDO 00000 signifie que tout fonctionne correctement. La raison pour laquelle vous frappez le code de vérification d'erreur est que $sql3 renvoie 0 (aucune ligne n'a été affectée) et que PHP évalue cela à false. Essayez explicitement de rechercher un return false;

if($sql3 === false)
33
SomeKittens

Si exec ne met à jour aucune ligne, il retournera 0. Si (! $ Sql3) est évalué à false, vous devriez plutôt le faire:

if($sql3 === false){

}
7
Oussama

D'après mon expérience, les requêtes mal formées (erreurs de syntaxe) et les requêtes ayant échoué (par exemple, un INSERT qui n'a rien inséré) peuvent également renvoyer incorrectement le code d'erreur 00000. Vous devez continuer et essayer d'exécuter la requête complète sur votre console SQL et voir pourquoi cela a échoué. Je ne sais vraiment pas pourquoi le message d'erreur correct n'est pas renvoyé. Voici un extrait du code que nous utilisons

    $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;
    }
3
Collector

00000 signifie que cela fonctionne bien. vous devriez changer votre si à ceci: $sql3 === false.

2
s.naseri

Je viens de recevoir une situation similaire dans mon projet php - il est arrivé que PDO Exception avec le code d'erreur '00000' se produise lorsque j'ai essayé d'insérer une ligne avec un champ défini sur NULL alors que la colonne définissant le champ dans la base de données était de type ENUM('0', '1') et restriction NOT NULL . Après avoir modifié le script PHP pour qu'il place "0" à la place de NULL, l'erreur disparaît.


Le codage suivant a apporté plus de clarté dans la situation. J'exécutais plus d'une instruction PDO dans une transaction de base de données, mais je vérifiais les erreurs (dans le bloc de traitement des exceptions) en se basant uniquement sur la première instruction PDO exécutée alors qu'une erreur réelle se produisait dans la troisième instruction PDO.

1
user4065635

L'instruction PDO :: exec renvoie un entier indiquant le nombre de lignes affectées. Ainsi, dans votre cas particulier, comme l'indique SomeKittens, si 0 ligne était affectée, votre code d'erreur serait alors déclenché. 

Cependant, si vous vous demandez si votre requête a fonctionné, il est préférable d'utiliser PDO :: query (en termes de code ($ returnObj = $ connect-> query ($ sql3) au lieu de PDO :: exec.

Le $ returnObj peut ensuite être vérifié pour voir s'il y a eu une erreur dans l'exécution SQL et vous pouvez ensuite résoudre votre requête SQL car elle vous indiquera quelle était l'erreur et où elle se trouvait. 

Votre meilleur pari pour faire cela serait: 

//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]);
}
1
Bryan Teague

J'ai eu le même problème. Cela m'a aussi beaucoup torturé, mais l'a finalement compris.

Supposons que vous ayez 7 colonnes dans votre tableau.

Vous êtes insérant des données dans 4 d'entre eux.

Si, pour rester 3 colonnes} _ la valeur par défaut n'est pas définie (par exemple, NULL for alpha-numeric columns, CURRENT_TIMESTAMP for date-time related columns etc.), le problème susmentionné se produit.

Si vous insérez des données dans toutes ces 7 colonnes ou au moins dans les colonnes pour lesquelles la valeur par défaut n'est pas définie}, vous n'obtiendrez aucune erreur ni aucune donnée inséré.

0
bantya