Mysql
 sql >> Base de données >  >> RDS >> Mysql

Ma déclaration PDO ne fonctionne pas

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

Chaque fois qu'une requête échoue, MySQL affiche un message d'erreur qui explique la raison . Malheureusement, par défaut, ces erreurs ne sont pas transférées à PHP, et tout ce que vous avez est un silence ou un message d'erreur crypté mentionné ci-dessus. Il est donc très important de configurer PHP et PDO pour vous signaler les erreurs MySQL. Et une fois que vous aurez reçu le message d'erreur, il vous sera facile de résoudre le problème.

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

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

(où $dbh est le nom de votre variable d'instance PDO) ou - mieux - ajoutez ce paramètre comme 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 normales.

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

 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 négligent souvent le sens du message d'erreur. Pourtant, la plupart du temps, cela explique le problème assez simplement :

  • Par exemple, s'il est indiqué qu'un tableau particulier n'existe pas, vous devez vérifier l'orthographe, les fautes de frappe, la casse des lettres. Vous devez également vous assurer que votre script PHP se connecte à une base de données correcte
  • Ou, s'il indique qu'il y a une erreur dans la syntaxe SQL, vous devez alors examiner votre SQL. Et le point problématique est juste avant la partie de la requête citée dans le message d'erreur.

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

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

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

    error_reporting(E_ALL);
    ini_set('display_errors',1);
    
  • lors d'un live site, 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 être défini sur E_ALL tout le temps.

Notez également que malgré l'illusion courante, aucun essai de capture ne doit être utilisé pour le rapport d'erreur . PHP vous signalera déjà les erreurs PDO, et sous une forme bien meilleure. Une exception non interceptée est très bonne pour le développement, mais si vous souhaitez afficher une page d'erreur personnalisée, n'utilisez toujours pas try catch pour cela, mais définissez simplement 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 n'importe quelle autre erreur dans votre code.

P.S.
Parfois, il n'y a pas d'erreur mais pas de résultat non plus. Cela signifie alors qu'aucune donnée ne correspond à 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 une réponse courte qui vous aiderait à identifier le problème de correspondance, Avoir un problème avec les lignes correspondantes dans la base de données en utilisant PDO . Suivez simplement ces instructions et le didacticiel lié étape par étape et résolvez votre problème ou posez une question à laquelle répondre pour Stack Overflow.