KNOW INTUIT, Лекция, Обработка на заявки с PHP

Обработка на заявки с PHP

Досега споменахме само, че клиентските заявки се обработват на сървъра с помощта на специална програма. Всъщност можем сами да напишем тази програма, включително и на езика PHP, и тя ще прави каквото си поискаме с получените данни. За да напишете тази програма, трябва да се запознаете с някои от правилата и инструментите, предлагани за тази цел от PHP.

В рамките на PHP скрипт има няколко начина за достъп до данни, изпратени от клиент през HTTP. Преди PHP 4.1.0 достъпът до такива данни се осъществяваше чрез имената на предадените променливи (припомнете си, че данните се предават под формата на двойки " име на променлива "=" символ, стойност на променлива "). По този начин, ако например беше предадено first_name=Nina, тогава променливата $first_name със стойност Nina ще се появи вътре в скрипта. Ако е необходимо да се разграничи по какъв метод са прехвърлени данните, тогава са използвани асоциативните масиви $HTTP_POST_VARS и $HTTP_GET_VARS, чиито ключове са имената на прехвърлените променливи, а стойностите са съответно стойностите на тези променливи. По този начин, ако двойката first_name = Nina се предава от метода GET, тогава $ HTTP_GET_VARS ["first_name"]="Nina" .

Не е безопасно да използвате имената на предадените променливи директно в програмата. Следователно, започвайки с PHP 4.1.0, беше решено да се използва специален масив, $_REQUEST, за достъп до променливи, предавани чрез HTTP заявки. Този масив съдържа данните, предадени чрез методите POST и GET, както и чрез HTTP бисквитки. Това е суперглобален асоциативен масив, т.е. неговите стойности могат да бъдат получени навсякъде в програмата, като се използва името на съответната променлива (елемент на формуляр) като ключ.

Пример 4.2. Да приемем, че сме създали формуляр за регистриране на участници в кореспондентско училище по програмиране, както в примера по-горе. След това във файла 1.php, който обработва този формуляр, можете да напишете следното:

След това, ако сме въвели името "Вася" във формуляра, фамилията "Петров" и изберем PHP курса сред всички курсове, ще получим следното съобщение на екрана на браузъра:

След въвеждането на масива $_REQUEST, масивите $HTTP_POST_VARS и $HTTP_GET_VARS бяха преименувани съответно на $_POST и $_GET за еднаквост, но самите те не са изчезнали от употреба поради причини за съвместимост с предишни версии на PHP. За разлика от своите предшественици, масивите $_POST и $_GET са станали суперглобални, т.е. достъпни директно и в рамките на функции и методи.

Нека дадем пример за използване на тези масиви. Да кажем, че трябва да обработим формуляр, съдържащ входни елементи с имена first_name , last_name , kurs (например формата form.html по-горе). Данните бяха прехвърлени чрез метода POST и ние не искаме да обработваме данни, прехвърлени чрез други методи. Това може да стане по следния начин:

След това на екрана на браузъра, ако въведем името "Вася", фамилията "Петров" и изберем PHP курса сред всички курсове, ще видим съобщение, както в предишния пример:

За да се запази възможността за обработка на скриптове, по-стари от PHP 4.1.0, беше въведена директивата register_globals, която позволява или отказва достъп до променливи директно от техните имена. Ако параметърът register_globals =On във файла с настройки на PHP, тогава променливите, предадени на сървъра чрез методите GET и POST, могат да бъдат достъпни просто чрез техните имена (т.е. можете да напишете $first_name). Ако register_globals =Off, тогава трябва да напишете $ _REQUEST ["first_name"] или $ _POST ["first_name"], $ _GET ["first_name"], $ HTTP_POST_VARS["първо_име"] , $HTTP_GET_VARS ["собствено_име"] . От гледна точка на сигурността е по-добре да забраните тази директива (т.е. register_globals =Off). С активираната директива register_globals масивите, изброени по-горе, също ще съдържат данни, изпратени от клиента.

Благодарение на това е възможно да се прехвърлят данни в друга форма с помощта на метода GET. Например, посочете само стойностите на няколко параметъра, разделени със знак плюс, и анализирайте низа на заявката на части в скрипта, или можете да предадете стойността само на един параметър. В този случай празен елемент с ключ, равен на тази стойност (целият низ на заявката) ще се появи в масива $_GET и символът " + ", срещан в низа на заявката, ще бъде заменен с долна черта " _ ".

Сега е моментът да решим проблема, формулиран в началото на лекцията.

Пример за обработка на PHP заявка

Нека си припомним какъв беше проблемът и изяснихме формулировката му. Необходимо е да напишете формуляр за регистрация на участници в задочната школа по програмиране и да изпратите съобщение до участника след регистрацията. Нарекохме това съобщение универсалното писмо, но то ще бъде малко по-различно от писмото, което съставихме в предишната лекция. Тук също няма да изпращаме нищо по имейл, за да не бъдем като спамърите, а просто генерираме това съобщение и го показваме на екрана на браузъра. Вече сме дали първоначалната версия на регистрационната форма по-горе. Ще го променим, така че всеки регистрант да може да избере толкова курсове, колкото иска да посещава, и няма да потвърдим получаването на регистрационния формуляр.

Тук всичко е съвсем просто и ясно. Единственото нещо, което трябва да се отбележи, е начинът, по който се предават стойностите на елемента на полето за отметка. Когато напишем kurs[] в името на елемента, това означава, че първият маркиран елемент е отметкаще бъде записано в първия елемент на масива kurs , второто маркирано поле за отметка ще бъде записано във втория елемент на масива и т.н. Можете, разбира се, просто да дадете различни имена на елементите на полето за отметка, но това ще усложни обработката на данните, ако има много курсове.

Скриптът, който ще анализира и обработи всичко това се нарича 1.php (формулярът препраща към този файл, който е записан в неговия атрибут action). По подразбиране се изпраща методът GET, но ние посочихме POST. Според информацията, получена от регистрираното лице, скриптът генерира съответното съобщение. Ако човек е избрал някои курсове, тогава му се показва съобщение за времето на тяхното провеждане и за лекторите, които ги четат. Ако лицето не е избрало нищо, тогава се показва съобщение за следващата среща на Кореспондентското училище за програмисти (ZSHP).

Заключение

Нека да обобщим. Научихме се да различаваме клиент от сървър и сървърен компютър от сървърна програма, запознахме се с основните методи, използвани за прехвърляне на данни към сървъра, проучихме инструментите, предлагани от езика PHP за обработка на клиентски заявки, и ги изпробвахме на практика. По принцип това е достатъчно за създаване на клиент-сървър приложения.