【问题标题】:PHP mysql SELECT QUERY with an OrPHP mysql SELECT QUERY 带或
【发布时间】:2011-11-18 13:08:36
【问题描述】:
mysql_query("SELECT * FROM foo WHERE id ='$foo' OR id = '$foo2");

这不起作用。

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

谢谢。

编辑:ID 列是数字。

【问题讨论】:

  • 您的代码中缺少'。只是一个错字?
  • 你的查询很完美,我认为你的变量中的值出错了,打印出来然后试试
  • “这不起作用。” 这是你从 MySql 得到的错误吗?我认为为什么给定查询不起作用的原因有点冗长,但我可能弄错了。

标签: php mysql select


【解决方案1】:

正如其他人所说并且您已确认,问题在于您使用字符串文字与数字列进行比较。为了让它工作,查询应该是这样的

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,所以我还可以吗?)。这听起来可能违反直觉,但在修改时它更强大。

【讨论】:

  • @Kakashi:如果$foo 和/或$foo2 是恶意的,您的编辑对sql 注入开放。
  • @Col.Shrapnel:怎么样?请赐教。
  • 字符串文字可以与数字列进行比较。但可惜我只有 1 票。
  • 与任何注入的工作方式相同。 $id="1 union select password from users";
  • @Col.Shrapnel:有一个intval,以防你没有注意到。 "1 union select password from users" 将仅转换为 1
【解决方案2】:

我想你忘记了最后一个 ' 字符

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

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

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

【讨论】:

    【解决方案3】:

    试试这个:

    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 中发生的最后一个错误。

    【讨论】:

      猜你喜欢
      • 2022-11-20
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 2016-03-17
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多