Kompyuterlar va zamonaviy gadjetlar

Deyarli barcha dasturlar uchun umumiy ikkita tushuncha mavjud - kiritilgan ma'lumotlarni qayta ishlash va natijalarni chiqarish. Ushbu sahifada biz CGI dasturlari uchun ma'lumotlarni qayta ishlashga e'tibor qaratamiz. Birinchidan, kirish ma'lumotlari qayerdan keladi, ikkinchidan, kirish ma'lumotlari serverga qanday uzatiladi. Samarali CGI dasturlarini yozish uchun siz bu narsalarni aniq tushunishingiz kerak.

HTTP haqida bir oz

Server uchta turdagi so'rovlarni qabul qiladi: GET, POST va HEAD. Dasturning veb-serverga so'rovi quyidagicha ko'rinadi:

OLISH /index.html HTTP/1.0

Birinchi qism, bu holda GET, so'rov usuli, ikkinchisi, index.html, so'ralgan URL, uchinchisi, HTTP/1.0, mijoz tomonidan ishlatiladigan protokol.

Ikkita asosiy so'rov usullari - GET va POST. Shaklni yaratishda siz uchun mavjud bo'lgan bir xil usullar mavjud. HEAD usuli brauzer tomonidan kamdan-kam qo'llaniladi, chunki u faqat javob sarlavhasini so'raydi va javob matnini yubormaydi. Misol uchun, sahifa o'zgarganligini tekshirish uchun brauzer sarlavhani so'rashi mumkin, ammo bu to'liq ma'lumotlar almashinuvini keltirib chiqarmaydi.

GET usuli

Odatiy bo'lib, so'rov usuli GET hisoblanadi. POST usuli faqat ariza so'rovida aniq ko'rsatilganda qo'llaniladi. CGI dasturchisi uchun GET so'rovini yuborishda forma ma'lumotlari URL bilan birga serverga yuborilishini tushunish juda muhimdir. CGI-ni qo'llab-quvvatlaydigan veb-serverlar ushbu ma'lumotlarni QUERY_STRING deb nomlangan muhit o'zgaruvchisiga ko'chiradi. Shundan so'ng, CGI dasturi atrof-muhit o'zgaruvchisidan ma'lumotlarni olish va ularni qayta ishlash uchun javobgardir.

So'rovlar qatori bo'lgan URL quyidagicha ko'rinadi:

Http://www.domen-name.com/login.pl?nick=maks&psw=parol

Imzo? so'rovlar qatorini haqiqiy manba URL manzilidan ajratadi; nick va psw serverga uzatiladigan o'zgaruvchilar, maks va parol mos ravishda ularning qiymatlari.

POST usuli

POST usuli formaning METHOD atributida aniq ko'rsatilganda qo'llaniladi. GET usulidan farqli o'laroq, POST ma'lumotlarni URL manziliga emas, balki so'rovning asosiy qismiga joylashtiradi. POST so'rovi ko'p jihatdan HTTP javobiga o'xshaydi. Birinchi qator POST usulini belgilaydigan standart HTTP so'rovidir. U so'rov tanasidan bo'sh qator bilan ajratilgan zarur qo'shimcha sarlavhalarni o'z ichiga olishi mumkin.

POST usulidan foydalanganda so'rovning asosiy qismi standart kiritish sifatida dasturga uzatiladi.

GET va POST o'rtasida tanlov

Shakllarni ishlab chiqishda CGI dasturchisi savolga duch kelishi aniq: ushbu usullardan qaysi birini ishlatish kerak. Ko'pgina hollarda, ikkala usul ham qo'llaniladi va ikkalasi ham yaxshi ishlaydi. Biroq, u yoki bu usuldan foydalanish muayyan afzalliklarni ta'minlaydigan holatlar mavjud.

Keling, GET yoki POST usulini afzal ko'rish mantiqiy bo'lgan bir nechta vaziyatlarni ko'rib chiqaylik.

  • Agar dasturingiz mos yozuvlar yordamida chaqirilishini istasangiz, GET usuliga ustunlik berish kerak.
  • Agar dasturingizga uzatilgan argumentlar serverning hisobot fayliga yozilishini istamasangiz, POST usulidan foydalaning. Misol uchun, agar forma foydalanuvchi nomi va parolni talab qilsa, siz nomlar va parollarni hisobot faylida saqlashni xohlamaysiz. Bundan tashqari, parolni URLning bir qismi sifatida o'tkazish oqilona emas.
  • Agar sizning shaklingiz katta bo'lsa, masalan, eslatmalar va sharhlar bo'lgan matn qutilari, siz POST usulidan foydalanishingiz kerak. Umuman olganda, bu holda siz GET usulidan foydalanishingiz mumkin, ammo keyin siz turli xil operatsion tizimlar va brauzerlar uchun farq qiluvchi URL o'lchami cheklovlariga duch kelishingiz mumkin (cheklov muhit o'zgaruvchilari hajmiga bog'liq). POST usulidan foydalanish osonroq.
  • Agar formangizda fayl maydoni bo'lsa, POST usulidan foydalaning. Bundan tashqari, bu holda siz ENCTYPE atribut qiymatini multipart/form-data ga o'rnatishingiz kerak.

PHP-da GET va POST usullaridan foydalanishni ortiqcha baholash qiyin, chunki bu usullar deyarli har bir veb-saytda mavjud. Quyida tavsiflangan materialni o'rganishdan oldin, men sizga html tegi bilan tanishishingizni maslahat beraman

. Keling, ushbu usullarning har birini batafsil ko'rib chiqaylik.

GET usuli

GET usuli ma'lumotlarni uzatish uchun URL satridan foydalanadi. Uzoq va tushunarsiz URL manzillarini ko'rgan bo'lishingiz mumkin. Masalan: function.php?login=Alex&email=dezyakin. Bunday holda, ma'lumotlar function.php da qayta ishlanadi. Savol belgisidan so'ng "?" o'tgan parametrlar ro'yxati mavjud (parametrlar "&" bilan ajratilgan) qiymatlari bilan: login parametriga Alex qiymati, elektron pochta o'zgaruvchisiga dezyakin qiymati beriladi. Ma'lumotlar superglobal $_GET massivida saqlanadi. GET usulidan foydalanishga misol quyida keltirilgan:

Tizimga kirish: Email: Superglobal $_GET massividan foydalanib, biz qabul qilingan qiymatlarni ko'rsatamiz:*/ echo "
login = ". $_GET["login"] ; echo "
email = ". $_GET["email"]; ?>

$_GET superglobal massividan qiymatlarni qanday o'qiganimizga e'tibor bering: $_GET["variable_name"]. Bizning misolimizda o'zgaruvchilar nomlari (name=login va name=email) shaklida e'lon qilingan.

Maslahat:
Qabul qilingan qiymatlarni qayta ishlashdan oldin, men sizga funktsiyalar orqali ularning mavjudligini tekshirishni maslahat beraman isset (o'zgaruvchi_nomi) yoki bo'sh (o'zgaruvchi_nomi)- bu funksiyalar oldingi 2-darsda muhokama qilingan edi: PHPdagi o'zgaruvchilar. Masalan:

isset yordamida mavjudligini tekshirish: if isset ($_GET["login"] ) ( loginni qayta ishlash operatorlari ... } //yoki bo'sh yordamida mavjudligini tekshiring: bo'sh bo'lsa ($_GET["email"] ) ( elektron pochtani qayta ishlash uchun operatorlar ... } ?>

Shaklda siz uzatilgan qiymatlarni qayta ishlovchi fayl nomini belgilashingiz mumkin. Bu ushbu faylning manzilini belgilash mumkin bo'lgan shaklning harakat atributi yordamida amalga oshiriladi. Odatiy bo'lib, bu fayl joriy faylga tayinlanadi (ya'ni, u forma joylashgan faylda qayta ishlanadi). Shakldagi ma'lumotlar qayta ishlash uchun srcipt.php fayliga o'tkaziladigan misol:

Tizimga kirish: Email:

script.php fayli qandaydir ma'lumotni qayta ishlovchini o'z ichiga olishi kerak, aks holda ma'lumotlar bo'sh uzatiladi.

GET usuli juda ko'p kamchiliklarga ega:

  • Foydalanuvchi o'tkazilgan parametrlarning qiymatlarini ko'radi;
  • Foydalanuvchi o'tgan parametrlarni osongina soxtalashtirishi mumkin;
  • Ikkilik ma'lumotni noqulay uzatish (siz uni matn formatiga kodlashingiz kerak);
  • O'tkazilgan ma'lumotlar hajmi cheklangan - 8 KB;

Yuqoridagi kamchiliklardan kelib chiqqan holda, GET usuli faqat kichik hajmdagi ma'lumotlarni uzatish kerak bo'lgan hollarda qo'llaniladi va bu ma'lumotlar hech qanday tarzda tasniflanmaydi.

POST usuli

POST usuli GET-dan ma'lumotlarning shaxsiy shaklda uzatilishi bilan farq qiladi. $_POST superglobal massivi mavjud bo'lib, undan ma'lumotlarni quyidagicha o'qish mumkin: $_POST["variable_name"]. Masalan:

Tizimga kirish: "> Elektron pochta: ">
Superglobal $_POST massividan foydalanib, biz qabul qilingan qiymatlarni ko'rsatamiz:*/ echo "
login = ". $_POST["login"] ; echo "
email = ". $_POST["email"]; ?>

Yuqoridagi kodni bajarish natijasi quyidagi rasmda ko'rsatilgan:

Ko'rib turganingizdek, URL manzilida postskript yo'q, ammo shunga qaramay ma'lumotlar qabul qilindi va ko'rsatildi.

Eslatma:
1) POST usuli yordamida uzatiladigan qiymatlar hajmi sukut bo'yicha cheklangan va 8 MB ga teng. Ushbu qiymatni oshirish uchun siz php.ini da post_max_size direktivasini o'zgartirishingiz kerak.

2) PHP ning oldingi versiyalarida qisqa superglobal massiv nomlari $_GET va $_POST oʻrniga uzunroq nomlar ishlatilgan: $HTTP_GET_VARS va $HTTP_POST_VARS . Odatiy bo'lib ular PHP 5 da o'chirib qo'yilgan, lekin siz ularni register_long_arrays parametridan foydalanib php.ini konfiguratsiya faylida yoqishingiz mumkin. Php 6 versiyasida bu uzun nomlar mavjud bo'lmaydi.

3) $_POST dan o'zgaruvchilarni qayta ishlashdan oldin, GET usulida bo'lgani kabi, o'zgaruvchilarning mavjudligini tekshirishni maslahat beraman.

Zamonaviy veb-resurslar nafaqat tashrif buyuruvchiga ma'lumot beradi, balki u bilan ham muloqot qiladi. Foydalanuvchi bilan muloqot qilish uchun siz undan ba'zi ma'lumotlarni olishingiz kerak. Ma'lumot olishning bir necha usullari mavjud, ular juda keng tarqalgan OLISH Va POST. Va shunga mos ravishda PHP ushbu ma'lumotlarni uzatish usullarini qo'llab-quvvatlash mavjud OLISH Va POST. Keling, ushbu usullar qanday ishlashini ko'rib chiqaylik.
GET usuli Ma'lumotlar GET usuli Qabul qilingan ma'lumotlarni qayta ishlash uchun chaqirilayotgan skriptning URL manziliga ularni qo'shish orqali uzatiladi. Ushbu usulni tushuntirish uchun brauzerning manzil satriga resurs URL-manzilini kiriting va avval savol belgisini (?) va keyin raqam = 10 qatorini qo'shing. Masalan

http://domain.ru/script.php?num=10


Agar sizda mahalliy server bo'lsa, u holda odatda domen localhost bo'ladi va keyin oldingi yozuv kabi ko'rinadi

http://localhost/script.php?num=10


Bunday holda, biz 10 ga teng parametr sonini o'tkazamiz. Quyidagi parametrlarni qo'shish uchun skript ampersand (&) ajratuvchisidan foydalanishi kerak, masalan

http://domain.ru/script.php?num=10&type=new&v=text


Bunday holda, biz skriptga uchta parametrni o'tkazdik: 10 qiymati bilan num, "yangi" qiymati bilan yozing va "matn" qiymati bilan v.
Ushbu parametrlarni skriptda olish uchun siz o'rnatilgan massivdan foydalanishingiz kerak $_GET $_GET["num"], $_GET["type"],$_GET["v"]. Ushbu massiv elementlari o'tkazilgan parametrlarning qiymatlarini o'z ichiga oladi. Ushbu misolni ko'rsatish uchun quyidagi tarkibga ega script.php faylini yarating



PHP da GET usulini tekshirish


echo ($_GET["num"]."
");
echo ($_GET["turi"]."
");
echo ($_GET["v"]);
?>


Va endi ushbu faylni brauzerda chaqiring

http://path/script.php?num=10&type=new&v=text


va o'tkazilgan parametrlarni brauzer oynasida ko'rasiz. Ammo agar siz ushbu faylni http://path/script.php qo'shimcha parametrlarisiz chaqirsangiz, tarjimon chiqaradigan xatolarni ko'rasiz. PHP, $_GET massivining bunday elementlari yo'qligi. Bir nechta maqolalar foydalanuvchidan olingan ma'lumotlarni tekshirishga bag'ishlanishi mumkin, shuning uchun ushbu maqolada men bu nuqtaga tegmayman.
Ehtimol, tushunganingizdek, foydalanuvchini brauzerning manzil satriga ma'lumotlarni kiritishga majburlash juda yaxshi emas va mutlaqo noqulay. Shuning uchun, foydalanuvchidan ma'lumotlarni olish uchun siz HTML shakllaridan foydalanishingiz kerak. Keling, oddiy html formasini yozamiz.


Raqamni kiriting

Kompyuteringiz bormi?

Sizning fikringiz:





Yaratilgan shakl haqida bir oz fikr bildiraman. Formalar forma tegi bilan yaratiladi. Shakl maydonlari kiritish, tanlash, matn maydoni teglari yordamida yaratiladi (batafsil o'qishingiz mumkin). Shakl tegida harakat atributi forma ma'lumotlarini oladigan skriptning URL manzilini belgilaydi. Bizning holatlarimizda biz mavjud script.php faylimizni ko'rsatdik. Metod atributi ma'lumotlarni yuborish usulini belgilaydi. Biz usulni aniqladik OLISH. Endi biz forma ma'lumotlari qaysi faylga o'tkazilishini bilamiz va qanday yo'l bilan uni qaerdan qidirishni aniqlash qoladi?!
Ushbu shakl ma'lumotlari brauzer tomonidan URL manziliga qo'shish orqali veb-resursga uzatiladi: avval savol belgisi (?), keyin parametrlar ampersand (&) bilan ajratilgan holda taqdim etiladi. Parametr nomi har qanday shakl maydoni uchun ko'rsatilishi kerak bo'lgan nom atributidan olinadi. Parametrning qiymati maydon turiga bog'liq bo'ladi. Agar maydon matn maydoni bo'lsa, qiymat foydalanuvchi kiritgan matn bo'ladi. Agar maydon ro'yxat, radio tugmalar guruhi yoki katakchalar bo'lsa, u holda parametrning qiymati tanlangan elementning qiymat atributining qiymati bo'ladi. Keling, bizning shaklimizni misol sifatida tushuntiraman. Agar foydalanuvchi kiritish maydoniga 10 raqamini kiritsa, u holda parametr nomi num (kiritish tegining nom atributining qiymati) va qiymati 10 (foydalanuvchi tomonidan kiritilgan raqam) bo'ladi. Shunga ko'ra, brauzer "num=10" juftligini hosil qiladi. Agar foydalanuvchi ro‘yxatdan “Ha” variantini tanlasa, u holda parametr nomi turi (tanlash tegining nom atributining qiymati) va qiymati “ha” (opsiyaning qiymat atributining qiymati) bo‘ladi. teg). Shunga ko'ra, brauzer "type = yes" juftligini yaratadi.
Endi bu formani forma.php sahifasiga joylashtiramiz.



GET va PHP usullari yordamida ma'lumotlarni uzatish formasi



Raqamni kiriting

Kompyuteringiz bormi?

Sizning fikringiz:







Shakl maydonlariga istalgan qiymatlarni kiriting va "Yuborish" tugmasini bosing. Tugmani bosgandan so'ng, brauzer boshqa sahifani (script.php) ochadi va siz kiritgan ma'lumotlar brauzer oynasida ko'rsatiladi. Menimcha, nima uchun bu aniq: brauzer ma'lumotlarni script.php skriptiga uzatadi va skriptda bu ma'lumotlar qayta ishlanadi va ekranda ko'rsatiladi.
POST usuli Endi usul qanday ishlashini ko'rib chiqamiz POST.
yordamida ma'lumotlarni yuborish uchun POST HTML shakllaridan foydalanishingiz kerak. Esda tutganimizdek, forma tegining metod atributi forma ma'lumotlarini yuborish usuli uchun javobgardir. Shuning uchun, siz forma tegining metod atributida POST qiymatini belgilashingiz kerak. Aks holda, shakl GET usuli bilan bir xil bo'lishi mumkin. Keling, GET usuli yordamida ma'lumotlarni uzatishda qo'llagan shaklimizni POST usuli yordamida uzatishga o'zgartiraylik.


Raqamni kiriting

Kompyuteringiz bormi?

Sizning fikringiz:





Ko'rib turganingizdek, usul va harakat atributlaridan tashqari shakl bir xil bo'lib qoladi. Endi ma'lumotlar script_post.php skriptiga uzatiladi. Keling, formamizni forma_post.php sahifasiga joylashtiramiz.



POST va PHP usullari yordamida ma'lumotlarni uzatish formasi



Raqamni kiriting

Kompyuteringiz bormi?

Sizning fikringiz:







Endi biz forma ma'lumotlarimizni qayta ishlaydigan skript yozishimiz kerak.
O'tkazilgan usuldan foydalangan holda skriptda ma'lumotlarni qabul qilish POST o'rnatilgan massivdan foydalanish kerak $_POST. Ushbu massivning kalitlari parametrlarning nomlari bo'ladi. Bizning holatlarimizda biz foydalanishimiz kerak $_POST["num"], $_POST["type"],$_POST["v"]. Ushbu massiv elementlari uzatilgan ma'lumotlarning qiymatlarini o'z ichiga oladi. Ko'rib turganingizdek, GET usulini qo'llashdan farq faqat $_POST massividan foydalanishda ifodalanadi. Shuning uchun script_post.php faylini yozish biz uchun qiyin bo'lmaydi:



PHP da POST usulini tekshirish


echo ($_POST["num"]."
");
echo ($_POST["turi"]."
");
echo ($_POST["v"]);
?>


Endi brauzeringizda forma_post.php faylini oching. Shakl maydonlariga ba'zi ma'lumotlarni kiriting va "Yuborish" tugmasini bosing. Endi, ehtimol siz POST usuli va GET usuli o'rtasidagi farqni sezdingiz - shakl ma'lumotlari brauzerning manzil satrida ko'rinmadi. Usul bo'yicha ma'lumotlar POST brauzer manzil satri orqali uzatilishi mumkin emas. Bu eslash kerak bo'lgan muhim farq.
IN PHP Ma'lumotlar qanday yuborilganligidan qat'i nazar - POST usuli yoki GET usuli - siz ma'lumotlarni $_REQUEST massividan foydalanib olishingiz mumkin. GET va POST usullarini solishtirish GET usulidan foydalanganda ma'lumotlar URL manziliga qo'shilish orqali uzatiladi. Shunday qilib, ular foydalanuvchiga ko'rinadigan bo'ladi, bu xavfsizlik nuqtai nazaridan har doim ham yaxshi emas. Shuningdek, uzatiladigan ma'lumotlarning maksimal miqdori brauzerga bog'liq bo'ladi - brauzerning manzil satridagi belgilarning ruxsat etilgan maksimal soniga.
POST usulidan foydalanganda ma'lumotlar foydalanuvchiga ko'rinmaydi (brauzer manzil satrida ko'rsatilmaydi). Va shuning uchun ular xavfsizroq va shuning uchun ushbu ma'lumotlarni qayta ishlaydigan dastur xavfsizlik nuqtai nazaridan ko'proq himoyalangan. Shuningdek, uzatiladigan ma'lumotlar hajmi deyarli cheksizdir.
Ma'lumot uzatish usulini tanlashda siz yuqoridagi xususiyatlarni hisobga olishingiz va eng mos usulni tanlashingiz kerak.

HTML shakllari. $_POST va $_GET massivlari

HTML shakllari. Serverga ma'lumotlarni yuborish usullari

Siz allaqachon HTML shakllariga duch kelgansiz:

Ismingizni kiriting:

Ushbu kodni HTML faylida saqlash va uni sevimli brauzeringiz yordamida ko'rish orqali siz tanish HTML formasini ko'rasiz:

teg

, juftlangan yakuniy tegga ega
, aslida shaklni o'rnatadi. Uning atributlari ikkalasi ham ixtiyoriy:

  • harakat - shakl yuboriladigan URL manzilini (to'liq yoki nisbiy) belgilaydi. Agar bu atribut ko'rsatilmagan bo'lsa, ko'pchilik brauzerlar (aniqrog'i, menga ma'lum bo'lgan barcha brauzerlar) shaklni joriy hujjatga, ya'ni "o'ziga" yuboradi. Bu qulay stenografiya, ammo HTML standartiga ko'ra, harakat atributi talab qilinadi.
  • usul - shaklni topshirish usuli. Ulardan ikkitasi bor.
    • GET - manzil satrida shakl ma'lumotlarini yuborish.
      Turli veb-saytlarda URL oxirida "?" mavjudligini sezgan bo'lishingiz mumkin. va parametr = qiymat formatidagi quyidagi ma'lumotlar. Bu erda "parametr" shakl elementlarining nom atributining qiymatiga mos keladi (teg haqida quyida ko'ring. ) va "qiymat" - qiymat atributining mazmuni (masalan, u xuddi shu tegning matn maydoniga foydalanuvchi kiritishini o'z ichiga oladi. ).
      Masalan, Yandex-da biror narsani qidirib ko'ring va brauzerning manzil satriga e'tibor bering. Bu GET usuli.
    • POST - shakl ma'lumotlari so'rovning asosiy qismida yuboriladi. Agar bu nima ekanligi to'liq aniq bo'lmasa (yoki butunlay noaniq) bo'lsa, tashvishlanmang, biz tez orada bu masalaga qaytamiz.
    Agar usul atributi ko'rsatilmagan bo'lsa, GET qabul qilinadi.

teg - type atributi bilan aniqlangan shakl elementini belgilaydi:

  • "Matn" qiymati bir qatorli matn kiritish maydonini bildiradi
  • "Yuborish" qiymati bosilganda formani serverga yuboradigan tugmani bildiradi

Boshqa qiymatlar ham mumkin (va - forma elementini belgilaydigan yagona teg emas).

Xo'sh, biz "OK" tugmasini bosganimizda nima bo'ladi?

  1. Brauzer shaklga kiritilgan elementlarni ko'rib chiqadi va ularning nomi va qiymat atributlaridan shakl ma'lumotlarini tuzadi. Aytaylik, Vasya nomi kiritilgan. Bu holda forma ma'lumotlari name=Vasya&okbutton=OK bo'ladi
  2. Brauzer server bilan aloqa o'rnatadi, serverga tegning harakat atributida ko'rsatilgan hujjat uchun so'rov yuboradi
    , usul atributida ko'rsatilgan ma'lumotlarni yuborish usulidan foydalangan holda (bu holda - GET), so'rovda shakl ma'lumotlarini o'tkazish.
  3. Server qabul qilingan so'rovni tahlil qiladi, javob hosil qiladi, uni brauzerga yuboradi va ulanishni yopadi
  4. Brauzer serverdan olingan hujjatni ko'rsatadi

Xuddi shu so'rovni qo'lda yuborish (telnet yordamida) quyidagicha ko'rinadi (saytning domen nomi www.example.com bo'lsa):

Telnet www.example.com 80 GET /cgi-bin/form_handler.cgi?name=Vasya&okbutton=OK HTTP/1.0\r\n Xost: www.example.com\r\n \r\n

Siz allaqachon taxmin qilganingizdek, “GET” yuborish usuli boʻlgan shakldagi “Yuborish” tugmasini bosish brauzerning manzil satriga tegishli URL manzilini (oxirida savol belgisi va shakl maʼlumotlari bilan) kiritish bilan bir xil boʻladi:

Http://www.example.com/cgi-bin/form_handler.cgi?name=Vasya&okbutton=OK

Aslida, GET usuli serverdan hujjat so'raganda uning URL manzilini kiritish yoki havolani bosish orqali foydalaniladi. Foydalanish , URL oddiygina savol belgisi va shakl ma'lumotlari bilan qo'shiladi.

Ehtimol, bu barcha texnik tafsilotlar va Telnet bilan mashqlar sizga juda zerikarli va hatto keraksiz bo'lib tuyuladi ("PHPning bunga nima aloqasi bor?"). Lekin behuda. :) Bular HTTP protokoli bilan ishlash asoslari bo'lib, ularni har bir Web dasturchi yoddan bilishi kerak va bu nazariy bilim emas - bularning barchasi amalda foydali bo'ladi.

Endi formamizning birinchi qatorini quyidagi bilan almashtiramiz:

Biz jo'natish usulini "POST" deb belgiladik. Bunday holda, ma'lumotlar serverga biroz boshqacha tarzda yuboriladi:

Telnet www.example.com 80 POST /cgi-bin/form_handler.cgi HTTP/1.0\r\n Xost: www.example.com\r\n Kontent turi: application/x-www-form-urlencoded\r\ n Kontent uzunligi: 41263\r\n \r\n name=Vasya&okbutton=OK

POST usulidan foydalanganda, shakl ma'lumotlari so'rovning asosiy qismida "ikkita kiritish" dan keyin yuboriladi. Yuqoridagi hamma narsa aslida so'rov sarlavhasidir (va biz GET usulidan foydalanganimizda, shakl ma'lumotlari sarlavhada yuborilgan). Server qaysi baytda so'rov matnini o'qishni to'xtatishni bilishi uchun sarlavhada Content-Length qatori mavjud; shakl ma'lumotlari parametr1=qiymat1¶metr2=qiymat2... shaklida uzatiladi va qiymatlar urlenkod ko'rinishida uzatiladi - ya'ni GET usulini qo'llash bilan bir xil, lekin uning tanasida. so'rov - Kontent sarlavhasi serverga xabar beradi -Type: application/x-www-form-urlencoded .

POST usulining afzalligi shundaki, forma ma'lumotlar liniyasining uzunligi bo'yicha cheklov yo'q.

POST usulidan foydalanganda, GET bilan bo'lgani kabi, oddiygina "havolaga amal qilish" orqali shaklni yuborish mumkin emas.

POST formasidan foydalanganda uning action atributida savol belgisidan keyin GET formasining parametrlarini belgilashingiz mumkin. Shunday qilib, POST usuli GET usulini o'z ichiga oladi.

$_GET va $_POST massivlari

Shunday qilib, formalar veb-server va brauzer o'rtasida ma'lumot almashishning asosiy usuli hisoblanadi, ya'ni ular foydalanuvchilarning o'zaro ta'sirini ta'minlaydi - aslida veb-dasturlash nima uchun.

Keling, oddiy misolni ko'rib chiqaylik:



agar ($_SERVER [ "REQUEST_METHOD" ] == "POST" ) (
aks-sado "

Salom, " . $_POST [ "ism" ] . "

!" ;
}
?>
">
Ismingizni kiriting:




8-12 qatorlarda ko'rsatilgan shakl ikkita elementni o'z ichiga oladi: nom va ok tugmasi. Metod atributi POST formasini yuborish usulini belgilaydi, harakat atributi esa forma yuboriladigan URL manzilini belgilaydi va PHP_SELF server o'zgaruvchisining qiymati - hozirda ishlayotgan skript manzili bilan to'ldiriladi.

- uchun qisqartirilgan shakl .

Faraz qilaylik, nom maydoniga Vasya qiymatini kiritdik va OK tugmasini bosdik. Bunday holda, brauzer serverga POST so'rovini yuboradi. So‘rov matni: name=Vasya&okbutton=OK . PHP avtomatik ravishda $_POST massivini to'ldiradi:

$_POST ["name" ] = "Vasya"
$_POST ["okbutton" ] = "OK"

Aslida, "Vasya" qiymati brauzer tomonidan urlenkod shaklida yuboriladi; Windows-1251 kodlash uchun bu qiymat %C2%E0%F1%FF kabi ko'rinadi. Ammo PHP avtomatik ravishda kerakli dekodlashni amalga oshirganligi sababli, biz HTTP so'rovlarini qo'lda hal qilmagunimizcha, bu xususiyatni "unutishimiz" mumkin.

So'rovning asosiy qismi faqat nomlar va qiymatlarni ko'rsatganligi sababli, lekin shakl element turlarini emas, PHP $_POST["name"] kiritish satri, tugma yoki ro'yxat maydoniga mos keladimi yoki yo'qligini bilmaydi. Ammo bizga, umuman olganda, bu ma'lumotlar umuman kerak emas. :)

Yuborish tugmasi nima deyishini bilishimiz shart emasligi sababli biz 11-qatordagi nom atributini olib tashlashimiz mumkin, tugma tavsifini qisqartirishimiz mumkin. . Bunday holda, brauzer POST so'rovini yuboradi name=Vasya.

Va endi xuddi shu narsa, lekin GET shakli uchun:



if (isset($_GET [ "ism" ])) (
aks-sado "

Salom, " . $_GET [ "ism" ] . "

!" ;
}
?>
">
Ismingizni kiriting:





8-qatorda ham xuddi shunday oson yozish mumkin

: GET standart usul hisoblanadi. Bu safar brauzer GET so'rovini yuboradi, bu manzil satriga manzilni kiritishga teng: http://site-address/script-name.php?name=Vasya.

PHP POST bilan bo'lgani kabi GET shakllari bilan ham xuddi shunday qiladi, farqi bilan $_GET massivi to'ldirilgan.

Asosiy farq 4-qatorda. Brauzer qatoriga manzilni kiritish oddiygina GET so'rovi bo'lgani uchun ($_SERVER["REQUEST_METHOD"] == "GET") yoki yo'qligini tekshirish ma'nosiz. Shuning uchun biz isset() konstruktsiyasiga murojaat qilamiz, agar o'zgaruvchi aniqlangan bo'lsa (ya'ni unga qiymat berilgan bo'lsa) true qiymatini, o'zgaruvchi aniqlanmagan bo'lsa, noto'g'ri qiymatini qaytaradi. Agar shakl to'ldirilgan bo'lsa - siz tushunganingizdek, PHP avtomatik ravishda $_GET["name"] ga tegishli qiymatni belgilaydi.

Isset() yordamida tekshirish usuli universaldir; undan POST formasi uchun ham foydalanish mumkin. Bundan tashqari, bu afzalroqdir, chunki u qaysi shakl maydonlari to'ldirilganligini aniqlash imkonini beradi.

Biroz murakkabroq misol.




echo "Iltimos, ism kiriting!
" ;
< 1900 || $_POST [ "year" ] > 2004 ) {
aks-sado
"
;
) boshqa (

" ;

aks-sado "Senga". $yosh. "yillar
" ;
}
aks-sado "


" ;
}
?>
">
Ismingizni kiriting:


Tug'ilgan yilingizni kiriting:





Bu erda hech qanday yangi texnika qo'llanilmaydi. Buni aniqlang, kodni ishga tushiring, o'zgartirishga harakat qiling ...

Keling, oxirgi misolni foydalanuvchi yana maydonlarni to'ldirishi shart bo'lmasligi uchun o'zgartiraylik. Buning uchun shakl elementlarining qiymat atributlarini biz kiritgan qiymatlar bilan to'ldiring.



$name = isset($_POST [ "ism" ]) ? $_POST [ "name" ] : "" ;
$yil = isset($_POST [ "yil" ]) ? $_POST [ "yil" ] : "" ;

Agar (isset($_POST [ "ism" ], $_POST [ "yil" ])) (
agar ($_POST [ "ism" ] == "" ) (
echo "Iltimos, ism kiriting!
" ;
) else if ($_POST [ "yil" ]< 1900 || $_POST [ "year" ] > 2004 ) {
aks-sado "Iltimos, tug'ilgan yilingizni ko'rsating! Yaroqli qiymat diapazoni: 1900..2004
"
;
) boshqa (
echo "Salom,". $_POST [ "ism" ] . "!
" ;
$age = 2004 - $_POST [ "yil" ];
aks-sado "Senga". $yosh. "yillar
" ;
}
aks-sado "


" ;
}
?>
">
Ismingizni kiriting:


Tug'ilgan yilingizni kiriting:





4 va 5 qatorlar biroz chalkash bo'lishi mumkin.Hammasi juda oddiy: 4-qatorni quyidagicha yozish mumkin:

agar (isset($_POST [ "ism" ]))
$name = $_POST ["ism" ];
boshqa
$name = "" ;

Savol tug'ilishi mumkin - nega 4-5 qatorlarni tashlab, yozmaslik kerak:

Ismingizni kiriting: ">

Tug'ilgan yilingizni kiriting: ">

Gap shundaki, agar ushbu POST o'zgaruvchilari aniqlanmagan bo'lsa - va agar shakl hali to'ldirilmagan bo'lsa, bu shunday bo'ladi - PHP ishga tushirilmagan o'zgaruvchilardan foydalanish haqida ogohlantirishlar beradi (va juda oqilona: bunday xabar sizga o'zgaruvchilar nomlarida aniqlash qiyin bo'lgan matn terish xatolarini tezda toping, shuningdek, saytdagi mumkin bo'lgan "teshiklar" haqida ogohlantiradi). Siz, albatta, isset kodini to'g'ridan-to'g'ri shaklga qo'yishingiz mumkin, ammo bu juda og'ir bo'ladi.

Tushundim? Endi berilgan koddagi xatoni topishga harakat qiling. Xo'sh, aniq xato emas, balki kamchilik.

htmlspecialchars()

Topmadingizmi? Men sizga maslahat beraman. Masalan, "ism" maydoniga qo'sh tirnoq va bir nechta matnni kiriting, masalan, "Va" Shaklni yuboring va natijada paydo bo'lgan sahifaning manba kodini ko'rib chiqing.To'rtinchi qatorda shunday bo'ladi:

Ismingizni kiriting:

Ya'ni, yaxshi narsa yo'q. Agar ayyor foydalanuvchi JavaScript kodini kiritsa nima bo'ladi?

Ushbu muammoni hal qilish uchun siz htmlspecialchars() funktsiyasidan foydalanishingiz kerak, bu maxsus belgilarni HTML ko'rinishi bilan almashtiradi (masalan, " bilan tirnoq"):



$name = isset($_POST [ "ism" ]) ? htmlspecialchars ($_POST [ "ism" ]) : "" ;
$yil = isset($_POST [ "yil" ]) ? htmlspecialchars ($_POST [ "yil" ]) : "" ;

Agar (isset($_POST [ "ism" ], $_POST [ "yil" ])) (
agar ($_POST [ "ism" ] == "" ) (
echo "Iltimos, ism kiriting!
" ;
) else if ($_POST [ "yil" ]< 1900 || $_POST [ "year" ] > 2004 ) {
aks-sado "Iltimos, tug'ilgan yilingizni ko'rsating! Yaroqli qiymat diapazoni: 1900..2004
"
;
) boshqa (
echo "Salom,". $name . "!
" ;
$age = 2004 - $_POST [ "yil" ];
aks-sado "Senga". $yosh. "yillar
" ;
}
aks-sado "


" ;
}
?>
">
Ismingizni kiriting:


Tug'ilgan yilingizni kiriting:





Tajribani takrorlang va HTML kodi to'g'ri ekanligiga ishonch hosil qiling.

Esda tuting - HTML maxsus belgilarni o'z ichiga olishi mumkin bo'lgan o'zgaruvchining mazmunini ko'rsatishda htmlspecialchars() funksiyasidan foydalanish kerak.

phpinfo()

Phpinfo() funksiyasi PHPda eng muhimlaridan biridir. U PHP sozlamalari, turli konfiguratsiya o'zgaruvchilari qiymatlari haqidagi ma'lumotlarni ko'rsatadi...

Nega men buni shakllar haqidagi maqolada eslatib o'taman? phpinfo() - bu nosozliklarni tuzatish uchun qulay vosita. phpinfo(), boshqa narsalar qatori, barcha $_GET, $_POST va $_SERVER o'zgaruvchilari qiymatlarini chop etadi. Shunday qilib, agar forma o'zgaruvchisi yo'qolib qolsa, nima noto'g'ri ekanligini aniqlashning eng oson yo'li phpinfo() funksiyasidan foydalanishdir. Funktsiya faqat o'zgaruvchilar qiymatlarini ko'rsatishini ta'minlash uchun (va siz o'nlab sahifalar bo'ylab aylanmasdan) uni quyidagicha chaqirish kerak: phpinfo (INFO_VARIABLES); , yoki - bu mutlaqo bir xil narsa - phpinfo(32) ;.



">
Ismingizni kiriting:


phpinfo(32);
?>

Yoki, masalan, bu holat: siz tashrif buyuruvchining IP-manzilini bilmoqchisiz. Tegishli o'zgaruvchi $_SERVER massivida saqlanganligini eslaysiz, lekin - omadsizlik - siz o'zgaruvchining aynan nima deb atalishini unutdingiz. Yana phpinfo(32) ga qo'ng'iroq qiling; , belgida IP manzilingizni qidiring va uni $_SERVER["REMOTE_ADDR"] qatoridan toping.

Bugun men ibtidoiy narsalarga biroz chuqurroq kirib, World Wide Web-da ko'p miqdorda va juda qiyinchiliksiz nima topish mumkinligini tasvirlamoqchi edim. Biz HTTP protokolining muqaddasligi haqida amalda gaplashamiz: POST va GET so'rovlari.

Ko'pchilik so'raydi, nega? Men qisqacha va aniq javob beraman: bu nima ekanligini va nima uchun kerakligini hamma ham bilmaydi va bu haqda bilmoqchi bo'lganlar (IT sohasida ozgina tushunsalar ham) ko'pincha bunga bag'ishlangan ko'plab maqolalarda nima yozilganini tushunolmaydilar. mavzu. Men barmoqlarim bilan POST va GET so'rovlari nima ekanligini va ular nima uchun ishlatilishini tushuntirishga harakat qilaman.
Shunday qilib, keling, ertakga sayohatimizni boshlaymiz ...
Agar siz ushbu xabarni o'qiyotgan bo'lsangiz, unda siz hech bo'lmaganda Internet qanday ko'rinishini va Internet-sayt nima ekanligini bilasiz. World Wide Web ishining barcha nozik tomonlarini e'tiborsiz qoldirib, biz foydalanuvchi va sayt kabi tushunchalar bilan ishlaymiz. Kim nima deyishidan qat'iy nazar, bu ikki shaxs qandaydir tarzda bir-biri bilan o'zaro ta'sir qilishi kerak. Masalan, odamlar bir-birlari bilan imo-ishoralar, his-tuyg'ular va nutqlar orqali muloqot qilishadi, hayvonlar ba'zi tovushlarni chiqaradi, lekin odam va Internet-resurs "muloqot qilganda" nima bo'ladi? Bu erda bizda ma'lumot almashish holati bor, uni insonning "Savol-javob" suhbatiga o'tkazish mumkin. Bundan tashqari, foydalanuvchi ham, sayt ham savol va javoblarni berishi mumkin. Veb-sayt haqida gapirganda, uning savol va javoblari, qoida tariqasida, har doim u yoki bu matn bilan Internet sahifasi shaklida ifodalanadi. Foydalanuvchi haqida gap ketganda, hamma narsa GET va POST so'rovlari tufayli sodir bo'ladi (albatta, nafaqat, balki biz ular haqida gapiramiz).

Shunday qilib, bizning mavzu ob'ektlarimiz saytlar bilan "muloqot qilish" uchun zarur ekanligini aniqladik. Bundan tashqari, GET va POST so'rovlari saytga "savol berish" va ularga "javob berish" uchun ishlatilishi mumkin. Ular qanday farq qiladi? Hammasi juda oddiy. Biroq, farqlarni tushuntirish uchun biz misolni ko'rib chiqishimiz kerak, buning uchun biz onlayn-do'kon rejasining saytini olamiz.
Ehtimol, siz onlayn-do'konlarda biror narsa qidirayotganingizda, filtrlar yordamida qidiruv paytida sayt manzili chiroyli "http://magaazin.ru" dan qo'rqinchli "http://magaazin.ru/? = poyabzal va o'lcham = 38". Demak, “?” belgisidan keyin keladigan hamma narsa sizning saytga GET so‘rovingiz bo‘lib, aniqrog‘i, bu holda siz saytdan “38” o‘lchamdagi “Poyafzal” toifasida nima borligini so‘rayapsiz (ushbu misol). Mening boshimdan olingan; aslida hamma narsa unchalik aniq ko'rinmasligi mumkin). Natijada, saytning manzil satrida ularni ko'rsatib, o'zimizga savollar berishimiz mumkin. Shubhasiz, bu usulning bir qancha kamchiliklari bor. Birinchidan, kompyuterda foydalanuvchining yonida bo'lgan har bir kishi barcha ma'lumotlarni osongina josuslik qilishi mumkin, shuning uchun parollarni uzatish uchun ushbu turdagi so'rovlardan foydalanish juda istalmagan. Ikkinchidan, sayt manzili maydonidan uzatilishi mumkin bo'lgan satr uzunligi bo'yicha cheklov mavjud, ya'ni ko'p ma'lumotlarni uzatish mumkin bo'lmaydi. Biroq, GET so'rovlaridan foydalanishning shubhasiz afzalligi uning foydalanish qulayligi va saytni tezda so'rash qobiliyatidir, bu ayniqsa rivojlanish jarayonida foydalidir, ammo bu boshqa hikoya...
Endi POST so'rovlari haqida gapiraylik. Aqlli o'quvchilar ushbu so'rov va uning hamkasbi o'rtasidagi asosiy farq uzatilgan ma'lumotlarning maxfiyligi ekanligini tushunishlari mumkin. Agar onlayn-do'konni ko'rib chiqsak, POST so'rovi qo'llaniladigan yorqin misol - bu saytda ro'yxatdan o'tish. Sayt sizning ma'lumotlaringizni so'raydi, siz ushbu ma'lumotlarni to'ldirasiz va "Ro'yxatdan o'tish" tugmasini bosganingizda javobingizni yuborasiz. Bundan tashqari, bu ma'lumotlar hech qanday tarzda tashqarida ko'rsatilmaydi. Shuni ham ta'kidlash kerakki, juda katta miqdordagi ma'lumotlarni so'rash mumkin - va POST so'rovida hech qanday cheklovlar yo'q. Xo'sh, agar siz minusga tegsangiz, bunday so'rovni tezda yaratib bo'lmaydi. Buni maxsus mahoratsiz qilolmaysiz. Garchi aslida hamma narsa unchalik murakkab bo'lmasa-da, lekin yana, bu boshqa hikoya.
Keling, xulosa qilaylik. POST va GET so'rovlari foydalanuvchi va sayt o'rtasidagi "muloqot" uchun kerak. Ular aslida bir-biriga deyarli qarama-qarshidir. Muayyan turdagi so'rovlardan foydalanish muayyan vaziyatga bog'liq va faqat bitta turdagi so'rovlardan foydalanish juda noqulay.

Agar xatolikni sezsangiz, matn qismini tanlang va Ctrl+Enter tugmalarini bosing
UMUSHISH:
Kompyuterlar va zamonaviy gadjetlar