Несостоятельный form php. Форма отправки данных в PHP (POST, GET)
Последнее обновление: 31.10.2015
Методы действий (action methods) представляют такие методы контроллера, которые обрабатывают запросы по определенному URL. Например, возьмем проект из предыдущей главы. В нем был определен следующий контроллер:
Public class HomeController: Controller
{
BookContext db = new BookContext();
public ActionResult Index()
{
IEnumerable
Здесь методы Index и Buy являются методами действий или просто действиями контроллера. При получении запроса типа /Home/Index контроллер передает обработку запроса действию Index.
Так как запросы бывают разных типов, например, GET и POST, фреймворк ASP.NET MVC позволяет определить тип обрабатываемого запроса для действия, применив к нему соответствующий атрибут: , , или . Так, действие Buy разбито на два метода, по одному для каждого типа запроса.
Однако не все методы контроллера являются методами действий. Методы действий всегда имеют модификатор public . Закрытых приватных методов действий не бывает. Но контроллер может также включать и обычные методы, которые могут использоваться в вспомогательных целях. Например,
Public string Buy(Purchase purchase) { purchase.Date = getToday(); db.Purchases.Add(purchase); db.SaveChanges(); return "Спасибо, " + purchase.Person + ", за покупку!"; } private DateTime getToday() { return DateTime.Now; }
Соответственно мы не можем отправить из браузера запрос Home/getToday/ , потому что метод getToday не является методом действия.
Передача данных в контроллеры и параметры
В приложении из предыдущей главы метод Buy использовал параметр purchase. Так как данный метод обрабатывает POST-запросы, то мы можем отправить ему следующую форму:
Значение атрибута name у всех полей на этой форме соответствует названию свойства модели, поэтому система автоматически свяжет значения полей с соответствующими свойствами. А в методе Buy весь этот набор свойств превратится в модель Purchase.
Кроме POST-запросов у нас есть также GET-запросы, при которых все параметры передаются в строке запроса. Например, вторая версия метода Buy в качестве параметра принимает значение типа int: public ActionResult Buy(int id) . Стандартный get-запрос принимает примерно следующую форму: название_ресурса?параметр1=значение1&параметр2=значение2 . То есть запрос к данному методу мог бы выглядеть так: Home/Buy?id=2 . Название параметров метода должно совпадать с названием параметров в строке запроса. Благодаря этому система сможет их автоматически связать. А в самом методе мы сможем получить этот параметр и использовать его по своему усмотрению.
Кроме того, система маршрутизации позволяет создавать маршруты. Например, по умолчанию в проекте MVC определяется следующий маршрут: Контроллер/Метод/id . Последний параметр является опциональным. И благодаря этому мы можем передать параметр id и так: Home/Buy/2
Для примера определим действие, которое будет подсчитывать площадь треугольника:
Public string Square(int a, int h) { double s = a*h/2.0; return "
"; }В этом случае мы можем обратиться к действию, набрав в адресной строке Home/Square?a=10&h=3 , и приложение выдало бы нам нужный результат.
Мы также можем задать для параметров значения по умолчанию:
Public string Square(int a=10, int h=3) { double s = a*h/2.0; return "
Площадь треугольника с основанием " + a + " и высотой " + h + " равна " + s + "
"; }В этом случае при запросе страницы мы можем указать только один параметр или вообще не указывать(Home/Square?h=5 ).
Получение данных из контекста запроса
Кроме того, мы можем получить параметры, да и не только параметры, но и другие данные, связанные с запросом, из объектов контекста запроса. Нам доступны следующие объекты контекста: Request , Response , RoutedData , HttpContext и Server .
Объект Request содержит коллекцию Params, которая хранит все параметры, переданные в запросы. И мы их можем получить:
Public string Square() { int a = Int32.Parse(Request.Params["a"]); int h = Int32.Parse(Request.Params["h"]); double s = a*h/2.0; return "
Применение методов GET и POST в PHP трудно переоценить, поскольку эти методы встречаются практически на каждом сайте. Прежде чем изучать ниже описанный материал, советую ознакомится с html тегом . Рассмотрим каждый из этих методов в подробности.
Метод GET
Метод GET использует для передачи данных строку URL. Возможно, Вы обращали внимание на длинные и непонятные URLы. Например: function.php?login=Alex&email=dezyakin . В данном случае данные обрабатываются в function.php. После знака вопроса "? " идет перечисление передаваемых параметров (параметр разделяются знаком "&") со значениями: параметру login присвоено значение Alex, а переменной email значение dezyakin. Данные будут хранится в суперглобальном массиве $_GET . Приведем пример использования метода GET представлен ниже:
С помощью суперглобального массива $_GET выводим принятые значения: */ echo "
login = ". $_GET["login"] ; echo "
email = ". $_GET["email"] ; ?>
Обратите внимание на то, как мы считываем значения из суперглобального массива $_GET: $_GET["имя_переменной"] . В нашем примере имена переменных были объявлены в форме (name=login и name=email).
Совет
:
Прежде чем обрабатывать полученные значения советую проверять их на существование через функции isset(имя_переменной)
или empty(имя_переменной)
- эти функции были рассмотрены в предыдущем уроке 2: переменные в PHP . Например:
проверка на существование с помощью isset: if isset ($_GET["login"] ) { операторы для обработки login ... } //или же проверить на существование с помощью empty: if empty ($_GET["email"] ) { операторы для обработки email ... } ?>
В форме можно указать имя файла, который будет обрабатывать передаваемые значения. Делается это с помощью атрибута формы action , которому можно присвоить адрес этого файла. По умолчанию этот файл присвоен текущему файлу (т.е. обрабатывается в файле, где и расположена форма). Приведем пример, в котором данные из формы передаются на обработку в файл srcipt.php :
В файле script.php должен содержатся какой-то обработчик информации, иначе информация будет передана в пустую.
Метод GET обладает множеством недостатков:
- Пользователь видит значения передаваемых параметров;
- Пользователь может легко подделать передаваемые параметры;
- Неудобная передача бинарной информации (приходится кодировать в текстовый формат);
- Объем передаваемых данных ограничен - 8 Кбайт;
Из-за выше перечисленных недостатков метод GET применяется только в тех случаях, когда нужно передать небольшой объем данных, а также эти данные никак не засекречены.
Метод POST
Метод POST отличается от GET тем, что данные передаются в закрытой форме. Существует суперглобальный массив $_POST , из которого можно считывать данные следующим образом: $_POST["имя_переменной"] . Например:
С помощью суперглобального массива $_POST выводим принятые значения: */ echo "
login = ". $_POST["login"] ; echo "
email = ". $_POST["email"] ; ?>
Результат выполнения выше описанного кода представлен на рисунке ниже:
Как видите URL не имеет никакой приписки, но тем не менее данные были получены и выведены.
Примечание
:
1) Объем передаваемых значений методом POST
по умолчанию ограничен и равен 8 Мбайт. Чтобы увеличить это значение нужно изменить директиву post_max_size
в php.ini.
2) В ранних версиях PHP вместо коротких названий суперглобальных массивов $_GET и $_POST использовались более длинные имена: $HTTP_GET_VARS и $HTTP_POST_VARS . По умолчанию они выключены в php 5, но Вы можете их включить в конфигурационном файле php.ini с помощью параметра register_long_arrays . В php 6 версии эти длинные названия будут недоступны.
3) Перед обработкой переменных из $_POST , советую проверять переменные на их наличие, также как это делалось с методом GET .