【问题标题】:PDO Find a needle in a haystack SQL statementPDO 大海捞针 SQL 语句
【发布时间】:2013-09-28 03:12:59
【问题描述】:

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

它似乎也将“游戏”作为文字而不是列来抓取

我做错了什么?

【问题讨论】:

  • 为什么会有两个 WHERE?

标签: php mysql sql pdo


【解决方案1】:

你有一个双重WHERE

SELECT username FROM users WHERE 
                            WHERE

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

【讨论】:

  • 嗨@lc。谢谢你,我确实在这段代码之前定义了变量,并且正在尝试调试是否可能是答案!我有一个关于 SQL 注入的问题,我正在从另一个 PDO 语句中获取 $gamedata['id'] ,这是否仍然容易受到攻击,如果是这样怎么办?
  • 当然,如果 $gamedata['id'] 可以直接或间接来自用户输入
  • 整个 $gamedata 数组来自经过清理的来源,我看不出这对 SQLi 有什么影响
  • 好吧,如果你能保证它都经过消毒,那么你就可以走了。
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    $stmt = $pdo->prepare('SELECT `username` FROM `users`
            WHERE INSTR(`games`, :gameid) > 0;');
    

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

    如果 gameid 是一个 ... INTEGER ,这将不起作用! ? ! ?

    【讨论】:

    • 感谢您的回答,gameid 不是整数所以不用担心。
    • 所以,如果这对您的问题有帮助,请接受此作为答案。
    猜你喜欢
    • 2011-02-07
    • 1970-01-01
    • 2016-07-30
    • 2010-11-17
    • 2019-05-19
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多