-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,即在替换设置变量,并绑定未使用的:gameid参数。您还有一个 SQL 注入漏洞,应该真正使用参数传递$gameid而不是创建动态 SQL。

于 2013-09-28T03:15:51.237 回答
1

您将单词 games 包含在“反引号”中,而不是像 {$gameid} 变量使用的“单引号”。他们可能使数据库引擎假定它是列名而不是文本。

于 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 回答