php
  • mysql
  • select
  • 2011-11-18 61 views 0 likes 
    0
    mysql_query("SELECT * FROM foo WHERE id ='$foo' OR id = '$foo2"); 
    

    这是行不通的。PHP mysql选择QUERY与或

    基本上,我希望能够选择它,其中id是一个变量的值或另一个的值。

    谢谢。

    编辑:ID列是数字。

    +0

    是ID列的数字? – ManseUK

    +0

    在代码中缺少''''。只是一个错字? – Kakashi

    +2

    _“这不起作用。”_是否是从MySql获得的错误?为什么给定的查询不起作用,我认为它有点冗长,但我可能会误解。 – CodeCaster

    回答

    3

    正如其他人所说,你确认,问题是,您正在使用字符串文字来比较数字列。有它的工作,查询应该像

    mysql_query("SELECT * FROM foo WHERE id =$foo OR id = $foo2"); 
    

    然而,这种解决方案具有非常非常坏的代码味道!

    首先,这是为什么IN存在:要能写

    mysql_query("SELECT * FROM foo WHERE id IN ($foo, $foo2)"); 
    

    第二,你注入转义串到你的查询?如果你是,你的代码容易受到sql injection的影响!你知道我们是在谈论整数值这种特定情况下

    $query = sprintf("SELECT * FROM foo WHERE id IN ('%s', '%s')", 
           mysql_real_escape_string($foo), 
           mysql_real_escape_string($foo2)); 
    mysql_query($query); 
    

    或交替这样的,因为:

    逃生和报价您的变量是安全的,这样(一般情况下)
    $query = sprintf("SELECT * FROM foo WHERE id IN (%s, %s)", 
           intval($foo), intval($foo2)); 
    mysql_query($query); 
    

    脚注:据我所知,使用sprintf这样的时候,人们还可以处理整数值,只要使用%d代替如果%s的格式说明。然而,我相信只要看一个地方(参数列表)而不是多个地方(我在变量上使用intval?或者我没有使用,但我正在使用%d在格式字符串中,所以我仍然可以吗?)。这听起来可能与直觉相反,但在面对修改时它更强大。

    +0

    你是rigth。我编辑 – Kakashi

    +0

    @Kakashi:如果'$ foo'和/或'$ foo2'是恶意的,你的编辑对sql注入是开放的。 – Jon

    +0

    你的第三个代码片段容易受到sql注入的影响 –

    3

    我想你忘记了过去的“字符

    mysql_query("SELECT * FROM foo WHERE id ='$foo' OR id = '$foo2'"); 
    

    但因为id列是数值,你应该使用:

    mysql_query("SELECT * FROM foo WHERE id = $foo OR id = $foo2"); 
    
    0

    试试这个:

    mysql_query(sprintf("SELECT * FROM foo WHERE id = %s OR id = %s", $foo, $foo2)); 
    

    我建议你使用mysql_error()来获得MySQL错误(如果存在)。

    mysql_query(..) or die('Erro:'.mysql_error()); 
    

    mysql_error返回mysql中发生的最后一个错误。

    相关问题