【问题标题】:PHP/MySQL - query fails if a variable is used instead of a hard coded valuePHP/MySQL - 如果使用变量而不是硬编码值,则查询失败
【发布时间】:2011-05-02 18:34:41
【问题描述】:

我已经搜索和搜索并尝试了我读过的内容,但由于某种原因,我的查询在使用变量而不是硬编码值时失败。

这是我的查询:

$bugzilla_query="SELECT * FROM profiles WHERE userid='".$bugzilla_id."'";

我通过执行以下操作来获取 cookie 的值:

$bugzilla_id = $_COOKIE["Bugzilla_login"];

我开始怀疑查询是错误的,但是保存 cookie 值的变量没有正确检索它,即使它看起来正确但是如果我设置 $bugzilla_id = 642; 它仍然不起作用但如果我这样做 @ 987654324@ 完美运行。

嗯,糊涂了!

【问题讨论】:

  • 用户var_dump查看$bugzilla_query中的内容
  • 确保正确转义数据以避免 SQL 注入
  • @Doug T:我不相信 PHP 中有 ." 和 .$ 标记。
  • @Neal - 似乎设置为 NULL。我所做的是编写了一个连接到 Bugzilla 数据库的函数,我回显getBugzillaShortname(); 以获取值,因为我在函数末尾返回了一个变量。
  • var_dump($bugzilla_id)检查cookie中的值。它可能看起来像一个整数,但可能有隐藏的空格或其他东西。如果您使用引号进行查询,那么 mysql 可能会尝试直接进行整数->字符串比较并失败。

标签: php mysql cookies


【解决方案1】:

一般来说,您永远不想将用户可以直接修改的任何值放入查询中。此外,如果这应该是一个数字,为​​什么在启用变量的查询中将其放在单引号中,而不是在硬编码的查询中?注意到区别了吗?试试这个:

$bugzilla_query = sprintf("SELECT * FROM profiles WHERE userid = %d", $bugzilla_id);

这将确保在进入查询之前将其转换为整数。

【讨论】:

  • echo $bugzilla_query 并将其复制/粘贴到 mysql 中并直接运行。怎么了?查询是什么?
  • 嗨,大卫,周末没有参加 SO,只是尝试了您的建议。由于查询回显为SELECT * FROM profiles WHERE userid = 0,因此变量正在发挥作用
【解决方案2】:

如果 $bugzilla_id 应该是整数,请尝试将其包装在 intval() 中以确保它作为整数传递。

【讨论】:

    【解决方案3】:

    非常感谢您的帮助。原来这是我在代码中犯的一个愚蠢的错字:

    我有:

    if ($bugzilla_id <= 0 || $bugzilla_id = '' || !isset($bugzilla_id))
    {
         return "No Bugzilla cookie is set!";
    }    
    

    当我明显需要时:

    if ($bugzilla_id <= 0 || $bugzilla_id == '' || !isset($bugzilla_id))
    {
        return "No Bugzilla cookie is set!";
    }    
    

    我将$bugzilla_id 设置为'',因为我在比较检查中错过了=

    我对此的建议——我可能会自己开始这样做——将变量放在右侧,所以把你的比较写成相反的方式,然后它会立即失败。巧合的是,我在 Joel 自己的网站上读到,他认为这是一个优秀程序员的标志:/

    【讨论】:

      猜你喜欢
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      相关资源
      最近更新 更多