关于查询的mysql_real_escape

时间:2010-12-12 17:45:49

标签: php mysql

mysql_real_escape是否应该将变量用于所有对数据库的查询?

3 个答案:

答案 0 :(得分:5)

是的,总是转义您传递给查询的变量。

更好的是,使用PDO

<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>

这样您就不需要处理转义(除非您有需要特别小心的查询)。

但如果你坚持使用MySQL扩展,那么使用mysql_real_escape_string()

答案 1 :(得分:2)

您是否始终保护查询参数?是的。
你应该总是使用mysql_real_escape_string吗?否。

如果您不打算使用prepared statements,请考虑使用mysqli_real_escape(请注意 i 改进)对包含的字符串进行编码NUL(ASCII 0),\n\r\'"和Control-Z。但是,可能需要采取其他预防措施。

MySQLi是现在积极开发的mysql扩展。旧的MySQL扩展只会偶尔出现错误修正,但现在已经有一段时间不再开发了。

请参阅DevZone 上的这两个教程(但同时请注意,这两篇文章都是按照互联网标准来说很古老)

答案 2 :(得分:1)

是的,出于安全原因,您应该转义所有变量。转义数字等不会改变任何东西,所以逃避它们也没有问题。你应该逃避一切,因为你可能会意外地错过任何变量。我建议使用PHP的mysql_real_escape_string()-function或PDO的prepared statements