【问题标题】:Impossible MySQL return value不可能的 MySQL 返回值
【发布时间】:2012-08-14 00:57:41
【问题描述】:

这个问题和这个问题类似:Why does mysql_query() return TRUE with a SELECT statement?。我在 php 中执行 SELECT mysql 查询,但它返回 true。我已经开始使用它半小时了,我完全肯定它是一个选择查询,它返回 true。类似问题的明显解决方法是检查连接是否仍然存在。对我来说不同的是,mysql_error 是空的。以下是我的代码中导致错误的部分:

public function query($query, $params = array())
{
    $params['prefix'] = 'unpirate_';

    foreach($params as $key => $param)
    {
        $query = str_replace('{' . $key . '}',
            mysql_real_escape_string($param), $query);
    }

    echo($query);
    return mysql_query($query, $this->conn) or $this->error($query);
}

public function fetch_all($query, $params = array())
{
    $result = $this->query($query, $params);

    if($result === true)
        die('"' . mysql_error() . '"');
    (...)
}

echo'd 的查询是一个有效的查询 (SELECT * FROM [table] WHERE event_id = "54"),唯一的另一个是 echo'd 是 "",因此结果是 true 并且 mysql_error是空的。你们知道发生了什么吗?如果我的结论不正确,请纠正我。

PHP 版本:带有 Suhosin-Patch (cli) 的 PHP 5.3.10-1ubuntu3.2(构建时间:2012 年 6 月 13 日 17:19:58)

MySQL 版本:mysql Ver 14.14 Distrib 5.5.24,适用于使用 readline 6.2 的 debian-linux-gnu (x86_64)

【问题讨论】:

  • 提示:您的转义序列具有潜在危险。 m_r_e_s() 应该是在查询中使用字符串之前对字符串执行的非常 LAST 的操作。您正在对其进行 str_replace 操作,这可能会撤消转义并仍然使您容易受到注入攻击。在这种特殊情况下不太可能,但仍然需要指出。
  • @MarcB 我不确定 str_replace 如何撤消我的转义。您能否举一个可能导致 SQL 注入的 $query 和 $params 示例?

标签: php mysql


【解决方案1】:
return mysql_query($query, $this->conn) or $this->error($query);

您的返回值是一个 OR 语句。

发生的事情是 PHP 正在评估 OR 并返回它的值,而不是代码本身;因为第一部分有数据,所以它评估为真,并返回一个布尔值真。

试试:

$retVal = mysql_query($query, $this->conn);
if (false === $retVal) {
    return $this->error($query);
}
return $retVal;

【讨论】:

  • @niomaster - 我发现它的唯一原因是因为几周前我花了一天时间追踪一个相同的问题。我的头发还没有长回来。
  • 但是现在想想,错误回显的各种东西,最后调用了 die 并没有返回任何东西。所以问题仍然存在,为什么它评估为 true?
  • 正在评估的是“或”部分。本质上,它将返回语句转换为“mysql_query 是否包含某些内容或 mysql_error 是否包含某些内容”,当然其中一个会。
  • 其实我不是说mysql_error。让我们假设 mysql_query 返回 false,它应该返回 false。然后 $this->error($query) 应该必须评估为 true,它没有,因为它终止了脚本。为什么?
  • 好吧,在您给出的示例中,您说 SQL 语句是有效的;你试过用一个你知道行不通的吗?我怀疑,如果您的 error() 函数包含 die(),那么 query() 将返回 true 或 error() 将被调用并停止执行。
猜你喜欢
  • 2013-06-10
  • 2012-12-29
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
相关资源
最近更新 更多