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
Форумы портала PHP.SU :: Версия для печати :: mysqli_real_escape_string выводятся \r\n
Форумы портала PHP.SU » » Работа с СУБД » mysqli_real_escape_string выводятся \r\n

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

1. wget - 08 Января, 2014 - 19:02:31 - перейти к сообщению
Принимаю данные постом, пропускаю через mysqli_real_escape_string и записываю в БД
Выглядит страндартно

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

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

Цитата:

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


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

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


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

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


Как с этим бороться?
2. caballero - 08 Января, 2014 - 19:11:10 - перейти к сообщению
попробуйте nl2br
3. wget - 08 Января, 2014 - 20:34:23 - перейти к сообщению
caballero пишет:
попробуйте nl2br


Не помогает, что с ним, что без него, результат одинаковый
4. DelphinPRO - 08 Января, 2014 - 20:40:44 - перейти к сообщению
nl2br делали перед обработкой real_escape_string?
5. wget - 08 Января, 2014 - 20:46:57 - перейти к сообщению
DelphinPRO,

нет, просто прогоняю полученный постом текст через mysqli_real_escape_string, strip_tags, trim и закидываю в базу, а потом просто вывожу без обработок. strip_tags и trim убирал, от них ничего не зависит...
6. DelphinPRO - 08 Января, 2014 - 22:17:51 - перейти к сообщению
вообще странно, что real_escape так себя ведет.
Вы проверьте какие данные у вас непосредственно перед обработкой данной функцией.
Ну и дальше на всех этапах.
7. wget - 08 Января, 2014 - 22:34:01 - перейти к сообщению
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, но почему?....
8. DelphinPRO - 08 Января, 2014 - 22:44:02 - перейти к сообщению
[cut]
(Добавление)


strip_tags - необязателен.
9. wget - 08 Января, 2014 - 23:05:25 - перейти к сообщению
DelphinPRO,

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

Строка 1<br />\r\nСтрока 2
10. MAXUS - 08 Января, 2014 - 23:14:44 - перейти к сообщению
wget пишет:


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

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

Во втором

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

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


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

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

Еще добавление...
Хотя, конечно, отчасти, скорее всего тупанул-такиУлыбка
Но суть в том, что в базе скорее всего два слэша. Может, два раза ескейпируется при записи где-нибудь еще?
11. wget - 08 Января, 2014 - 23:29:44 - перейти к сообщению
MAXUS,

Цитата:

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


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


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

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

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

В общем тупик мысли...
12. MAXUS - 09 Января, 2014 - 05:48:19 - перейти к сообщению
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 хочешь добиться чего-то прямо противоположного тому, что она должна делатьУлыбка Ты возьми и запиши в базу просто как есть, без эскейпирования. И удивишься, потому что твоя проблема неожиданным образом решитсяУлыбка
13. DelphinPRO - 09 Января, 2014 - 05:51:04 - перейти к сообщению
MAXUS пишет:
Ты возьми и запиши в базу просто как есть, без эскейпирования.
Привет, инъекция Голливудская улыбка
14. MAXUS - 09 Января, 2014 - 06:19:44 - перейти к сообщению
DelphinPRO пишет:
MAXUS пишет:
Ты возьми и запиши в базу просто как есть, без эскейпирования.
Привет, инъекция Голливудская улыбка


Не, ну инъекция, конечно, приветУлыбка Но зато человек увидит, что на самом деле происходит.
Потому я, в том числе, и предлагаю перенос строк сразу превращать в <br />. Ну, или как вариант, при выводе делать обратную обработку...
15. wget - 09 Января, 2014 - 12:29:27 - перейти к сообщению
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 пишет:

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


КЭП решает походу))

 

Powered by ExBB FM 1.0 RC1