在查询中使用PHP变量

时间:2010-03-08 08:47:02

标签: php mysql database

我在PHP内使用查询:

 $query =  'SELECT * from #__chronoforms_UploadAuthor where text_6 like "%'.$_GET['title'].'%" and text_7 like "%'.$_GET['author'].'%" limit 0,1';

我试图在限制中插入PHP变量而不是1 ..

   $query =  'SELECT * from #__chronoforms_UploadAuthor where text_6 like "%'.$_GET['title'].'%" and text_7 like "%'.$_GET['author'].'%" limit 0,"'.$_GET['limit'].'"';

但它显示了一个错误。保留$_GET['limit']会有一些错误。

6 个答案:

答案 0 :(得分:4)

三件事:

  1. 您写出这些查询的方式有点难以理解。我个人更喜欢使用多行heredoc语法(如下所示),但这不是严格要求的;

  2. 任何用户输入都应通过mysql_real_escape_string()以避免SQL injection次攻击。 注意:“用户输入”包括来自客户端的任何,包括Cookie,表单字段(普通或隐藏),查询字符串等;以及

  3. 您不需要引用LIMIT子句的第二个参数,这可能是您问题的根源,这意味着将LIMIT 0,5设为LIMIT 0,"5"

  4. 所以试试:

    $title = mysql_real_escape_string($_GET['title']);
    $author = mysql_real_escape_string($_GET['author']);
    $limit = (int)$_GET['limit'];
    
    $query = <<<END
    SELECT *
    FROM #__chronoforms_UploadAuthor
    WHERE text_6 LIKE "$title%" 
    AND text_7 LIKE "%$author%"
    LIMIT 0,$limit
    END;
    

    另外,一位评论员指出应该转义%_。这可能是也可能不是。许多应用程序允许用户输入通配符。如果是这样,那么你就不应该逃避它们。如果你必须逃脱它们,那么处理它们:

    $title = like_escape($limit);
    
    function like_escape($str) {
        return preg_replace('!(?|\\)((?:\\)*)([%_])!', '$1\$2', $str);
    }
    

    有点复杂的正则表达式试图阻止某人输入'\%'并获得'\%',然后转出反斜杠而不是'%'。

答案 1 :(得分:1)

哈希符号(#)在SQL中启动注释,看起来像是你的问题

答案 2 :(得分:1)

想要一堆可怕的答案!

一个。解决极限问题:

$limit = intval($_GET['limit']);

然后

...LIMIT 0, $limit

在查询中。

湾正如许多人所提到的那样,要清理$ _GET ['title']:

$title = mysql_real_escape_string($_GET['title']);

所以最终的代码必须是

$limit=intval($_GET['limit']);
$title = mysql_real_escape_string($_GET['title']);
$author = mysql_real_escape_string($_GET['author']);
$query = "SELECT * from #__chronoforms_UploadAuthor
          WHERE text_6 like '$title' and text_7 like '%$author%'
          LIMIT 0, $limit";

答案 3 :(得分:0)

您已将$_GET['limit']括在双引号中,这是问题的根源。

试试这个:

$query =  'SELECT * from #__chronoforms_UploadAuthor where text_6 like "%'.$_GET['title'].'%" and text_7 like "%'.$_GET['author'].'%" limit 0,'.$_GET['limit'];

正如Cletus在这个答案中提到的那样,你需要解决许多更严重的问题。

答案 4 :(得分:0)

删除$ _GET ['limit']周围的双引号。不应引用LIMIT子句所采用的两个数字。

答案 5 :(得分:-1)

这应该有效:

$query =  'SELECT * from #__chronoforms_UploadAuthor where text_6 like "%'.$_GET['title'].'%" and text_7 like "%'.$_GET['author'].'%" limit 0,'.$_GET['limit'];

但你真的应该过滤传入的数据......

$query =  'SELECT * from #__chronoforms_UploadAuthor where text_6 like "%'.mysql_real_escape_string($_GET['title']).'%" and text_7 like "%'.mysql_real_escape_string($_GET['author']).'%" limit 0,"'.intval($_GET['limit']).'"';
相关问题