Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужен совет по переводу сайта на ин. языки, Более правильный 
V
    Опции темы
Kefir
Дата 14.2.2006, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 13
Всего: 87



rodendron,
Цитата

Я когда писал диплом - вылавливал данные из форм так:
$lang = $_GET['lang'] или
$lang = $_POST['lang']

Это связано в тем, что в ПХП.ини есть такой опшн - register_globals ( = On/Off). Если он включён, то для каждого элемента, например, $_POST, будет создана переменная с именем равным ключу (если есть $_POST['lang'], то будет создана переменная $lang с точно таким же значением). Это фича выключена на большинстве хостингов. Всегда используй $_POST/$_GET а не надуйся на включённые register_globals.
Добавлено @ 01:06
Цитата
А второй вопрос - от "...?PHPSESSID=0dd036d784580773d14be950db2b4401" никак нельзя избавиться?

Тут дело в том, что у ПХП невелик выбор способов запоминания SID (номер сессии): или печеньки, или передавать в УРЛе. если ты не хочешь, чтобы ПХП передавал этот номер в УРЛе, тогда надо сделать так:
Код
ini_set('url_rewriter.tags', ''); 
ini_set('session.use_trans_sid', false);
ini_set('session.use_only_cookies', true);

Неудобство в том, что если куки отключены - то сессии работать не будут.

Это сообщение отредактировал(а) Kefir - 14.2.2006, 01:24
PM MAIL WWW Skype   Вверх
rodendron
Дата 14.2.2006, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 152
Регистрация: 22.3.2005

Репутация: нет
Всего: нет



Цитата(Kefir @ 14.2.2006, 01:05)

А где ты это видишь?

В строке браузера когда осуществляю перехрд по ссылке.
Скажем так - сразу после 1-ого перехода по ссылке.
PM MAIL   Вверх
Kefir
Дата 14.2.2006, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 13
Всего: 87



rodendron, см. моё предыдущее сообщение smile
Добавлено @ 01:26
Подробнее тут
PM MAIL WWW Skype   Вверх
rodendron
Дата 14.2.2006, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 152
Регистрация: 22.3.2005

Репутация: нет
Всего: нет



Kefir,
Еще раз спасибо тебе огромное! Подрасту - повышу тебе обязательно репутацию;)

По поводу строчки в алресе я все понял. Жаль, но к куки мне привязываться нельзя. Так что оставлю как есть.
PM MAIL   Вверх
rodendron
Дата 14.2.2006, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 152
Регистрация: 22.3.2005

Репутация: нет
Всего: нет



Kefir,

Бдмн нмкак мне не везет...
Сдаюсь...
Когда ручками в строке браузера набивал DE - он мне менял язык, сейчас сделал по ссылке - он в никакую.........

?lang=DE&PHPSESSID=a999476c09237943b35e8ae93854505d

$lang все равно рано EN...

ставлю руками ?lang=DE и нажимаю enter - у меня все ок!

Получается что когда есть сессия переменная не перезаписывается? Или я лпять что-то не так делаю?



---
Все решилось. Хостер зараза в это время чудил. Сорьки.

Еще раз чпачибо!

Это сообщение отредактировал(а) rodendron - 14.2.2006, 02:01
PM MAIL   Вверх
Dave
Дата 14.2.2006, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 17.6.2004

Репутация: -1
Всего: 1



Цитата(rodendron @ 14.2.2006, 00:41 Найти цитируемый пост)
Я когда писал диплом - вылавливал данные из форм так:

$lang = $_GET['lang'] или
$lang = $_POST['lang']

Сечас столкнулся с тем, что можно это не определять. То есть просто использовать в программе $lang и он сам его определяет. Это с чем может быть связано?

Это связано с настройками пхп, а именно register_globals, у тебя эта опция включена, почитай про эту опцию и все станет ясно.
PM MAIL   Вверх
CoderUA
Дата 14.2.2006, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 17.10.2005
Где: Ukraine

Репутация: нет
Всего: нет



Подскажите, плиз, где можно детальнее почитать про организацию мультиязычного движка?
Добавлено @ 22:20
По поводу эмуляции директивы register_globals on

Если есть необходимость, то можно почитать!!!

Есть в PHP такая интересная директива, под названием register_globals, определенная в php.ini. Директива указывает компилятору, что значения входящих (глобальных) переменных следует изъять из их системных массивов и представить в виде самостоятельных переменных. К таким данным относится все, что передается в скрипт "снаружи": данные из форм, данные из URL, cookie и так далее. Лично мне эта директива нравится, ибо она экономит время написания скриптов и делает их более читаемыми. Сравните сами, что выглядит приятнее и удобнее для глаза:
Здравствуйте, уважаемый <?=$_COOKIE['username']>>, мы рады вам!

Здравствуйте, уважаемый <?=$username?>, мы рады вам!
Вообще, лично я люблю PHP в основном за его удобочитаемость и быстрое написание.
Тем не менее, в каждой удобной фишке обязательно таится какая-нибудь гадость. Не обошлось без неприятностей и с регистрацией глобальных переменных. Невнимательные программисты оставляли в своих скриптах дыры, которые можно было обнаружить и использовать со стороны пользователя. Проще говоря, если переменная внутри скрипта участвовала в работе, но не устанавливалась этим же скриптом, ее можно было установить "снаружи", передав ее имя и значение в скрипт через URL, cookie или еще как-нибудь.
Эта дыра, которую записали в разряд "дыр в PHP" лично я считаю дырой в программировании, а не в языке, вынудила разработчиков PHP рекомендовать отключение register_globals. Что тут же было воспринято общественность как руководство к действию: все стали выключать регистрацию глобальных переменных на своих серверах.
Может быть это и не так уж плохо, судить не буду, ведь ради безопасности иногда возводят и городят гораздо больше, чем код самой задачи.
Но повальный отказ от регистрации глобальных переменных привело к новой проблеме - многие скрипты надо переписывать чуть ли не с нуля, ибо надо проверить каждую строку, найти все используемые переменные и поменять их на "защищенные" аналоги.
Насколько я понимаю, подобная задача, в конце концов, сводится к тому, чтобы в начале работы скрипта присвоить привычным переменным их значения из глобальных массивов $_REQUEST, $_POST, $_GET, $_COOKIE, $_SERVER и т.д.
Так к чему же я веду. А вот к чему... Нормальный программист не должен допускать дыр в своих скриптах, подобных дырам на основе автоматической регистрации глобальных переменных, но разве это будет волновать администратора сервера, на котором решено разместить код? Нет, это его не волнует и он по-своему прав.
Поэтому, если вы написали на заказ программу с использованием глобальных переменных, а заказчик решил установить ее на сервере, где запрещена их регистрация, то ничего работать не будет - у вас проблемы.
Если вы решили перенести все свои проекты на новый хостинг, а провайдер запрещает использовать регистрацию глобальных переменных - у вас проблемы.
Как быть? Не вычитывать же десятки, сотни, а иногда и тысячи страниц кода в поисках использования глобальных переменных.
Я предлагаю следующее решение. Надо просто эмулировать работу register_globals в одном отдельно взятом скрипте или в начале объектно-ориентированной стркутуры.
Как это сделать. Да не очень уж и сложно. Давайте рассуждать логически: имена переменных и их значения содержатся в соответствующих глобальных массивах. Как правило, используется массив $_REQUEST, который объединяет в себе все переменных GET, POST и COOKIE. Т.е. все, что передается скрипту из браузера, то, с чем работают скрипты.
Значит, надо извлечь из массива имена переменных, значения переменных и присвоить первому - второе. Извлечь - не проблема, для этого подойдет функция перебора всех ячеек массива foreach(), но как присвоить? Если у нас в $_REQUEST[username] содержится "atos", то как программно создать переменную $username со значением "atos"? Мы же не можем заранее знать, какие имена переменных будут в массиве $_REQUEST.
Вот тут нам поможет изумительная функция eval(), которая редко используется в обычном программировании, но буквально незаменима в некоторых случаях. О самой функции стоит написать отдельно, поэтому скажу только пару слов для тех, кто с ней не знаком.
Функция eval() заставляет PHP рассматривать обыкновенный текст, содержащийся в переменной, как фрагмент PHP-кода. Говоря языком примеров, результаты работы строк
echo 'Hello, User!';
и
Код

eval("echo 'Hello, User!';")

будет идентичными.
Вот eval() и поможет нам объявить все переменные из массива $_REQUEST. Выглядит это совсем коротко:
Код

foreach($_REQUEST as $k=>$v)
{
 eval("$$k='$v';");
}

Вставьте этот цикл в самом начале вашего скрипта; он переберет массив глобальных переменных и объявит их не хуже register_globals. А может быть даже и лучше, т.к. глобальных массивов много, а вытаскивать переменные не обязательно из всех. Как правило, данных из массива $_REQUEST - вполне достаточно.
Однако, не стоит забывать и о безопасности вашего кода. Обратите внимание на специфику работы функции eval() - она обработает весь код, переданный ей в качестве параметра. Будьте осторожны, примите меры безопастности, чтобы злоумышленник не подсунул в качестве названия или содержимого переменной кусок своего php-кода или просто неверные данные, способные вызвать ошибку (например, имя переменной, начинающее с цифры или другого неразрешенного символа).
09.02.2003
P.S. После опубликования этой заметки, на форуме не один раз высказывались мысли о том, что вариант с eval() - не самый лучший. Лично я предпочитаю оставлять для себя "путь к отступлению", и eval() как раз привлекателен тем, что позволяет полностью контролировать процесс, добавляя необходимые проверки и ограничения в процедуру или наоборот - расширяя возможности кода. Например, можно добавить логирование регистрации отдельных переменных, чтобы знать - кто, куда, откуда, зачем, или четко запретить к регистрации определенные имена переменных или другие данные.
Впрочем, у каждого метода есть свои плюсы и свои минусы - думайте сами, решайте сами - как поется в известной песне.
Метод "переменные переменных".

Код

foreach($_REQUEST as $k=>$v)
{
 $$k=$v;
}

Как видите, тоже простой метод, основанный на том, что значение переменной $k используется в качестве имени новой переменной. Удобно. Отличается автоматической регистрацией не только переменных, но и массивов. В случае с методом eval() придется проверять каждую переменную на is_array() и разворачивать (регистрировать) ее дополнительно, если такой массив вам нужен.
И самый простой метод - extract().
Весь код нашего примера будет выглядеть так:
extract($_REQUEST);
Это самый "тупой" метод, "разворачивающий" в переменные все, что содержится в массиве $_REQUEST. Нет абсолютно никакой гибкости в этом подходе - повлиять на регистрацию переменных или ввести какой-либо контроль вы не сможете, но выглядит очень лаконично.
И, наконец, не забывайте о том, что register_globals можно активировать не только в конфигурационном файле Apache, но и в файле .htaccess вашего сайта.

PM MAIL ICQ   Вверх
Kefir
Дата 14.2.2006, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 13
Всего: 87



CoderUA, давай теперь будем постить страницами тексты из мануалов и статей, информация в которых довольно однобокая. Акцию можно назвать "Зафлудим темы форума!". В следующий раз делай, пожалуйста так.
Например, утверждение о том, что extract - тупая и негибкая ф-ция - абсолютно голословно. Главное - правильно читать мануал.

И ещё - организация многоязычного сайта очень сходна с организацией обычного сайта. Появляется параметр языка и, естесственно встаёт вопрос кодировок - я предпочитаю утф (как и большинство). Если у тебя возникают вопросы по какому-то конкретному аспекту этого дела - создай новую тему и спрашивай там..

Это сообщение отредактировал(а) Kefir - 14.2.2006, 23:20
PM MAIL WWW Skype   Вверх
CoderUA
Дата 15.2.2006, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 17.10.2005
Где: Ukraine

Репутация: нет
Всего: нет



Kefir, сорри, у меня просто был текст, и я не знал откуда он, иначе естественно кинул бы линк!
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0849 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.