在我读过的每篇博客/文章/ Q& A中,没有人建议检查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.
如果您查看日志以查看发生的情况,警告就会很好,但不会阻止它发生。
我知道失败的变化非常少,但如果您的应用程序应该预期至少有一次更改。
如果出现以下情况,此功能将失败:
这是"正常"的例子。用法:
$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');
我正在使用这样的东西(在我的OO封装器中用于mysql):
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)).'")');
这将抛出异常处理程序将捕获的异常,最重要的是我阻止在数据库中插入误报值,确保数据的一致性。
我错过了什么?我玩得安全还是我在变异? :)
答案 0 :(得分:2)
从某种意义上说,你错过了一些东西,因为它是no longer recommended to use the mysql_系列的功能。而是使用mysqli或PDO。这两个都提供了参数化查询,它们将自动为您输入数据。
答案 1 :(得分:0)
不,我不认为你是偏执狂。 (或者我们都是偏执狂)
我也认为避免在mysql查询中发送nothing
绝对是一种好习惯(就像你不想发送一个nothing
值$_POST
变量一样)
答案 2 :(得分:-1)
我注意到你提到的问题:
这是“正常”用法的例子:
$ db = mysql_connect();
那么,此时你一定要检查连接是否成功。另外,通过良好的数据库抽象层,你可以防止用户“忘记”连接到数据库(因为他从来不必手动连接) 。 (1)。
如果您在此期间失去连接,那么您的查询将失败,因此您发送的内容无关紧要(2)。
mysql_real_escape_string
在客户端完成,因此mysql服务器的内存使用不是问题(3)。