Déboguer les erreurs SQLSTATE[HY093] avec Symfony et / ou Doctrine
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.