Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: mysqli_real_escape_string выводятся \r\n

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
wget
Отправлено: 08 Января, 2014 - 19:02:31
Post Id


Новичок


Покинул форум
Сообщений всего: 41
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




Принимаю данные постом, пропускаю через mysqli_real_escape_string и записываю в БД
Выглядит страндартно

$blabla = mysqli_real_escape_string($link, $_POST['blabla']);

У меня в переменной несколько строк

Цитата:

Трава зеленая
Зеленая трава


Все это дело записывается в БД в формате

Цитата:
Трава зеленая\r\nЗеленая трава


Думал не беда, по идее при выводе из БД спец символы должны преобразовывать обратно в перевод строки, оказалось беда, вывожу из БД, у меня выводится так же, как записано

Цитата:
Трава зеленая\r\nЗеленая трава


Как с этим бороться?
 
 Top
caballero
Отправлено: 08 Января, 2014 - 19:11:10
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




попробуйте nl2br


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
wget
Отправлено: 08 Января, 2014 - 20:34:23
Post Id


Новичок


Покинул форум
Сообщений всего: 41
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




caballero пишет:
попробуйте nl2br


Не помогает, что с ним, что без него, результат одинаковый
 
 Top
DelphinPRO
Отправлено: 08 Января, 2014 - 20:40:44
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




nl2br делали перед обработкой real_escape_string?


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
wget
Отправлено: 08 Января, 2014 - 20:46:57
Post Id


Новичок


Покинул форум
Сообщений всего: 41
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




DelphinPRO,

нет, просто прогоняю полученный постом текст через mysqli_real_escape_string, strip_tags, trim и закидываю в базу, а потом просто вывожу без обработок. strip_tags и trim убирал, от них ничего не зависит...
 
 Top
DelphinPRO
Отправлено: 08 Января, 2014 - 22:17:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




вообще странно, что real_escape так себя ведет.
Вы проверьте какие данные у вас непосредственно перед обработкой данной функцией.
Ну и дальше на всех этапах.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
wget
Отправлено: 08 Января, 2014 - 22:34:01
Post Id


Новичок


Покинул форум
Сообщений всего: 41
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




DelphinPRO,

чудеса, здесь еще нашел такую же проблему http://www[dot]sql[dot]ru/forum/738753/p[dot][dot][dot]ape-string-i-r-n и еще в одном месте и все.. тишина...Что за баг...

Проверил так, принимаю строку в пост запрос, кидаю в метод

PHP:
скопировать код в буфер обмена
  1.  
  2. if(isset($_POST['upload'])) {
  3. $info = $_POST['info'];
  4. $insertDB->upload($info);
  5. }
  6.  


И там вывел до проводки через real_string и после
PHP:
скопировать код в буфер обмена
  1.  
  2. function upload($info) {
  3. echo '<pre>';
  4. echo $info;
  5. echo '</pre>';
  6.  
  7. $info = self::clearString($info);
  8.  
  9. echo '<pre>';
  10. echo $info;
  11. echo '</pre>';
  12.  
  13. // Метод clearString
  14. function clearString($data) {
  15.     return mysqli_real_escape_string($this->link, trim(strip_tags($data));
  16. }
  17.  
  18. }
  19.  


В первом случае выводит

Строка 1
Строка 2

Во втором

Строка 1\r\nСтрока 2 - так и записывает в БД, в таком виде и выводит....

Дело таки в real_string, но почему?....

(Отредактировано автором: 08 Января, 2014 - 22:47:59)

 
 Top
DelphinPRO
Отправлено: 08 Января, 2014 - 22:44:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




[cut]
(Добавление)


strip_tags - необязателен.

(Отредактировано автором: 08 Января, 2014 - 22:45:55)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
wget
Отправлено: 08 Января, 2014 - 23:05:25
Post Id


Новичок


Покинул форум
Сообщений всего: 41
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




DelphinPRO,

выводит такую ахинею в одну строку (в бд записывает тоже самое)

Строка 1<br />\r\nСтрока 2
 
 Top
MAXUS
Отправлено: 08 Января, 2014 - 23:14:44
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




wget пишет:


В первом случае выводит

Строка 1
Строка 2

Во втором

Строка 1\r\nСтрока 2 - так и записывает в БД, в таком виде и выводит....

Дело таки в real_string, но почему?....


Простите, щас, может, тупану, но может, и нет. А задача у real_escape_string какая? Экранировать спецсимволы, в тч и nr. Она это и делает. Они там, скорее всего с двойным слэшэм в базу и записываются. При выводе в браузер два слэша дают один на экран и потом n или r. Чтобы картину четко увидеть надо через phpmyadmin в базу глянуть, а еще лучше выводить не в браузер, а в лог файл.
Если тупанул, то не судите строго.

Добавление. nr браузер все равно проигнорирует, поэтому если это все-таки из базы в браузер будет выводиться, надо nr сразу при записи заменять на html тэг br...

Еще добавление...
Хотя, конечно, отчасти, скорее всего тупанул-такиУлыбка
Но суть в том, что в базе скорее всего два слэша. Может, два раза ескейпируется при записи где-нибудь еще?

(Отредактировано автором: 08 Января, 2014 - 23:28:48)

 
 Top
wget
Отправлено: 08 Января, 2014 - 23:29:44
Post Id


Новичок


Покинул форум
Сообщений всего: 41
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




MAXUS,

Цитата:

Добавление. nr браузер все равно проигнорирует, поэтому если это все-таки из базы в браузер будет выводиться, надо nr сразу при записи заменять на html тэг br...


Этот костыль конечно можно использовать, но хочется как-то по человечески, тем более я так понимаю такой проблемы НЕ должно возникать в принципе.
А если другой хост, а там все нормально, кароче не вариант...
Хочется разобраться в чем проблема и как ее решить


(Добавление)
И ЕЩЕ

Между делом обнаружил, что несмотря на то, что у меня указание на uft8 установлено везде где только можно, соединение с базой данных шло через latin1, установка $this->link->query("SET NAMES uft8"); игнорировалась, заменил на $this->link->set_charset('utf8'), исправилась. Я уже подумал что Боги смилостивились... Не тут-то было.... Значит проблема не в кодировке.

magic_quotes в настройках php.ini отсутствуют, видимо вырезали в php5.5.

В общем тупик мысли...

(Отредактировано автором: 09 Января, 2014 - 01:13:59)

 
 Top
MAXUS
Отправлено: 09 Января, 2014 - 05:48:19
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




wget пишет:


Этот костыль конечно можно использовать, но хочется как-то по человечески, тем более я так понимаю такой проблемы НЕ должно возникать в принципе.
А если другой хост, а там все нормально, кароче не вариант...
Хочется разобраться в чем проблема и как ее решить



Ну, во-первых, это не костыль. Это не предложение в качестве решения твоей проблемы, а просто рациональное рассуждение. Если ты в дальнейшем собираешься выводить информацию в браузер (а не в алерты или в консоль через js), то смысла хранить в базе \r\n нет никакого, т.к. при выводе браузер их проигнорирует, а переноса строки не будет, т.к. он делается тэгом <br />... Если, конечно, ты не планируешь выводить все, оборачивая в <pre></pre>...

wget пишет:

В общем тупик мысли...


А во-вторых, я, собственно, не тупанул, а все правильно тебе сказал. Ты попробуй не долбиться апстену, а воспарить над проблемойУлыбка
Смотри, у тебя есть строка:

Строка 1\r\nСтрока 2

Ты ее выводишь в браузер через <pre> и получаешь:

Строка 1
Строка 2

Все верно. В тэге <pre> браузер воспринимает \r\n как полагается и делает перенос строки. Что ты делаешь дальше? Эскейпируешь \r\n и получаешь \\r\\n. Соответственно, в теге <pre>, выводя результат, получаешь:

Строка 1\r\nСтрока 2

Потому что вот это \\r браузер воспринимает как заэскейпированный слэш+буковка rУлыбка Так и выводит. Прям, как попросили. То же самое с \\n...

И в базу у тебя пишется то же самое. И выводится, соответственно. Ты просто от real_escape_string хочешь добиться чего-то прямо противоположного тому, что она должна делатьУлыбка Ты возьми и запиши в базу просто как есть, без эскейпирования. И удивишься, потому что твоя проблема неожиданным образом решитсяУлыбка

(Отредактировано автором: 09 Января, 2014 - 05:50:50)

 
 Top
DelphinPRO
Отправлено: 09 Января, 2014 - 05:51:04
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




MAXUS пишет:
Ты возьми и запиши в базу просто как есть, без эскейпирования.
Привет, инъекция Голливудская улыбка


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
MAXUS
Отправлено: 09 Января, 2014 - 06:19:44
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




DelphinPRO пишет:
MAXUS пишет:
Ты возьми и запиши в базу просто как есть, без эскейпирования.
Привет, инъекция Голливудская улыбка


Не, ну инъекция, конечно, приветУлыбка Но зато человек увидит, что на самом деле происходит.
Потому я, в том числе, и предлагаю перенос строк сразу превращать в <br />. Ну, или как вариант, при выводе делать обратную обработку...
 
 Top
wget
Отправлено: 09 Января, 2014 - 12:29:27
Post Id


Новичок


Покинул форум
Сообщений всего: 41
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




MAXUS пишет:

Ну, во-первых, это не костыль. Это не предложение в качестве решения твоей проблемы, а просто рациональное рассуждение. Если ты в дальнейшем собираешься выводить информацию в браузер (а не в алерты или в консоль через js), то смысла хранить в базе \r\n нет никакого, т.к. при выводе браузер их проигнорирует, а переноса строки не будет, т.к. он делается тэгом <br />... Если, конечно, ты не планируешь выводить все, оборачивая в <pre></pre>...


Я благодарю конечно за попытку помочь, но давай по порядку.
1) Я не собираюсь хранить в базе \r\n, он туда не должен записываться В ПРИНЦИПЕ.
Почитай мануал по real_escape_string, она подготавливает строку и прописывает в БД без слэшей и прочих конструкций типа \r\n. Если ты вносить в БД строку o'Shee, то она будет внесена как o'Shee, а не o\'Shee. У меня она вносится в БД со слэшами и \r\n в качестве перевода строки, что не должно быть.

MAXUS пишет:

А во-вторых, я, собственно, не тупанул, а все правильно тебе сказал. Ты попробуй не долбиться апстену, а воспарить над проблемойУлыбка
Смотри, у тебя есть строка:

Строка 1\r\nСтрока 2

Ты ее выводишь в браузер через <pre> и получаешь:

Строка 1
Строка 2


Я вывожу ее через <pre> и получаю Строка 1\r\nСтрока 2
В том-то и проблема, что ни на <pre>, ни как nl2br она не реагирует. html и php воспринимает как простую строку

MAXUS пишет:

Ты возьми и запиши в базу просто как есть, без эскейпирования. И удивишься, потому что твоя проблема неожиданным образом решитсяУлыбка


КЭП решает походу))
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB