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 [2]

 PHP.SU

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


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

> Без описания
Мелкий Супермодератор
Отправлено: 09 Января, 2014 - 12:33:23
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Проверьте магические кавычки.
http://www.php.net/manual/en/sec....magicquotes.php


-----
PostgreSQL DBA
 
 Top
wget
Отправлено: 09 Января, 2014 - 13:20:09
Post Id


Новичок


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


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




Мелкий пишет:
Проверьте магические кавычки.
http://www.php.net/manual/en/security.magicquotes.php


Отключены, у меня php5.5, о них вообще нет напоминая в ini
На сервере 5.3, тоже отключены, та же самая проблема...
 
 Top
Deonis
Отправлено: 09 Января, 2014 - 14:07:52
Post Id



Посетитель


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


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




wget при выводе из базы, попробуйте обработать строки функцией stripslashes(), тогда, вполне возможно, что и nl2br() сработает.
 
 Top
wget
Отправлено: 09 Января, 2014 - 14:13:09
Post Id


Новичок


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


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




Deonis пишет:
wget при выводе из базы, попробуйте обработать строки функцией stripslashes(), тогда, вполне возможно, что и nl2br() сработает.


Делал, \r\n срезаются и нарушается форматирование, выводится несмотря на nl2br

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

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

 
 Top
Deonis
Отправлено: 09 Января, 2014 - 14:34:39
Post Id



Посетитель


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


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




wget, если лишних слэшей не наблюдается, то можно вспомнить о том. что управляющие последовательности сработают в двойных кавычках. Это я в отношении вашего первого поста:
wget пишет:
выводится так же, как записано
Цитата:
Трава зеленая\r\nЗеленая трава
 
 Top
wget
Отправлено: 09 Января, 2014 - 15:20:28
Post Id


Новичок


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


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




Ребят.... накопал....

Я после mysqli_real_escape_string делал подготовленный запрос mysqli_prepare
Он и ломал мою строку, если делать с mysqli_real_escape_string и обычным mysqli_query то все в порядке.

НО, нигде, ни в каких мануалах нет упоминания о несовместимости этих функций...

Только на Хабре в статье одного человека я нашел косвенный намек на это..

Цитата:

«Классические» запросы
В MySqli оставили возможность «классических» запросов: когда пользователю предлагается самостоятельно заниматься безопасностью передаваемых запросов так, как это было в устаревшем расширении MySQL. Для этого предлагается использовать функцию $mysqli->real_escape_string(), с помощью которой....

Подготовленные запросы
Преимущества подготовленных запросов над «классическими»:
При серии запросов, в которых меняются лишь данные, запрос передается на сервер только один раз, в дальнейшем посылаются только изменяющиеся данные;
Защита от SQL-инъекций.
За работу с подготовленными запросами в MySQLi отвечает класс mysqli_stmt.


Ушел думать над смыслом жизни...
 
 Top
DelphinPRO
Отправлено: 09 Января, 2014 - 21:37:57
Post Id



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


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


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




wget пишет:
Я после mysqli_real_escape_string делал подготовленный запрос mysqli_prepare
Он и ломал мою строку, если делать с mysqli_real_escape_string и обычным mysqli_query то все в порядке.

НО, нигде, ни в каких мануалах нет упоминания о несовместимости этих функций...


Ну это же очевидно! При подготовке запроса производится эскейпирование.

Что ж вы сразу весь код не показали...


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
MAXUS
Отправлено: 13 Января, 2014 - 05:55:54
Post Id


Посетитель


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


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




wget пишет:
Ребят.... накопал....

Я после mysqli_real_escape_string делал подготовленный запрос mysqli_prepare
Он и ломал мою строку, если делать с mysqli_real_escape_string и обычным mysqli_query то все в порядке.

НО, нигде, ни в каких мануалах нет упоминания о несовместимости этих функций...


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


Получается, что первое предположение было верным. Функции не несовместимы, просто в этом случае дублируют друг друга. Первым заходом экранирует \r\n, вторым - слэши. Т.е. все-таки два слэша. Потому в базу записывается chr(92).chr(114).chr(92).chr(110), а не chr(13).chr(10)... Соответственно, и выводится.

Хотя, с pre я немного не в том направлении рассуждал. Конечно, если написать
PHP:
скопировать код в буфер обмена
  1. echo "Строка 1\\r\\nСтрока 2"

то на выходе получишь Строка 1\r\nСтрока 2, но суть была не в этом.

Просто php, встретив в строке \r\n, преобразует их в chr(13).chr(10), поэтому
из "Строка 1\r\nСтрока 2" на выходе получается Строка 1.chr(13).chr(10).Строка 2,
а ты из базы получал Строка 1.chr(92).chr(114).chr(92).chr(110).Строка 2...
Оно уже никуда не преобразовывалось, а так и выводилось.

Ниже видно, что получается, если строки до эскейпирования и после (как ты делал в примере) перевести в код.

PHP:
скопировать код в буфер обмена
  1. $info="1\r\n2";
  2.  
  3. function to_chr($n) {
  4.         return ord($n);
  5. }
  6.  
  7. echo implode(", ", array_map("to_chr", str_split($info)))."<br />";
  8.  
  9. echo implode(", ", array_map("to_chr", str_split(mysqli_real_escape_string($mysqli, $info))));


Результат будет таким:

CODE (html):
скопировать код в буфер обмена
  1. 49, 13, 10, 50
  2. 49, 92, 114, 92, 110, 50


И, кстати, еще момент. nl2br() не заменяет последовательность chr(13).chr(10) на тэг <br />, а вставляет этот тэг перед. Получается "<br />".chr(13).chr(10). Вот так это становится очевидно:

PHP:
скопировать код в буфер обмена
  1. echo nl2br("1\r\n2");
  2.  
  3. echo "<pre>";
  4. echo nl2br("1\r\n2");
  5. echo "</pre>";


Поэтому оно тебе и не помогало.

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

 
 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