Выход из кавычек в php
Как избежать кавычек в php при попытке запроса базы данных MySQL. Без добавления надстроек на каждое значение:
$fname=addslashes("Value's with quote''s'");
$lname=addslashes("Value's with quote''s'");
4 ответа
Вы должны экранировать специальные символы (не только кавычки) в каждом строковом значении (бесполезно экранировать значения, которые вы не собираетесь заключать в кавычки в запросе, эти значения требуют другой обработки).
Чтобы избежать скучной повторяющейся типизации, вы можете применить экранирующую функцию к элементам массива в цикле.
в случае, если вы используете 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()
Правильным способом является использование подготовленных заявлений, например, через PDO.
Если вы не можете сделать это, вы должны обработать все значения, которые передаются в запрос к базе данных с mysql_real_escape_string()
- и нет, просто так на всех $_POST
данные не являются опцией, так как это сделает их непригодными для вывода в формате HTML и т. д. Вы можете создать $_ESC
или что-то похожее, хотя... но обратите внимание, что эта переменная не будет суперглобальной!
Хорошей идеей будет использование подготовленных заявлений PDO, как описано здесь.
Это автоматически уберет тех персонажей.
Во-первых, не используйте 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()
вариант рассмотрен выше в краткосрочной перспективе. Я рекомендую вложить их в них, хотя.