Должен ли я использовать mysql_real_escape_string, если я связываю параметры? - PullRequest
17 голосов
/ 17 февраля 2010

У меня есть следующий код:

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 ]

27 голосов
/ 17 февраля 2010

Нет, вам не нужно экранировать значение самостоятельно (т. Е. Нет, вам не нужно вызывать mysqli_real_escape_string) , когда вы используете подготовленные операторы: механизм БД сделает это сам.

(На самом деле, если бы вы вызывали mysql_real_escape_string и использовали связанные параметры, ваши строки были бы экранированы дважды - что не было бы замечательно: вы бы в конечном итоге экранировали символы везде ...)


Как примечание: ваши значения передаются как целые числа (как указано 'ii') , поэтому вам не придется вызывать mysql_real_escape_string, даже если вы не использовали подготовленные операторы: в качестве его имени указывает, что эта функция используется для экранирования ... строк.

Для целых чисел я обычно просто использую intval, чтобы убедиться, что данные, которые я вставляю в свои SQL-запросы, действительно являются целыми числами.

(Но, поскольку вы используете подготовленные запросы, вам снова не нужно избегать этого)

1 голос
/ 17 февраля 2010

Нет, вы не должны. Объединение двух приведет в видимых escape-символах, отображаемых в ваших данных.

0 голосов
/ 25 марта 2010
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();    
 }    
}   
...