Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO大海捞针SQL语句_Php_Mysql_Sql_Pdo - Fatal编程技术网

Php PDO大海捞针SQL语句

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(

我正在使用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
它似乎还把“游戏”当作文字而不是专栏


我做错了什么?

您有一个双
,其中

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不是整数,所以不用担心。因此,如果这对你的问题有帮助,请接受这一回答。