Php PDO大海捞针SQL语句
我正在使用PDO,在使用以下代码时出现错误:Php PDO大海捞针SQL语句,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,我正在使用PDO,在使用以下代码时出现错误: $stmt = $pdo->prepare("SELECT username FROM users WHERE WHERE INSTR(`games`, '{$gameid}') > 0 "); $gameid = $gamedata['id']; $stmt->execute(array(
$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
它似乎还把“游戏”当作文字而不是专栏
我做错了什么?您有一个双
,其中
:
SELECT username FROM users WHERE
WHERE
您还使用
$gameid
做了一些有趣的事情,即在替换后设置变量,并绑定一个未使用的:gameid
参数。您还存在SQL注入漏洞,应该真正使用参数来传递$gameid
,而不是创建动态SQL。您将文字游戏封装在“后引号”中,而不是像{$gameid}变量所使用的“单引号”中。他们可能让db引擎假设它是一个列名而不是文本
$stmt = $pdo->prepare('SELECT `username` FROM `users`
WHERE INSTR(`games`, :gameid) > 0;');
在执行查询之前,应该使用$stmt->bindValue()
或$stmt->bindParameter()
如果gameid是一个。。。整数 为什么有两个地方?嗨@lc。谢谢你,我确实在这段代码之前定义了变量,并且正在尝试调试,如果这可能是答案的话!我有一个关于SQL注入的问题,我正在从另一个PDO语句中获取$gamedata['id'],这是否仍然易受攻击,如果是这样的话,怎么可能?当然,如果
$gamedata['id']
可能来自用户输入,直接或间接地,那么整个$gamedata数组都来自净化源,我看不出SQLiWell如何容易受到攻击,如果你保证它已全部消毒,那么你就可以开始了。谢谢你的回答,gameid不是整数,所以不用担心。因此,如果这对你的问题有帮助,请接受这一回答。