web-dev-qa-db-fra.com

Ma déclaration PDO ne fonctionne pas

Ceci est ma PHP sql et elle retourne false pendant le vidage var

$password_md5 = md5($_GET['password']);
$sql = $dbh->prepare('INSERT INTO users(full_name, e_mail, username, password, password_plain) VALUES (:fullname, :email, :username, :password, :password_plain)');
$result = $sql->execute(array(
                    ':fullname' => $_GET['fullname'], 
                    ':email' => $_GET['email'], 
                    ':username' => $_GET['username'],
                    ':password' => $password_md5,
                    ':password_plain' => $_GET['password']));
37
Rifthy

Parfois, votre code PDO produit une erreur comme Call to a member function execute() ou similaire. Ou même sans erreur mais la requête ne fonctionne pas tout de même. Cela signifie que votre requête n'a pas pu être exécutée.

Chaque fois qu'une requête échoue, MySQL a un message d'erreur qui explique la raison . Malheureusement, par défaut, ces erreurs ne sont pas transférées vers PHP, et tout ce que vous avez est un silence ou un message d'erreur cryptique mentionné ci-dessus. Par conséquent, il est très important de configurer PHP et PDO pour vous signaler les erreurs MySQL. Et une fois que vous obtenez le message d'erreur, ce sera une évidence pour résoudre le problème.

Afin d'obtenir les informations détaillées sur le problème, mettez la ligne suivante dans votre code juste après la connexion

$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

ou ajoutez ce paramètre sous la forme option de connexion . Après cela, toutes les erreurs de base de données seront traduites en exceptions PDO qui, si elles étaient laissées seules, agiraient comme des erreurs PHP.

Il y a une très petite chance qu'en cas d'erreur spécifique, une exception ne soit pas levée. Si votre appel query()/prepare() ou execute () renvoie false mais qu'il n'y a pas d'exception, vérifiez la PDO::errorInfo() comme ceci,

 trigger_error("PDO errorInfo: ".$dbh->errorInfo());

Après avoir reçu le message d'erreur, vous devez le lire et le comprendre. Cela semble trop évident, mais les apprenants oublient souvent la signification du message d'erreur. Pourtant, la plupart du temps, cela explique le problème assez simplement. Disons que, s'il indique qu'une table particulière n'existe pas, vous devez vérifier l'orthographe, les fautes de frappe, la casse des lettres, les informations d'identification, etc. Ou, s'il indique qu'il y a une erreur dans la syntaxe SQL, alors vous devez examiner votre SQL. Et le problème est à droite avant la partie requête citée dans le message d'erreur.

Vous devez également faire confiance le message d'erreur. S'il indique que le nombre de jetons ne correspond pas au nombre de variables liées, alors c'est c'est donc. Il en va de même pour les tables ou colonnes absentes. Si vous avez le choix, que ce soit votre propre erreur ou que le message d'erreur soit erroné, respectez toujours la première. Encore une fois, cela semble condescendant, mais des centaines de questions sur ce site prouvent que ce conseil est extrêmement utile.


Notez que pour voir les erreurs PDO, vous devez pouvoir voir les erreurs PHP en général. Pour ce faire, vous devez configurer PHP dépend de l'environnement du site:

  • sur un serveur de développement , il est très pratique d'avoir des erreurs directement sur l'écran, pour lesquelles l'affichage des erreurs doit être activé:

    error_reporting(E_ALL);
    ini_set('display_errors',1);
    
  • sur un site live , toutes les erreurs doivent être enregistrées, mais jamais affichées au client. Pour cela, configurez PHP de cette façon:

    error_reporting(E_ALL);
    ini_set('display_errors', 0);
    ini_set('log_errors', 1);
    

Notez que error_reporting Doit toujours être réglé sur E_ALL.

Notez également que malgré l'illusion courante, aucun try-catch ne doit être utilisé pour le rapport d'erreur . PHP vous signalera déjà des erreurs PDO, et d'une meilleure manière. Une exception non capturée est très bonne pour le développement, mais si vous voulez afficher une page d'erreur personnalisée, n'utilisez toujours pas try attraper pour cela, mais juste définir un gestionnaire d'erreurs personnalisé . En un mot, vous n'avez pas à traiter les erreurs PDO comme quelque chose de spécial mais les considérer comme toute autre erreur dans votre code.

P.S.
Parfois, il n'y a pas d'erreur mais aucun résultat non plus. Cela signifie alors, il n'y a pas de données correspondant à vos critères. Vous devez donc admettre ce fait, même si vous pouvez jurer que les données et les critères sont corrects. Ils ne sont pas. Vous devez les vérifier à nouveau. J'ai un article qui peut aider à ce sujet, Comment déboguer l'interaction de la base de données avec PDO . Suivez simplement ces instructions étape par étape et résolvez votre problème ou posez une question à propos de Stack Overflow.

51
Your Common Sense