在我读过的每一篇博客/文章/问答中,没有人建议检查mysql_real_escape_string()
.
在我看来,此检查对于确保数据一致性非常重要,因为如果此函数失败,则插入数据库中的值将是假阳性:布尔 FALSE 类型转换为字符串,结果为空字符串,而不是什么你会期望的。
根据文档:
Returns the escaped string, or FALSE on error.
A MySQL connection is required before using mysql_real_escape_string() otherwise an error of level E_WARNING is generated, and FALSE is returned. If link_identifier isn't defined, the last MySQL connection is used.
如果您进入日志查看发生了什么,警告是好的,但不会阻止它发生。
我知道很少有更改会失败,但如果至少有一项更改,您的应用程序应该会预料到。
如果出现以下情况,此功能将失败:
- 开发人员在调用此函数之前没有连接到数据库
- 在调用此函数之前与数据库的连接失败
- 服务器(mysql客户端所在的地方)内存不足,无法复制字符串进行转义
- ...
这是“正常”用法的示例:
$db = mysql_connect() or die('Cannot connect to database');
$value = mysql_real_escape_string($_POST['value'], $db);
mysql_query('insert into tablex (value) values ("'.$value.'")', $db) or die('Cannot insert data in database');
我正在使用这样的东西(在mysql的OO包装器中):
class mywrapper{
// ... [code ...]
// $this->db is the mysql link identifier
public function escape($string)
{
if(mysql_real_escape_string($string, $this->db) === false)
{
throw new Exception('Some message');
}
}
} // end class
// I'm calling it as
// $myWrapper->insert('insert into tablex (value) values ("'.($myWrapper->escape($value)).'")');
这将引发异常处理程序将捕获的异常,最重要的是我防止在数据库中插入误报值,确保数据一致性。
我错过了什么?我是在安全地玩还是我在偏执狂?:)