Шрифт
Не передаются переменные! Проблема Undefined variable
Play

Не передаются переменные! Проблема Undefined variable

Во всех старых руководствах по РНР написано, что даные, полученные из формы, или переданные по ссылке, вот так: 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); в скрипте, в котором не работает авторизация, в скрипте, который принимает файл при аплоаде - и все найдется!

Все то же самое можно прочесть и в документации: http://www.php.net/manual/ru/security.globals.php

Не нашли ответ на свой вопрос? Смотри также Последние комментарии

Написать комментарий

Пожалуйста, воздержитесь от посылки спама.Сообщения, содержащие гиперссылки, проходят премодерацию.

Комментарии

Ответ:

Владимир Леонидович, спасибо за уточнение.

Насколько я понял, вопрос стоит в том, чтобы определить, в каком из нескольких десятков мест происходит присвоение на той или иной конкретной странице.

Для этого придется разбираться, как работает роутинг. Или, другими словами, по каким правилам движок запускает тот или иной скрипт, в зависимости от запрошенного адреса.

Обычно в адресе есть часть, которая называется так же, как модуль сайта. К примеру, example.com/news/123.html - здесь news это модуль, а 123 - идентификатор новости. Чтобы понять, как формируется вывод на такой странице, надо найти модуль news. Или example.com/news/edit/123.html - здесь news это модуль, edit - действие, 123 - снова идентификатор. здесь надо найти модуль новостей и функцию, отвечающую за редактирование.

К сожалению, не всегда роутинг просчитывается так легко. Но в целом принцип именно такой - ориентируясь на адрес, найти модуль, который отвечает за вывод данной страницы.

Пишите, Если у вас еще будут вопросы

Ответ:

Здравствуйте, Владимир Леонидович!

Я бы сказал, что наоборот, это как раз нормально - каждый модуль формирует свой вывод, который потом выводится в шаблоне.

Подобный подход описывается на этом сайте в разделе http://phpfaq.ru/tpl

Ответ:

Действительно, я ошибся в предыдущем ответе, и некорректное значение вызовет ошибку.

Самое простое решение - это использовать плейсхолдер ?s вместо ?i. Тогда ошибки не будет, и запрос вернет просто пустой результат. В принципе, ?i почти всегда можно заменять на ?s. ?i нужно только для редких случаев, когда число не может быть представлено, как строка. Я знаю только два таких случая - это передача значений в оператор LIMIT, и работа со значениями типа BIGINT. Во всех остальных случаях можно использовать ?s и ошибки не будет.

Спасибо за четкие и лаконичные статьи и советы!

Подскажите, правильно и я обрабатываю значение из GET-запроса для получения целочисленного id либо однозначной ошибки: $get_id = intval(1 * $_GET['id']); --- далее следуют подобные запросы: $sql = "SELECT * FROM ?n WHERE " . $table_id . "=?i"; $row = $db->getRow($sql,$table,$get_id); ---

Ответ:

Здравствуйте, Анатолий. Спасибо за хороший вопрос.

При работе с safemysql никак специально обрабатывать значения из GET-запроса не нужно.

Кстати, я вижу что запрос написан неправильно. Никаких переменных в нем ни в коем случае не должно быть. иначе теряется весь смысл. Должно быть что-то вроде

$sql = "SELECT * FROM ?n WHERE ?n=?i"; $row = $db->getRow($sql,$table,$table_id,$get_id);

а вот и первый коммент -- просто каша . 8 лет прошло.

erL, 26.06.08 01:36 Благодарю! Прямо в точку попали. Именно то, что искал.

DS, 02.09.11 22:28 ппц подумал я посмотрев на дату коментов))

тЫрнет - сила!! ))) Даже с годами, однажды сказанная умная мысль, помогает роду людскому))

ппц подумал я посмотрев на дату коментов))

тЫрнет - сила!! ))) Даже с годами, однажды сказанная умная мысль, помогает роду людскому))

наконец-то нешёл человеческое описание как параметр через урл передавать. ну почему все не могут так ясно и понятно излогать мысль ??

📎📎📎📎📎📎📎📎📎📎