Все нормально. Данные в скрипт передаются. Просто при определенных настройках РНР не делает из них переменные. Найти свои данные можно в специальных массивах. Во всех старых руководствах по РНР написано, что даные, полученные из формы, или переданные по ссылке, вот так: script.php?peremennaya=znachenie&variable=value автоматически становятся переменными php, $peremennaya и $variable Эта информация устарела. Дело в том, что в целях безопасности, начиная с версии 4.1, РНР настраивается по умолчанию так, чтобы переданные значения не назначались переменным. Получить же переданное значение можно обратившись к соответствующему массиву. Например: Если передаем методом get, обратившись к скрипту по ссылке вида script.php?var=value или отправив форму, указав в ней method="get", то все переменные содержатся в массиве $_get. echo $_get['var']; напечатает "value". Если получаем данные из формы, отправленной методом post, то все поля этой формы содержатся в массиве $_post. Допустим, в форме был элемент <input type="hidden" name="var" value="1">, то в скрипте, который указан в action формы, можно написать echo $_post['var']; и будет выведена 1. Поэтому, если вы уверены, что переменная есть, но вы не можете ее найти - ищите ее в суперглобальных массивах. Подробнее о них можно почитать на русском языке в официальной документации http://ru2.php.net/variables.predefined То же касается и серверных переменных, таких, как $remote_addr, $php_self. Получить их можно, обратившись к массивам $_server, $_env или функцией getenv - getenv('http_referer'); Переменные, зарегистрированные в сессии, следует искать в массиве $_session. Данные cookie содержатся в массиве $_cookie, сведения о закачанных файлах - в $_files Переменные окружения - в $_env, а так же, существует массив $_request, в котором собраны данные из get, post и cookie. Важно! Весьма в поисках переменных помогает одна их главных функций php - phpinfo() ее следует применять всякий раз, когда вы "потеряли" переменную, вызовите phpinfo(32); в скрипте, в котором не работает авторизация, в скрипте, который принимает файл при аплоаде - и все найдется! За назначение переменных отвечает параметр register_globals в php.ini. Если register_globals=on, то все полученные скриптом данные будут назначены соответствующим переменным. Разработчики php настоятельно рекомендуют выключать register_globals (такой режим даже введен по умолчанию во всех новых версиях) и пользоваться данными, полученными от пользователя, только обращаясь к соответствуюим массивам. Это сделано потому, что при register_globals = on легко взломать небрежно написаный скрипт. К примеру, функция авторизации выставляет переменную $admin=1, а если авторизации не было, то не делает ничего. В таком скрипте при register_globals=on очень легко стать админом, просто обратившись к нему script.php?admin=1 Огоромное количество сайтов было взломано таким образом. К тому же, register_globals = off заставляет пользоваться суперглобальнми массивами ($_get, $_post и т.д.), что помогает избежать путаницы. ОЧЕНЬ много людей, записав некую переменную в сессию, а потом пытаясь изменить ее значение, передавая ее скрипту методом get, долго не могли понять, почему у них ничего не работает? Поэтому очень важно при работе с сессиями, при любых настройках (и особенно - при register_globals=on!) работать только с массивом $_session, как это описано в соответствующем разделе. То есть, register_globals=off - на самом деле не цель, а средство. Побудительный мотив для программиста писать защищенные скрипты и избегать путаницы. Если вы хотите написать скрипт, не зависящий от настройки register_globals, и при этом защищенный - переменные надо объявлять перед использованием. На это нацелена еще одна инициатива разработчиков php - написание программ при уровне отображения ошибок (error_reporting) равном e_all, при котором об использовании необъявленных переменных выдаются предупреждения. Именно объявление ВСЕХ переменных, используемых в скрипте и являетс гарантией от взлома. Если вы пишете программу для распространения, то гарантией ее безопасности является только объявление переменных. Если же нет возможности переделать готовый скрипт, но его надо заставить работать при register_globals=off, то надо помнить, что во-первых, вы делаете потенциальную дыру у себя на сайте, а во-вторых, для этого можно воспользоваться функциями extract и import_request_variables НО! Бездумное использование этих функций является таким же опасным! Если вы хотите адаптировать старый скрипт под новые правила, то выполните приведенный код именно в таком порядке! import_request_variables("gpc"); extract($_server); сначала назначаются переменные, пришедшие от юзера, а потом - предопределенные серверные, чтобы первые не могли затереть одноименные серверные. ВАЖНО!!! Этот код должен вызываться как можно раньше в скрипте. ДО любого кода и присвоения переменных. Поскольку он являет собой дыру похлеще register_globals=on! Ведь если он будет вызываться после присвоения переменных в скрипте, то хакер с легкостью перезапишет их. Последние версии php сообщают вам об этом нотайсом при использовании import_request_variables. И то правда - три года прошло с тех пор, как введены новые правила. Пора бы уже и научиться писать скрипты правильно. Но лучше всего пользоваться не свалеными в кучу переменными, а соответствующими массивами. Особенно, если в одном скрипте встречаются переменные из кук, из формы, из сессии - очень много путаницы от этого происходит.
|