如果绑定参数,是否必须使用mysql_real_escape_string?

时间:2010-02-17 20:54:26

标签: php sql mysql sql-injection mysql-real-escape-string

我有以下代码:

function dbPublish($status)
{
 global $dbcon, $dbtable;

 if(isset($_GET['itemId']))
 {
  $sqlQuery = 'UPDATE ' . $dbtable . ' SET active = ? WHERE id = ?';
  $stmt = $dbcon->prepare($sqlQuery);
  $stmt->bind_param('ii', $status, $_GET['itemId']);
  $stmt->execute();
  $stmt->close();
 }
}

在这种情况下我需要mysql_real_escape_string还是我还好吗?

3 个答案:

答案 0 :(得分:27)

不,当你使用预准备语句时,你不必自己逃避价值(即你不需要调用mysqli_real_escape_string:数据库引擎会做本身。

(实际上,如果你正在调用mysql_real_escape_string并使用绑定参数,你的字符串将被转义两次 - 这不会很好:你最终会在任何地方转义字符......)


作为旁注:您的值以整数(由'ii'表示,因此即使您没有使用准备,也不必调用mysql_real_escape_string语句:如其名称所示,此函数用于转义...字符串。

对于整数,我通常只使用intval来确保我注入SQL查询的数据确实是整数。

(但是,当您使用准备好的查询时,再一次,您不必自己逃避这种情况)

答案 1 :(得分:1)

不,你不能。结合这两者就会产生 显示在数据中的可见转义字符。

答案 2 :(得分:0)

function dbPublish($status)    
{    
 global $dbcon, $dbtable;    

 if(isset($_GET['itemId']))    
 {    
  $sqlQuery = 'UPDATE ' . $dbtable . ' SET active = ? WHERE id = ?';    
  $stmt = $dbcon->prepare($sqlQuery);    
  $stmt->bind_param('ii', $status, $_GET['itemId']);    
  $stmt->execute();    
  $stmt->close();    
 }    
}