Vous êtes ici : Accueil / Développement / Symfony 1.4 / Déboguer les erreurs SQLSTATE[HY093] avec Symfony et / ou Doctrine

Déboguer les erreurs SQLSTATE[HY093] avec Symfony et / ou Doctrine

Par Pierre-Yves Landuré Dernière modification 31/10/2011 16:58

Lorsque le code contient des requêtes DQL avec multiples paramètres, des erreurs dans les noms de paramètres, et leur nombre peuvent apparaître. Dans ce cas, PHP renvoie l'erreur SQLSTATE[HY093]. Cet article présente une méthode pour déboguer rapidement ces erreurs.

Voici une méthode permettant d'obtenir des informations plus détaillées sur les erreurs du type :

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

Avec les variables suivantes :

  • $query est la requête au format DQL, par exemple :
    $query = "SELECT t.id FROM Table t WHERE t.name = :name LIMIT 10";
  • $line est le tableau contenant les paramtères de la requête, par exemple :
    $line = array( 'name' => 'exemple' );

Les lignes suivantes affichent les paramètres invalides :

$tokens = array();
preg_match_all('/:[^,) ]*[,) ]/', $query, $tokens);
$tokens = preg_replace('/[:,) ]/', '', $tokens[0]);

echo count($tokens) . " == " . count($line);
print_r(array_diff($tokens, array_keys($line)));
print_r(array_diff(array_keys($line), $tokens));

Les informations affichées par ces lignes permettent de résoudre rapidement les erreurs de noms de paramètres des requêtes DQL sans passer par une relecture fastidieuse du code.