- Сэнсэй объяснил мне несколько лет назад, -
внезапно промолвил водитель. - Что объяснил? - Телефон
Бога. Я перевел дух - так, чтобы он не слышал. Кто-то из
нас явно сходит с ума. Я? Или, может быть, он? - И что же,
он объяснил его только вам - и, наверное, под страшным
секретом? - Именно так. Только мне и по большому секрету.
Замечательный человек... А что - вы тоже хотите знать? -
Если это возможно, - вымолвил я. - Ну ладно, слушайте.
Токио, 945... - Секундочку! - попросил я, достал из кармана
ручку с блокнотом и записал номер.
Харуки Мураками. "Охота на
овец"
В серии статей товарища ;) Путяка были рассмотрены некоторые моменты JS, позволяющие
выполнять сборку страницы на стороне пользователя, как если бы это
выполнялось на стороне сервера с использованием серверных скриптов.
Тема, безусловно, заслуживает внимания. Ведь, даже не смотря на то,
что сегодня уже есть бесплатные хостинги с SSI и PHP - все они
вставляют свою рекламу. Те же хостинги, на которых реклама
отсутствует - не предоставляют возможность серверного скриптования.
Если на хостинге из разряда последних упомянутых применять сборку
страниц с помощью JS, тогда часто возникает необходимость в
JS-разборе строки URL-запроса, в вылавливании оттуда имен и значений
параметров. Делать это можно по-разному. Я хочу предложить читателю
свой простой и удобный способ, уходящий корнями в PHP.
В настройках PHP есть такой "не очень хороший" параметр, как
register_globals. Почему "не очень хороший"? А потому, что начиная с
версии PHP 4.2.0 его значение по умолчанию есть OFF, а до этого -
было ON. Вот и пришлось помучиться немного, пока разобрался, почему
сайт, работающий у меня на локале под PHP 4.0.3, не хотел работать
на сервере под PHP 4.3.6. А параметр-то этот управляет разрешением
на регистрацию в глобальном пространстве имен скрипта Environment-,
GET-, POST-, Cookie-, и Server-переменных. Вот и суть проблемы
оказалась в том, что строка URL-запроса не обрабатывалась
автоматически перед запуском скрипта, и переменные из URL не были
определены. Обошлось все как нельзя лучше. Вместо того, чтобы всюду
заменять $var_from_url на $_SERVER["var_from_url"], сделал так: в
начале скрипта поставил строчку parse_str($_SERVER["QUERY_STRING"])
- для GET-переменных эффект тот же, что и при register_globals=ON.
Функция parse_str(s [, v]) занимается тем, что "парсит"
(разбирает) переданную ей строку, как если бы это была строка
запроса из URL. Разбор заключается в том, что в пространство имен
скрипта (либо, если указан, в массив v) вносятся переменные из
строки s, и им присваиваются соотв. значения. Туманно... Вот пример:
А недавно работал с JS, и возникла у меня мысль, что в JS просто
ужасно неудобно без такой функции, как parse_str. Избегая дальнейших
измышлений, сразу привожу работающий пример, содержащий написанную
функцию:
Файл 1.htm - его открываем в браузере:
<html>
<body>
<form action="2.htm" method="get">
x = <input type="text" name="x">
y = <input type="text" name="y">
<input type="submit" value="submit">
</form>
</body>
</html>
Файл 2.htm - открывается при отправке формы из 1.htm
<html>
<head>
<script language="JavaScript1.2">
/*второй аргумент по умолчанию опущен. доступ к нему - arguments[1]*/
function parse_str( s) {
var a = s.split(/&|=/);
switch (arguments.length) {
case 1:
for ( var i=0; i<a.length; i++) {
eval(a[i] + "=\"" + unescape(a[++i]) +"\"");
}
break;
case 2:
for ( var i=0; i<a.length; i++)
arguments[1][a[i]] = unescape(a[++i]);
}
}
/*переменные вносятся в глобальное пространство имен*/
parse_str(location.search.slice(1));
var v = new Array();
/*переменные вносятся в массив v. Индексы массива - имена переменных*/
parse_str(location.search.slice(1),v);
</script>
</head>
<body>
<script language="JavaScript">
document.write("x = " + x + "; y = " + y);
document.write("<br>v['x'] = " + v['x'] + "; v['y'] = " + v['y']);
</script>
</body>
</html>
P.S. parse_str() в этом варианте корректно обрабатывает
только строки, не содержащие в значениях параметров escape-нутых
кириллических символов и прочей дребедени. Для поддержки
кириллических и, вообще, UNICODE-значений параметров необходимы
некоторые изменения кода.
Александр Рябов. Сентябрь 2004,
Украина. ryabov@ua.fm
При перепечатке любого материала
с сайта, видимая ссылка на источник www.warayg.narod.ru
и все имена, ссылки авторов обязательны.