Блог Александра Башкирова

ИТ и бизнес, компьютеры и ПО, фото, программирование и просто мысли…
Этот сайт в основном посвящен тому, что мне интересно вне работы. Ведется в порядке хобби.
Все изложенное на сайте - мое частное оценочное мнение и не может быть истолковано иначе.
Со всеми вытекающими из этого последствиями.

mysql

Подписаться на эту метку по RSS

Неудобство addslashes в php

Просмотров: 3947Комментарии: 0
Alib.spb.ru

Для корректной работы с базами данных в 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('"', "&#034",$b);
$b = str_replace("'", "&#039",$b);
$b = str_replace("`", "&#096",$b);
$b = str_replace("'", "&#145",$b);
$b = str_replace("'", "&#146",$b);
$b = str_replace(""", "&#147",$b);
$b = str_replace(""", "&#148",$b);
return $b;
}

"Прогнав" через эту функцию тот же Hello, "World"!!! , мы получим следующую строку: Hello, &#034World&#034!!! , которая спокойно включается в запрос к БД, и не вызывает ошибок.

PS. Для того, чтобы поправить то, что есть в mysql, я использовал функцию mysql REPLACE

UPDATE table_name SET val_field = REPLACE( val_field ,'\\\\"','&#034');
UPDATE
table_name SET val_field = REPLACE( val_field ,'\\\"','&#034');
UPDATE
table_name SET val_field = REPLACE( val_field ,'\\"','&#034');
UPDATE
table_name SET val_field = REPLACE( val_field ,'\"','&#034');

Этих запросов должно быть выполнено столько раз, сколько максимально есть слешей в тексте.