-2

PDO を使用していますが、次のコードを使用するとエラーが発生します。

$stmt = $pdo->prepare("SELECT username FROM users WHERE 
                                WHERE INSTR(`games`, '{$gameid}') > 0
                                ");
$gameid = $gamedata['id'];
$stmt->execute(array(
                                ':gameid'=>$gameid
                                ));
$players = $stmt->fetch(PDO::FETCH_ASSOC);

過去の回答を見ると、これは機能するはずですが、次のエラーが発生します。

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax 
error or access violation: 1064 You have an error in your SQL syntax; check the manual 
that corresponds to your MySQL server version for the right syntax to use near 'WHERE 
INSTR(`games`, 'crysis') > 0' at line 2' in C:\xampp\htdocs\gs\gamepage.php:19 Stack 
trace: #0 C:\xampp\htdocs\gs\gamepage.php(19): PDOStatement->execute(Array) #1 {main} 
thrown in C:\xampp\htdocs\gs\gamepage.php on line 19

また、列ではなくリテラルとして「ゲーム」を取得しているようです

私は何を間違っていますか?

4

3 に答える 3

1

あなたは二重を持っていますWHERE

SELECT username FROM users WHERE 
                            WHERE

また、置換後$gameidに変数を設定し、未使用のパラメーターをバインドするなど、でいくつかの面白いことを行っています。また、SQL インジェクションの脆弱性もあり、動的 SQL を作成する代わりに、パラメーターを実際に使用して渡す必要があります。:gameid$gameid

于 2013-09-28T03:15:51.237 に答える
1

ゲームという単語は、{$gameid} 変数が使用しているような「一重引用符」ではなく、「逆引用符」で囲まれています。彼らはおそらく、テキストではなく列名であると db エンジンに想定させています。

于 2013-09-28T03:16:47.593 に答える
1
$stmt = $pdo->prepare('SELECT `username` FROM `users`
        WHERE INSTR(`games`, :gameid) > 0;');

また、クエリを実行する前に$stmt->bindValue()orを使用する必要があります。$stmt->bindParameter()

gameid が ... INTEGER の場合、これは機能しません! ? ! ?

于 2013-09-28T03:17:34.320 に答える