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.
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.
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 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.
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.
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
Siz allaqachon HTML shakllariga duch kelgansiz:
Ushbu kodni HTML faylida saqlash va uni sevimli brauzeringiz yordamida ko'rish orqali siz tanish HTML formasini ko'rasiz:
teg
teg - type atributi bilan aniqlangan shakl elementini belgilaydi:
Boshqa qiymatlar ham mumkin (va - forma elementini belgilaydigan yagona teg emas).
Xo'sh, biz "OK" tugmasini bosganimizda nima bo'ladi?
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
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.
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:
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.
=$_SERVER["PHP_SELF"]?>- uchun qisqartirilgan shakl echo $_SERVER["PHP_SELF"]; ?> .
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:
8-qatorda ham xuddi shunday oson yozish mumkin
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.
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.
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 "
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.
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"):
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 "
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() 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) ;.
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.