Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблема с кавычками
 
 автор: babilonian   (24.09.2005 в 18:15)   письмо автору
 
 

Хотелось бы задать такой вопрос:
Есть определенный текст, посылаемый юзером из textarea

<form action='?action=add' method=POST>
<TEXTAREA NAME=user_text></TEXTAREA>
<input type=submit name='post' value='Добавить'>
</form>

Он передается обработчику, обрезается и пишется в файл:

if ($action == "add"){
if ($user_text != ""){
function replace ($text)
{
$path = ereg_replace ("<", "&#60;" ,$path);
$path = ereg_replace (">", "&#62;" ,$path);
$path = ereg_replace ("\r\n", "<br>" ,$path);
$path = ereg_replace ("\n", "<br>" ,$path);
return $text;
}
$user_text_new = replace ($user_text);
$fp = fopen ("kakoy-to-file.txt", "a+");
fputs ($fp, "$user_text_new\n");
fclose ($fp);
}
}

Проблема в том, что если в юзерском тексте есть кавычки, то они все заменяются на \" с последующим выводом. Откуда это берется, и можно ли это каким-нибудь образом исправить?
Заранее спасибо за ответ!

   
 
 автор: elenaki   (24.09.2005 в 18:34)   письмо автору
 
   для: babilonian   (24.09.2005 в 18:15)
 

magicquotes?

есть такая директива в php.ini
если она включена, ко всем кавычкам приделывается обратный слэш.


===================
За автоматическое добавление слешей отвечают директивы php.ini, которые носят общее название "волшебные кавычки":
magic_quotes_gpc и magic_quotes_runtime
Если включена первая, то PHP автоматически добавляет слеши к данным, пришедшим от пользователя - из POST, GET запросов и кук (а так же - к логину и паролю, полученным через HTTP Authorisation).
Если вторая, то слеши добавляются к данным, полученым во время исполнения скрипта - например, из файла или базы данных.

Как избавиться
Если вы работаете без базы данных, или же работаете с БД правильно (о чём будет написано ниже), лишние слеши вам только мешают, и от них надо избавляться. Проще и правильнее всего отключить автоматическое добавление, в настройках PHP.
Это можно сделать либо поправив соответствующие директивы в php.ini, если у вас есть к нему доступ, либо создав в коневом каталоге сайта файл .htaccess, и добавив в него строчки
php_flag magic_quotes_gpc 0
php_flag magic_quotes_runtime 0

Если отключить таким образом не получается, то придётся писать код разной степени сложности, чтобы очистить от слешей входящие данные.
С данными, получаемыми во время работы, разобраться проще всего: достаточно в начале скрипта написать
set_magic_quotes_runtime(0);
Для данных, полученных от пользователя, всё гораздо сложнее. Для этого кода нам потребуется две функции:

проверить, добавил ли PHP, можно с помощью функции get_magic_quotes_gpc.

удаляет слеши функция stripslashes.
Соответственно, с помощью первой надо проверить, и, если PHP добавил, то перебрать все входящие переменные и очистить с помощью второй.
Если вы работаете правильно, при register_globals = off, то достаточно применить stripslashes ко всем массивам, содержащим данные, приходящие из браузера.
к примеру, можно включить во все скрипты сайта вот такой код:
function strips(&$el) {
if (is_array($el))
foreach($el as $k=>$v)
strips($el[$k]);
else $el = stripslashes($el);
}
if (get_magic_quotes_gpc()) {
strips($_GET);
strips($_POST);
strips($_FILES);
strips($_COOKIE);
strips($_REQUEST);
if (isset($_SERVER['PHP_AUTH_USER'])) strips($_SERVER['PHP_AUTH_USER']);
if (isset($_SERVER['PHP_AUTH_PW'])) strips($_SERVER['PHP_AUTH_PW']);
}

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

=============================================

   
 
 автор: babilonian   (24.09.2005 в 19:22)   письмо автору
 
   для: elenaki   (24.09.2005 в 18:34)
 

Ага, дошло. Исправил
$text_new=stripslashes(replace($text));
Спасибо!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования