2

PDOでバインディングを使用して、MicrosoftSQLデータベースからいくつかのエントリを選択しようとしています。私が使用しているコードは、ドキュメントで見つけたものと似ているように見えます。ただし、実行すると、以下の警告が表示されます。

警告:PDOStatement :: execute()[pdostatement.execute]:SQLSTATE [42000]:構文エラーまたはアクセス違反:1087 [Microsoft] [SQL Native Client][SQLServer]テーブル変数"@P1"を宣言する必要があります。(SQLExecute [1087] at ext \ pdo_odbc \ odbc_stmt.c:254)in(long file path)on line 40

関連するコードは次のとおりです。

$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);

これは関連している可能性があります。疑問符の代わりに名前付きパラメーターマーカー(:table、:user)を使用しようとすると、次のようになります。

警告:PDOStatement :: bindValue()[pdostatement.bindvalue]:SQLSTATE [HY093]:無効なパラメーター番号:パラメーターが39行目の(長いファイルパス)で定義されていません

なぜ私の準備されたステートメントが好きではないのですか?

4

1 に答える 1

5

SQLではパラメータをテーブル名にバインドすることはできません。これは、どの言語、どのデータベースにも当てはまります。

の前に、テーブル名をクエリ文字列に補間する必要がありますprepare()

また、文字列や日付の値であっても、パラメータのプレースホルダーを引用符で囲んではいけません。引用符内のパラメータープレースホルダーは、リテラル文字列として解釈されます。それ以外の場合、文字通りの疑問符をどのように入力しますか?

これが私がこれを書く方法です:

$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);

bindParam()またはを使用することを気にしませんbindValue()。通常は、配列引数のパラメータ値をに渡す方が簡単ですexecute()

于 2010-07-23T17:04:14.700 に答える