Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Что может быть со слешами?


Автор: VotVam 16.8.2009, 14:22
Ситуация такова. Есть стандартный скрипт SMF по открытию топиков в форуме. Добавил в него одно поле "descr" и полностью продублировал его свойства и поведение с поля "subject", т.к. назначения сходны (как здесь - тема и описание темы). На локали проверяю - все работает как часы. Ставлю на сервер - начинают сыпать ошибки. Если в общих чертах, то кавычки в поле "descr" приводят к появлению двойных обратных слешей, что ведет к ошибке записи в базу. Убираю двойные слеши stripslashes(), после этого addslashes() как бы "не видит" кавычки и опять ошибка. Кодировка на сервере выствавлена принудительно Windows 1251.
  Вопрос: откуда берется двойной слеш возле двойной кавычки именно на сервере и как с этим бороться? Повторюсь: на локали все летает.

Автор: Ипатьев 16.8.2009, 14:41
Двойной слеш берется от волшебных кавычек. 
При этом ошибки быть не должно, ни в том, ни в другом случае. Следовательно, виновата неправильная обработка входящих данных. 
Подробнее сказать нельзя, поскольку кое-кто не сообразил сообщить, какая именно ошибка возникает, и в каком виде данные попадают в запрос.

Автор: VotVam 16.8.2009, 15:22
magic - все три off, да я еще и в хтакцесс их придушил. Скрипт вылетает с ошибкой hack... и т.д., но это искать лениво - что именно срабатывает . А запись в базу пытается производить типа descr='Я вам \\"пишу\\" - чего же боле?'. Если я убиваю слеши stripslashes(), то после этого addslashes() уже не срабатывает и в базу лезет descr='Я вам "пишу" - чего же боле?'. Я вроде все внятно описал.

Автор: Ипатьев 16.8.2009, 15:37
Цитата(VotVam @  16.8.2009,  15:22 Найти цитируемый пост)
но это искать лениво - что именно срабатывает

Бесподобно.

Как же, все-таки, неожиданно мало на этом форуме программистов...

Автор: VotVam 16.8.2009, 15:40
А чему удивляться? Сборка SMF ~ 5мб кода. На кой хрен его лопатить, если видно: в чем проблема?

Автор: Ипатьев 16.8.2009, 15:47
И то правда. Тем более - можно себе представить - какого кода. 

Автор: VotVam 16.8.2009, 16:12
Да код-то как раз нормальный. Проблема не в нем - 100%. Скорее всего что-то криво на этом сервере (так же как и сессии), а что - вот бы хотелось что понять? Почему не срабатывает addslashes()? Почему не срабатывает mysql_real_escape_string()? Тут или кодировка не того, или вообще уже не пойму где. А код я проверил - там даже есть защита от "\\", только она тоже не срабатывает. Следовательно язык, с которым сервер общается с мускулом - арабо-китайский - твоя моя не понимай.

Автор: nerezus 16.8.2009, 18:40
Цитата

Вопрос: откуда берется двойной слеш возле двойной кавычки именно на сервере и как с этим бороться? Повторюсь: на локали все летает.
 Ошибка в движке.
Если сервер настроен криво и добавляет \, то перед ней при обработке тоже бы добавлялась \ и ошибок бы не было.


Цитата

 Если я убиваю слеши stripslashes(), то после этого addslashes() уже не срабатывает и в базу лезет descr='Я вам "пишу" - чего же боле?'. Я вроде все внятно описал.
 Забудь эти функции применительно к SQL.

Цитата

но это искать лениво - что именно срабатывает
 Есть вариант возмездной доработки скрипта.

Цитата

Да код-то как раз нормальный. Проблема не в нем - 100%. 
 Не факт.

Цитата

Почему не срабатывает addslashes()?
 А нахрен он тут нужен?

Выложи phpinfo.

Автор: VotVam 16.8.2009, 18:59
Если бы мне нужна была чья-то доработка - я бы взял готовый скрипт типа  IPB и не лез бы никуда. Я специально связался с SMF, потому что там все на функциях и все понятно как божий день. Поэтому когда пишешь addslashes() (кстати от балды первое, что пришло в голову - то и сунул), то на локали тут же срабатывает. Причем на локали вообще без всяких костылей все работает, как-будто кавычек и нет вовсе. Проблемы начинаются на сервере. Во-первых, появляется этот двойной слеш, хотя обработка "ошибочной" переменной идет наравне с другими переменными. А потом, при попытке убить этот слеш, или совсем убираются слеши или остается также. Что это за поведение PHP? Я до сих пор грешу на сессии, которые все еще не могу добиться, чтобы писались как надо (папка на сервере для просмотра недоступна и идентификатор периодически вываливается в строку запроса). Сначала поправлю сессии, а потом буду методично перебирать все, что уже наизменял в SMF. Я просто думал, что кто-то сталкивался с такой ерундой, поэтому и написал тут. 

Автор: Ипатьев 16.8.2009, 19:25
Цитата(nerezus @  16.8.2009,  18:40 Найти цитируемый пост)
Если сервер настроен криво и добавляет \, то перед ней при обработке тоже бы добавлялась \ и ошибок бы не было.

Тут смешнее. Сначала я тоже думал, что речь идет об ошибке SQL. Но оказалось-то, что ошибка, о которой идет речь - это результат титанических усилий команды разработчиков:
Цитата(VotVam @  16.8.2009,  15:22 Найти цитируемый пост)
Скрипт вылетает с ошибкой hack...





Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)