2010-07-23 23 views
0

J'essaie d'utiliser la liaison dans PDO pour sélectionner certaines entrées d'une base de données Microsoft SQL. Le code que j'utilise ressemble à ce que j'ai trouvé dans la documentation. Cependant, quand je le lance, je reçois l'avertissement ci-dessous:PDO et Microsoft SQL: Doit déclarer la variable de table "@ P1"

Attention: PDOStatement :: execute() [pdostatement.execute]: SQLSTATE [42000]: Syntaxe violation d'erreur ou d'accès: 1087 [Microsoft] [SQL Client natif] [SQL Server] Doit déclarer la variable de table "@ P1". (SQLExecute [1087] au poste \ PDO_ODBC \ odbc_stmt.c: 254) dans (chemin de fichier long) sur la ligne 40

Voici le code correspondant:

$table = "[User Site]"; 
$user = "demo"; 
$sql = "SELECT * FROM ? WHERE user='?'"; 
$sth = $db->prepare($sql); 
$sth->bindValue(1, $table, PDO::PARAM_STR); 
$sth->bindValue(2, $user, PDO::PARAM_STR); 
$sth->execute(); //       <-- line 40 
$data = $sth->fetch(PDO::FETCH_ASSOC); 

Cela peut être lié. Lorsque je tente d'utiliser des marqueurs de paramètres nommés (: table,: l'utilisateur) au lieu de points d'interrogation, je reçois ceci:

Attention: PDOStatement :: bindValue() [pdostatement.bindvalue]: SQLSTATE [HY093]: non valide numéro de paramètre: le paramètre n'a pas été défini dans (chemin de fichier long) à la ligne 39

Pourquoi n'aime-t-il pas mon instruction préparée?

Répondre

2

Vous ne pouvez pas lier les paramètres aux noms de table dans SQL. Cela est vrai dans n'importe quelle langue, n'importe quelle base de données.

Vous devrez interpoler le nom de la table dans la chaîne de requête avant prepare().

De même, vous ne devez pas placer le paramètre de paramètre entre guillemets, même s'il s'agit d'une valeur de chaîne ou de date. Les espaces réservés aux paramètres dans les guillemets sont interprétés comme des chaînes littérales. Sinon comment auriez-vous jamais entrer dans un point d'interrogation littéral?

Voilà comment je voulais écrire ceci:

$table = "[User Site]"; 
$user = "demo"; 
$sql = "SELECT * FROM $table WHERE user=?"; 
$sth = $db->prepare($sql); 
$sth->execute(array($user)); 
$data = $sth->fetch(PDO::FETCH_ASSOC); 

Je ne prends pas la peine avec l'aide bindParam() ou bindValue(). Il est généralement plus facile de simplement passer les valeurs de paramètres dans un argument de tableau à execute().