Экранирование цитат в php - PullRequest
1 голос
/ 22 марта 2011

Как мне избежать кавычек в php при попытке запроса базы данных mysql.Без добавления надстроек на каждое значение:

$fname=addslashes("Value's with quote''s'");
$lname=addslashes("Value's with quote''s'");

Ответы [ 4 ]

3 голосов
/ 22 марта 2011

Правильным способом является использование подготовленных операторов, например, через PDO.

Если вы не можете этого сделать, вам нужно обработать все значения, которые передаются в запрос к базе данных с помощью mysql_real_escape_string() - и нет, делать это просто на всех $_POST данных нельзя, поскольку это сделает их непригодными для вывода в формате HTML и т. Д. Вы можете создать $_ESC или что-то подобное, хотя ... но обратите внимание, что эта переменная не будетбудь суперглобальным!

3 голосов
/ 22 марта 2011

Вы должны экранировать специальные символы (не только кавычки) для каждого строкового значения (бесполезно экранировать значения, которые вы не собираетесь заключать в кавычки в запросе, эти значения требуют другого обращения).

Чтобы избежать скучной повторяющейся типизации, вы можете применить экранирующую функцию к элементам массива в цикле.

если вы используете Mysql и для запросов INSERT / UPDATE вы можете использовать эту вспомогательную функцию

function dbSet($fields) {
  $set='';
  foreach ($fields as $field) {
    if (isset($_POST[$field])) {
      $set.="`$field`='".mysql_real_escape_string($_POST[$field])."', ";
    }
  }
  return substr($set, 0, -2); 
}

используется так

$id     = intval($_POST['id']);
$table  = 'users';
$fields = explode(" ","name surname lastname address zip fax phone");
$query  = "UPDATE `$table` SET ".dbSet($fields).", `date`=NOW() WHERE id=$id";

также не забудьте установить правильную кодировку, используя mysql_set_charset(), как это требуется для mysql_real_escape_string ()

2 голосов
/ 22 марта 2011

Хорошая идея - использовать подготовленные операторы PDO, как описано здесь .

. Эти символы будут автоматически экранироваться.

1 голос
/ 22 марта 2011

Во-первых, не используйте addslashes() - его не рекомендуется использовать для экранирования строк запроса БД, потому что он не экранирует все, что действительно необходимо экранировать; есть некоторые персонажи, которые еще могут пройти.

Правильное решение зависит от базы данных, которую вы используете. Предполагая, что вы используете MySQL, правильная функция вместо addslashes() - mysql_real_escape_string().

Вы, вероятно, заметили, что использование этого в каждой строке даже более многословно, чем addslashes(), поэтому оно не отвечает на ваш вопрос.

Если все ваши поля представляют собой отдельные переменные (в соответствии с вашим примером), то вы действительно застряли с этим для нескольких строк кода.

Если вы используете массив (например, $_POST), то вы можете сделать это в цикле, который сделает вещи намного лучше - вы можете сделать что-то вроде этого:

foreach($_POST as $key=>$value) {
    $sqlstrings[$key]="`".$key"` = '".mysql_real_escape_string($value)."'";
}
$sql = "update table ".implode(' ',$sqlstrings)." where id=".$update_id;

Более современный метод для выполнения SQL - использовать объектную модель, а не строить запросы вручную. PHP имеет ряд библиотек, которые могут помочь: mysqli - улучшенная библиотека MySQL, а PDO - библиотека, не зависящая от базы данных. Любой из них обеспечит вам гораздо большую безопасность и гибкость, чем непосредственное построение кода SQL. Однако, если у вас уже есть много кода на месте, они будут представлять довольно значительные накладные расходы на изменения кода, так что вы можете использовать опцию mysql_real_escape_string(), рассмотренную выше, в краткосрочной перспективе. Я рекомендую вложить их, хотя.

...