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]
Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009
Помог: 14 раз(а)
wget, если лишних слэшей не наблюдается, то можно вспомнить о том. что управляющие последовательности сработают в двойных кавычках. Это я в отношении вашего первого поста:
wget пишет:
выводится так же, как записано
Цитата:
Трава зеленая\r\nЗеленая трава
wget
Отправлено: 09 Января, 2014 - 15:20:28
Новичок
Покинул форум
Сообщений всего: 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.
Ушел думать над смыслом жизни...
DelphinPRO
Отправлено: 09 Января, 2014 - 21:37:57
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
wget пишет:
Я после mysqli_real_escape_string делал подготовленный запрос mysqli_prepare
Он и ломал мою строку, если делать с mysqli_real_escape_string и обычным mysqli_query то все в порядке.
НО, нигде, ни в каких мануалах нет упоминания о несовместимости этих функций...
Ну это же очевидно! При подготовке запроса производится эскейпирование.
Что ж вы сразу весь код не показали...
----- Чем больше узнаю, тем больше я не знаю.
MAXUS
Отправлено: 13 Января, 2014 - 05:55:54
Посетитель
Покинул форум
Сообщений всего: 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 я немного не в том направлении рассуждал. Конечно, если написать
то на выходе получишь Строка 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...
Оно уже никуда не преобразовывалось, а так и выводилось.
Ниже видно, что получается, если строки до эскейпирования и после (как ты делал в примере) перевести в код.
И, кстати, еще момент. nl2br() не заменяет последовательность chr(13).chr(10) на тэг <br />, а вставляет этот тэг перед. Получается "<br />".chr(13).chr(10). Вот так это становится очевидно:
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.