2009-06-29 6 views
1

J'ai un problème avec une requête préparée en PHP avec PDO. Le code:PHP PDO préparé requête refuse d'exécuter correctement - problème d'échappement?

$link = new PDO("mysql:dbname=$dbname;host=127.0.0.1",$username,$password); 
$link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$query = $link->prepare("SELECT locality_name FROM :passedday GROUP BY locality_name ORDER BY locality_name DESC"); 
$query->bindParam(":passedday",$day); //Where day is, well, a day passed to the script elsewhere 
$query->execute(); 
$result = $query->fetchAll(); 
$link = null; 
//Do things with the $result. 

Le message d'erreur que je reçois est:

SQLSTATE [42000]: Syntaxe violation d'erreur ou d'accès: 1064 Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de '' 05_26_09 'GROUP BY nom_local ORDER BY nom_local DESC' à la ligne 1

Lorsque j'exécute directement la requête sur le serveur, il renvoie la commande appropriée jeu de résultats sans aucun problème. Des idées de ce que je fais mal?

TIA.

Edit:

$day est passé comme un argument GET. Ainsi, http://127.0.0.1/day.php?day=05_26_09 conduit à $day = $_GET['day'];.

Répondre

2

Si 05_26_09 est supposé miser le nom de la table, alors je suppose que vous avez un problème d'échappement. Est-ce que votre système d'exploitation local est différent du serveur live?

Je ne pense pas que vous pouvez utiliser bindValue()/bindParam() pour autre chose que des valeurs (par exemple, nom de table, nom de champ). Je suis donc un peu surpris, que cela fonctionne sur votre système local.

+0

Je viens de le découvrir sur Google. Merci. – benjy

1

PDO utilise l'API C de mysql pour les instructions préparées.
http://dev.mysql.com/doc/refman/5.0/en/mysql-stmt-prepare.html dit:

Les marqueurs sont légaux seulement à certains endroits dans les instructions SQL. [...] Cependant, ils ne sont pas autorisés pour les identifiants (tels que les noms de table ou de colonne)
En règle générale, j'utilise: "si vous ne pouvez pas l'envelopper dans des guillemets simples dans une chaîne de requête ad-hoc vous ne peut pas le paramétrer dans une instruction préparée "