PDO在大海捞针SQL语句中查找指针

时间:2013-09-28 03:12:59

标签: php mysql sql pdo

我正在使用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

它似乎也把'游戏'作为一个字面而不是列

我做错了什么?

3 个答案:

答案 0 :(得分:1)

你有一个双WHERE

SELECT username FROM users WHERE 
                            WHERE

您还在使用$gameid做一些有趣的事情,即在替换后设置变量,并绑定未使用的:gameid参数。您还有一个SQL注入漏洞,应该使用参数传递$gameid而不是创建动态SQL。

答案 1 :(得分:1)

你有“后引号”包含的游戏,而不是{$ gameid}变量正在使用的“单引号”。它们可能使数据库引擎认为它是列名而不是文本。

答案 2 :(得分:1)

$stmt = $pdo->prepare('SELECT `username` FROM `users`
        WHERE INSTR(`games`, :gameid) > 0;');

在执行查询之前,您应该使用$stmt->bindValue()$stmt->bindParameter()

如果gameid是...这将无法正常工作......整数! ? ! ?