Для корректной работы с базами данных в php предусмотрена чудесная функция: addslashes. Делает она одну-единственную, но очень полезную вещь: экранирует кавычки слешами так, чтобы БД при работе со строками, где встречаюьтся кавычки, отрабатывала корректно.
Пример: допустим, в php-скрипт в переменной $_POST['val']
пришло значение Hello, "World"!!!
После обработки addslashes в этой переменной будет содержаться Hello, \"World\"!!!
,что гарантирует, что запрос к БД вида INSERT INTO table_name SET value="Hello, \"World\"!!!" будет выполнен корректно.
Пока вроде все красиво :) Проблема же состоит в том, что при разработке интерфейсов, в которых требуется частое редактирование данных, слеши накапливаются: при следующем "прогоне" через addslashes строа Hello, \"World\"!!!
превратится в Hello, \\"World\\"!!!
и так далее.
Решений может быть несколько.Можно, например, в скрипте "отлавливать" наличие экранированных слешей, "разэкрантировать" их обратно. Но недавно меня осенило. Можно заменять кавычки соответствующими символами html, которые и в базу пойдут без проблем, и отображаются как надо. Итогом размышлений стала следующая php-функция:
function safesql_str_code($b='')
{
if ($b=='') {return;}
$b = str_replace('"', """,$b);
$b = str_replace("'", "'",$b);
$b = str_replace("`", "`",$b);
$b = str_replace("'", "‘",$b);
$b = str_replace("'", "’",$b);
$b = str_replace(""", "“",$b);
$b = str_replace(""", "”",$b);
return $b;
}
"Прогнав" через эту функцию тот же Hello, "World"!!!
, мы получим следующую строку: Hello, "World"!!!
, которая спокойно включается в запрос к БД, и не вызывает ошибок.
PS. Для того, чтобы поправить то, что есть в mysql, я использовал функцию mysql REPLACE
UPDATE table_name SET val_field = REPLACE(
val_field
,'\\\\"','"');
UPDATE
table_name
SET
val_field
= REPLACE(
val_field
,'\\\"','"');
UPDATE
table_name
SET
val_field
= REPLACE(
val_field
,'\\"','"');
UPDATE
table_name
SET
val_field
= REPLACE(
val_field
,'\"','"');
Этих запросов должно быть выполнено столько раз, сколько максимально есть слешей в тексте.