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
Думал не беда, по идее при выводе из БД спец символы должны преобразовывать обратно в перевод строки, оказалось беда, вывожу из БД, у меня выводится так же, как записано
Цитата:
Трава зеленая\r\nЗеленая трава
Как с этим бороться?
caballero
Отправлено: 08 Января, 2014 - 19:11:10
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Покинул форум
Сообщений всего: 41
Дата рег-ции: Дек. 2013
Помог: 0 раз(а)
caballero пишет:
попробуйте nl2br
Не помогает, что с ним, что без него, результат одинаковый
DelphinPRO
Отправлено: 08 Января, 2014 - 20:40:44
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
nl2br делали перед обработкой real_escape_string?
----- Чем больше узнаю, тем больше я не знаю.
wget
Отправлено: 08 Января, 2014 - 20:46:57
Новичок
Покинул форум
Сообщений всего: 41
Дата рег-ции: Дек. 2013
Помог: 0 раз(а)
DelphinPRO,
нет, просто прогоняю полученный постом текст через mysqli_real_escape_string, strip_tags, trim и закидываю в базу, а потом просто вывожу без обработок. strip_tags и trim убирал, от них ничего не зависит...
DelphinPRO
Отправлено: 08 Января, 2014 - 22:17:51
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
вообще странно, что real_escape так себя ведет.
Вы проверьте какие данные у вас непосредственно перед обработкой данной функцией.
Ну и дальше на всех этапах.
----- Чем больше узнаю, тем больше я не знаю.
wget
Отправлено: 08 Января, 2014 - 22:34:01
Новичок
Покинул форум
Сообщений всего: 41
Дата рег-ции: Дек. 2013
Покинул форум
Сообщений всего: 41
Дата рег-ции: Дек. 2013
Помог: 0 раз(а)
DelphinPRO,
выводит такую ахинею в одну строку (в бд записывает тоже самое)
Строка 1<br />\r\nСтрока 2
MAXUS
Отправлено: 08 Января, 2014 - 23:14:44
Посетитель
Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011
Помог: 7 раз(а)
wget пишет:
В первом случае выводит
Строка 1
Строка 2
Во втором
Строка 1\r\nСтрока 2 - так и записывает в БД, в таком виде и выводит....
Дело таки в real_string, но почему?....
Простите, щас, может, тупану, но может, и нет. А задача у real_escape_string какая? Экранировать спецсимволы, в тч и nr. Она это и делает. Они там, скорее всего с двойным слэшэм в базу и записываются. При выводе в браузер два слэша дают один на экран и потом n или r. Чтобы картину четко увидеть надо через phpmyadmin в базу глянуть, а еще лучше выводить не в браузер, а в лог файл.
Если тупанул, то не судите строго.
Добавление. nr браузер все равно проигнорирует, поэтому если это все-таки из базы в браузер будет выводиться, надо nr сразу при записи заменять на html тэг br...
Еще добавление...
Хотя, конечно, отчасти, скорее всего тупанул-таки
Но суть в том, что в базе скорее всего два слэша. Может, два раза ескейпируется при записи где-нибудь еще?
Покинул форум
Сообщений всего: 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.
Покинул форум
Сообщений всего: 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 хочешь добиться чего-то прямо противоположного тому, что она должна делать Ты возьми и запиши в базу просто как есть, без эскейпирования. И удивишься, потому что твоя проблема неожиданным образом решится
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
MAXUS пишет:
Ты возьми и запиши в базу просто как есть, без эскейпирования.
Привет, инъекция
----- Чем больше узнаю, тем больше я не знаю.
MAXUS
Отправлено: 09 Января, 2014 - 06:19:44
Посетитель
Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011
Помог: 7 раз(а)
DelphinPRO пишет:
MAXUS пишет:
Ты возьми и запиши в базу просто как есть, без эскейпирования.
Привет, инъекция
Не, ну инъекция, конечно, привет Но зато человек увидит, что на самом деле происходит.
Потому я, в том числе, и предлагаю перенос строк сразу превращать в <br />. Ну, или как вариант, при выводе делать обратную обработку...
wget
Отправлено: 09 Января, 2014 - 12:29:27
Новичок
Покинул форум
Сообщений всего: 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 пишет:
Ты возьми и запиши в базу просто как есть, без эскейпирования. И удивишься, потому что твоя проблема неожиданным образом решится
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.