【发布时间】: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 示例?