从GET输入法检查SQL条目

时间:2014-04-09 21:08:33

标签: php mysql

出于某种原因,我不能让我的代码像我想要的那样工作。

$Check = $_POST['phrase'];

    try{ $db=new readPDO('testDB'); $sql=('

        SELECT entry, ID
        FROM test
        WHERE entry = "$Check "

        ');

$statement=$db->prepare($sql);
$statement->execute();

如果我试试这个:

$Check = $_POST['phrase'];

    try{ $db=new readPDO('testDB'); $sql=('

        SELECT entry, ID
        FROM test
        WHERE ID= "$Check "

        ');

$statement=$db->prepare($sql);
$statement->execute();

GET是一个工作正常的数字,但它不能用于字符串。

1 个答案:

答案 0 :(得分:0)

正如Strings所述:

  

string文字可以用四种不同的方式指定:

           

单引号

     

指定string的最简单方法是将其用单引号(字符')括起来。

     
    

注意:与double-quotedheredoc语法不同,variables和特殊字符的转义序列在时会被展开它们出现在单引号string s。

中   
<?
// [ deletia ]

// Outputs: Variables do not $expand $either
echo 'Variables do not $expand $either';
?>
     

双引号

     

如果string包含在双引号(“)中,PHP将解释特殊字符的更多转义序列:

[ deletia ]
     

双引号string的最重要特征是变量名称将被扩展。有关详细信息,请参阅string parsing

在您的情况下,$sql被赋予单引号字符串文字的值,其中$Check变量不会被展开(虽然它本身被包围其中有双引号,就PHP解析器而言,它仍然是单引号字符串文字。)

使用双引号字符串文字将提供变量扩展。如果您仍希望使用双引号引用字符串文字中的$Check,则必须对它们进行转义(使用反斜杠):

$sql = "
    SELECT entry, ID
    FROM test
    WHERE entry = \"$Check \"
";

或者,现在可以使用单引号引用$Check(自MySQL recognises both forms of string quoting开始,前提是ANSI_QUOTES已禁用):

$sql = "
    SELECT entry, ID
    FROM test
    WHERE entry = '$Check '
";

请注意,引号中的尾随空格将由MySQL作为字符串的一部分进行解析,这可能不是您的意图。

另请注意,此代码容易受到SQL注入攻击(如果$Check恰好包含某些字符,也会出现错误)。您应该阅读@deceze的博客文章The Great Escapism (Or: What You Need To Know To Work With Text Within Text)以更好地理解这一点;然后How can I prevent SQL injection in PHP?了解如何修复它。