LINUX.ORG.RU

PHP: mysql_escape_string()


0

0

Есть ли функция обратная сабжевой?
При выводе информации обработанной функцией mysql_escape_string() отображаются \", \' и т.д.

Как провести обратное преобразование?

anonymous

mysql> create table t ( msg TEXT );
Query OK, 0 rows affected (0,01 sec)

mysql> insert into t (msg) VALUES ('\\ \'');
Query OK, 1 row affected (0,00 sec)

mysql> select * from t;
+------+
| msg  |
+------+
| \ '  |
+------+
1 row in set (0,00 sec)

devinull ★★
()
Ответ на: комментарий от devinull

Вы не поняли вопроса.
Основное внимание принадлежит PHP, а не MySQL.

Человек вводит данные через HTML-форму.
Я пропускаю введенные данные через mysql_escape_string().

Потом хочу отобразить то что он ввел. Если он употреблял спец-символы типа ' " и т.д., то они будут отображаться как \' \".

Как мне произвести обратное преобразование?

anonymous
()
Ответ на: комментарий от anonymous

Так Вы спец. символы с помошью mysql_escape_string() зачем экранируете? Наверное, для того, чтобы отправить эти данные в mysql таблицу. Так отправьте, а затем, когда Вы их из нее получите, экранирующих "\" не будет. Попробуйте сначала, а уж если они все-таки будут ( я сильно удивлюсь, у меня их нет ) покажите код.

devinull ★★
()
Ответ на: комментарий от devinull

Вот сохранение:

$query = 'INSERT INTO topics VALUES ("", "'.$forum_id.'", "'.$owner_id.'", "'.$f_title.'", "'.mysql_escape_string($f_body).'", "'.date('Y-m-d').'", "'.getenv("REMOTE_ADDR").'", "0", false)';
$result = mysql_query($query, $link);

anonymous
()
Ответ на: комментарий от devinull

Я читал про то что экранирование спец. символов не влияет на хранение текста в самой БД.

Но выходит обратное - при отображении в php скрипте получается \' \"

Может есть особые настройки MySQL?
У меня все настройки дефолтовые.

anonymous
()
Ответ на: комментарий от anonymous

Не влияет. Я не могу себе представить настроек, которые бы на это влияли, потому что с ними почти никакая программа работать не смогла бы.

devinull ★★
()
Ответ на: комментарий от anonymous

А дальше что?

$result=mysql_query("SELECT forum_id,owner_id,f_body from topics");
list($forum_id,$owner_id,$f_body)=mysql_fetch_row($result);
$f_body=nl2br($f_body);
echo $f_body; //выведет строку без экранирующих "\".

devinull ★★
()
Ответ на: комментарий от anonymous

Вообще, если все-таки Вы действительно их видите, возможно просто спец. символы экранируются дважды?

попробуйте в $f_body записать строку, содержащую одинарную кавычку, и сделать этот же запрос, но без mysql_escape_string(). Запрос должен заверниться ошибкой. Если так и будет, значит mysql_escape_string лишний раз вызывется еще где-то. Если нет - значит действительно некие настройки установлены, и из-за них спец. символы экранируются автоматически. Но я таких настроек на знаю и не могу найти никакого описания на эту тему. Думаю, что все-таки первое.

devinull ★★
()
Ответ на: комментарий от devinull

Что происходит вот здесь:

> list($forum_id,$owner_id,$f_body)=mysql_fetch_row($result);

?

Если написать тестовый скрипт:
<?

$db_host='localhost';
$db_login='root';
$db_passwd='fktyf';
$db_name='temp';

$string = 'Дурная "функция"!';
$link = mysql_connect($db_host, $db_login, $db_passwd) or die("Не могу соединиться");
mysql_select_db($db_name, $link);

$query = 'INSERT INTO temp VALUES("'.mysql_escape_string($string).'")';
mysql_query($query, $link);


$query = 'SELECT * FROM temp';
$result = mysql_query($query, $link);
$row = mysql_fetch_array($result);

echo $row['txt'];

?>

то все выводится как надо.
Делаю поиск в скрипте на слово escape, находит только одно упоминание, так что чудеса какие-то...

anonymous
()
Ответ на: комментарий от anonymous

Перед запросами БД делаю вот что:

$f_title = strip_tags($f_title);
$f_body = strip_tags($f_body);
$f_body = str_replace("\n", " <br> ", $f_body);

Это ведь не может повлиять?

anonymous
()
Ответ на: комментарий от anonymous

Вот я тормоз. При каких-то настройках кавычки экранируются в _GET и _POST. В том и разница. Если вы берете данные из них, то кавычки уже экранированы.

Вот решение:

if(get_magic_quotes_gpc()){
	function stripslashes_r(&$data){
	    foreach($data as $k=>$v){
	        if(is_array($v))
	            stripslashes_r($data[$k]);
	        else
	            $data[$k] = stripslashes($v);
	    }
	}

	stripslashes_r($_GET);
	stripslashes_r($_POST);
	stripslashes_r($_COOKIE);
	stripslashes_r($_REQUEST);
}

See also: get_magic_quotes_gpc(), mysql_fetch_row() ;-)

PS: обидно, я должен был раньше сообразить. Известные грабли.

devinull ★★
()
Ответ на: комментарий от anonymous

>Что происходит вот здесь:

из результата запроса вытаскивается один столбец и возвращается в виде неассоциативного массива, который раздирается на компоненты. Мне так удобнее. :) Подробности в доках на php :)

devinull ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.