Http sorğuları işlənir php. PHP istifadə edərək sorğuların işlənməsi. HTML forması vasitəsilə HTTP sorğu parametrlərinin müəyyən edilməsi




Brauzer müştəriləri məlumatı veb serverə göndərə bilərlər.

Brauzer məlumat göndərməzdən əvvəl onu URL kodlaşdırma adlı sxemdən istifadə edərək kodlayır. Bu sxemdə ad/dəyər cütləri bərabər işarələrlə birləşdirilir və müxtəlif cütlər ampersandla ayrılır.

Ad1=dəyər1&adı2=dəyər2&ad3=dəyər3

Boşluqlar silinir və + simvolu ilə əvəz olunur və hər hansı digər qeyri-rəqəm simvolları onaltılıq dəyərlərlə əvəz olunur. Məlumat kodlaşdırıldıqdan sonra serverə göndərilir.

GET üsulu

GET metodu səhifə sorğusuna əlavə edilmiş şifrələnmiş istifadəçi məlumatlarını göndərir. Səhifələr və kodlanmış məlumatlar bir-birindən ayrılıbmı? sual işarəsi.

http://www.test.com/index.htm?name1=value1&name2=value2

  • GET metodu brauzerinizin "Yer" sahəsində server qeydlərində görünən uzun sətir yaradır.
  • GET metodu yalnız 1024 simvol göndərməklə məhdudlaşır.
  • Əgər serverə göndərmək üçün parolunuz və ya digər həssas məlumatınız varsa, heç vaxt GET metodundan istifadə etməyin.
  • GET, şəkillər və ya mətn sənədləri kimi ikili məlumatları serverə ötürmək üçün istifadə edilə bilməz.
  • GET metodu ilə göndərilən məlumatlara QUERY_STRING mühit dəyişənindən istifadə etməklə daxil olmaq olar.
  • PHP GET metodundan istifadə edərək bütün göndərilən məlumatlara daxil olmaq üçün $_GET assosiativ massivini təmin edir.

if($_GET["ad"] || $_GET["yaş"]) ( "Xoş gəlmisiniz ". $_GET["ad"] əks-sədası; "Siz ". $_GET["yaş"]sınız. " yaş "; exit(); )

Adı: Yaş:

POST metodu

Metod POST HTTP başlıqları vasitəsilə məlumat ötürür. Məlumat metodun vəziyyətində təsvir edildiyi kimi kodlanır GET, və başlıqda yerləşdirilir QUERY_STRING.

  • POST metodunda göndərilməli olan məlumatların ölçüsündə heç bir məhdudiyyət yoxdur.
  • POST metodu həm ASCII, həm də ikili məlumatları göndərmək üçün istifadə edilə bilər.
  • POST metodu ilə göndərilən məlumatlar HTTP başlığından keçir, ona görə də təhlükəsizlik HTTP protokolundan asılıdır. Təhlükəsiz HTTP-dən istifadə etməklə siz məlumatlarınızın təhlükəsiz olmasını təmin edə bilərsiniz.
  • PHP POST metodundan istifadə edərək göndərilən bütün məlumatlara daxil olmaq üçün $_POST assosiativ massivini təmin edir.

Mənbə kodunu test.php skriptinə yerləşdirməklə aşağıdakı nümunəni sınayın.

if($_POST["ad"] || $_POST["yaş"]) ( əgər (preg_match("[^A-Za-z"-]",$_POST["ad"])) ( ölmək (" etibarsız ad və ad alfa olmalıdır"); ) echo "Xoş gəlmisiniz". $_POST["ad"]; əks-səda "Siz ". $_POST["yaş"]sınız. "yaşınız."; exit(); )

Adı: Yaş:

$_REQUEST dəyişəni

PHP dəyişəni $_REQUEST kimi məzmunu ehtiva edir $_GET, $_POST, belə ki $_COOKIE. Dəyişən haqqında danışacağıq $_COOKIE biz peçenye haqqında danışanda.

PHP $_REQUEST dəyişəni GET və POST metodlarından istifadə edərək təqdim edilmiş forma məlumatlarından nəticə əldə etmək üçün istifadə edilə bilər.

POST metodu üçün

Formanın məzmunu GET metodu ilə eyni şəkildə kodlaşdırılır (yuxarıya bax), lakin URL-ə sətir əlavə etmək əvəzinə sorğu məzmunu POST əməliyyatının bir hissəsi kimi verilənlər bloku kimi göndərilir. ACTION atributu mövcuddursa, orada tapılan URL dəyəri bu məlumat blokunun hara göndəriləcəyini müəyyən edir. Bu üsul, artıq qeyd edildiyi kimi, böyük məlumat bloklarının ötürülməsi üçün tövsiyə olunur.

İstifadəçi tərəfindən daxil edilmiş və POST metodundan istifadə edərək serverə göndərilən məlumat, fəaliyyət atributunun müəyyən etdiyi proqrama və ya bu atribut buraxılıbsa, cari skriptə standart girişdə xidmət göstərir. Göndərilən faylın uzunluğu CONTENT_LENGTH mühit dəyişəninə, məlumat növü isə CONTENT_TYPE dəyişəninə ötürülür.

Siz yalnız HTML formasından istifadə edərək POST metodundan istifadə edərək məlumatları göndərə bilərsiniz, çünki məlumatlar GET-də olduğu kimi başlıqda deyil, sorğunun mətnində göndərilir. Müvafiq olaraq, parametrlərin dəyərini yalnız formada daxil edilmiş dəyəri dəyişdirməklə dəyişə bilərsiniz. POST istifadə edərkən istifadəçi serverə göndərilən məlumatları görmür.

POST sorğularının əsas üstünlüyü onların GET sorğuları ilə müqayisədə daha yüksək təhlükəsizlik və funksionallıqdır. Buna görə də POST metodundan daha çox mühüm informasiyanın, eləcə də iri miqyaslı informasiyanın ötürülməsində istifadə olunur. Bununla belə, siz bu mexanizmin təhlükəsizliyinə tamamilə etibar etməməlisiniz, çünki POST sorğu məlumatları da saxtalaşdırıla bilər, məsələn, maşınınızda bir HTML faylı yaratmaq və lazımi məlumatlarla doldurmaqla. Bundan əlavə, bütün müştərilər POST metodundan istifadə edə bilməz, bu da onun istifadə hallarını məhdudlaşdırır.

Hər hansı üsulla serverə verilənlər göndərilərkən təkcə istifadəçinin daxil etdiyi məlumatlar deyil, həm də müştərini, onun iş tarixini, fayl yollarını xarakterizə edən mühit dəyişənləri adlanan bir sıra dəyişənlər ötürülür. Budur ətraf mühit dəyişənlərindən bəziləri:

  • REMOTE_ADDR – sorğu göndərən hostun (kompüterin) IP ünvanı;
  • REMOTE_HOST – sorğunun göndərildiyi host adı;
  • HTTP_REFERER – cari skriptə keçid edən səhifənin ünvanı;
  • REQUEST_METHOD – sorğu göndərilərkən istifadə olunan üsul;
  • QUERY_STRING – sual işarəsindən sonra URL-də yerləşən məlumat;
  • SCRIPT_NAME – icra edilməli olan proqrama virtual yol;
  • HTTP_USER_AGENT – müştərinin istifadə etdiyi brauzer haqqında məlumat

Hələlik biz yalnız qeyd etmişik ki, müştəri sorğuları xüsusi proqram vasitəsilə serverdə işlənir. Əslində biz bu proqramı özümüz, o cümlədən PHP-də yaza bilərik və o, alınan məlumatlarla bizim istədiyimizi edəcək. Bu proqramı yazmaq üçün siz PHP-nin bu məqsədlə təklif etdiyi bəzi qaydalar və alətlərlə tanış olmalısınız.



PHP skriptində müştəri tərəfindən HTTP vasitəsilə göndərilən məlumatlara daxil olmağın bir neçə yolu var. PHP 4.1.0-dan əvvəl bu cür məlumatlara çıxış ötürülən dəyişənlərin adları ilə həyata keçirilirdi (yadda saxlayın ki, verilənlər “dəyişən adı, “=” simvolu, dəyişən dəyəri” cütləri şəklində ötürülür). Beləliklə, məsələn, first_name=Nina ötürülübsə, o zaman skriptin daxilində Nina dəyəri olan $first_name dəyişəni peyda oldu. Verilənlərin hansı üsulla ötürüldüyünü ayırd etmək lazım idisə, o zaman $HTTP_POST_VARS və $HTTP_GET_VARS assosiativ massivlərindən istifadə edildi, onların açarları ötürülən dəyişənlərin adları, dəyərlər isə müvafiq olaraq dəyərlər idi. bu dəyişənlərdən. Beləliklə, əgər first_name=Nina cütü GET metodu ilə ötürülürsə, onda $HTTP_GET_VARS["first_name"]="Nina".

Keçirilmiş dəyişənlərin adlarını birbaşa proqramda istifadə etmək təhlükəsiz deyil. Buna görə də, PHP 4.1.0-dan başlayaraq HTTP sorğuları vasitəsilə ötürülən dəyişənlərə daxil olmaq üçün xüsusi massivdən – $_REQUEST – istifadə etmək qərara alındı. Bu massiv POST və GET metodlarından, həmçinin HTTP kukilərindən istifadə etməklə ötürülən məlumatları ehtiva edir. Bu superqlobal assosiativ massivdir, yəni. onun dəyərləri proqramın istənilən yerindən müvafiq dəyişənin (forma elementi) adından açar kimi istifadə etməklə əldə edilə bilər.

Misal 4.2. Deyək ki, yuxarıdakı nümunədə olduğu kimi proqramlaşdırma üzrə qiyabi məktəb üçün iştirakçıları qeydiyyatdan keçirmək üçün forma yaratdıq. Sonra bu formanı emal edən 1.php faylında aşağıdakıları yaza bilərsiniz:

";$str .="Siz ".$_REQUEST["kurs"];echo $str;?> üzrə kurs öyrənməyi seçmisiniz.

Sonra formaya “Vasya” adını, “Petrov” soyadını daxil etdikdə və bütün kurslar arasından PHP kursunu seçsək, brauzer ekranında aşağıdakı mesajı alacağıq:

$_REQUEST massivinin tətbiqindən sonra ardıcıllıq üçün $HTTP_POST_VARS və $HTTP_GET_VARS massivlərinin adları müvafiq olaraq $_POST və $_GET adlandırıldı, lakin onlar özləri PHP-nin əvvəlki versiyaları ilə uyğunluq səbəbindən istifadədən itmədilər. Sələflərindən fərqli olaraq, $_POST və $_GET massivləri super qlobal oldu, yəni. birbaşa və daxili funksiya və üsullara əlçatandır.

Bu massivlərin istifadəsinə bir misal verək. Tutaq ki, ad_ad, soyad, kurs adlı daxiletmə elementləri olan formanı emal etməliyik (məsələn, yuxarıdakı form.html). Məlumat POST metodu ilə ötürülüb və biz başqa üsullarla ötürülən məlumatları emal etmək istəmirik. Bu aşağıdakı kimi edilə bilər:

";$str .= "Siz ". $_POST["kurs"];echo $str;?> üzrə kurs öyrənməyi seçmisiniz.

Sonra brauzer ekranında "Vasya" adını, "Petrov" soyadını daxil etdik və bütün kurslar arasında PHP kursunu seçsək, əvvəlki nümunədə olduğu kimi bir mesaj görəcəyik:

Salam, Vasya Petrov! Siz PHP kursunu öyrənməyi seçmisiniz

PHP 4.1.0-dan daha erkən skriptləri emal etmək qabiliyyətini qorumaq üçün, dəyişənlərə birbaşa adları ilə daxil olmağa icazə verən və ya rədd edən register_globals direktivi təqdim edildi. register_globals=On parametri PHP parametrləri faylındadırsa, GET və POST metodlarından istifadə etməklə serverə ötürülən dəyişənlərə sadəcə adları ilə daxil olmaq olar (yəni $first_name yaza bilərsiniz). register_globals=Deaktivdirsə, onda siz $_REQUEST["first_name"] və ya $_POST["first_name"], $_GET["first_name"], $HTTP_POST_VARS["first_name"], $HTTP_GET_VARS["first_name"] yazmalısınız. Təhlükəsizlik baxımından bu direktivi deaktiv etmək daha yaxşıdır (yəni register_globals=Off). register_globals direktivi aktiv olduqda, yuxarıda sadalanan massivlər həmçinin müştəri tərəfindən ötürülən məlumatları ehtiva edəcək.

Bəzən sorğunun göndərilməsi üçün istifadə olunan üsul və ya sorğunu göndərən kompüterin IP ünvanı kimi mühit dəyişəninin dəyərini bilməlisiniz. Bu məlumatı getenv() funksiyasından istifadə etməklə əldə edə bilərsiniz. Adı ona parametr kimi ötürülən mühit dəyişəninin dəyərini qaytarır.

Dediyimiz kimi, GET metodundan istifadə olunarsa, onda verilənlər resursun URL-inə dəyişən_adı=dəyər cütləri şəklində sorğu sətri əlavə edilməklə ötürülür. URL-də sual işarəsindən sonra hər şeyi əmrdən istifadə etməklə əldə etmək olar

Getenv("QUERY_STRING");

Bunun sayəsində GET metodundan istifadə edərək məlumatları başqa formada ötürmək mümkündür. Məsələn, siz plus işarəsindən istifadə edərək yalnız bir neçə parametrin dəyərlərini təyin edə bilərsiniz və skriptdə sorğu sətirini hissələrə ayıra bilərsiniz və ya yalnız bir parametrin dəyərini ötürə bilərsiniz. Bu halda, $_GET massivində açarı bu qiymətə bərabər olan boş element (bütün sorğu sətri) görünəcək və sorğu sətirində rast gəlinən “+” işarəsi “_” alt xətt işarəsi ilə əvəz olunacaq.

POST metodu ilə məlumatlar yalnız formalardan istifadə etməklə ötürülür və istifadəçi (müştəri) serverə hansı məlumatların göndərildiyini görmür. Onları görmək üçün haker bizim formanı özününkü ilə əvəz etməlidir. Sonra server səhv formanın işlənməsinin nəticələrini yanlış yerə göndərəcək. Bunun qarşısını almaq üçün məlumatların göndərildiyi səhifənin ünvanını yoxlaya bilərsiniz. Bu getenv() funksiyasından istifadə etməklə yenidən edilə bilər:

Getenv("HTTP_REFERER");

İndi mühazirənin əvvəlində tərtib edilmiş problemi həll etməyin vaxtıdır.

(Denver paylanması) və siz PHP-də sadə proqramlar yazmağı öyrəndiniz, o zaman brauzerin (müştərinin) serverə necə sorğu göndərə və müvafiq cavablar ala biləcəyini öyrənməyin vaxtı gəldi. Sadə HTML formasının yaradılması nümunəsindən istifadə edərək, bu cür qarşılıqlı əlaqənin əsas prinsiplərini öyrənəcəyik.

Əgər siz artıq Denver kataloqlarını yaxşı bilirsinizsə, sizin üçün əlverişli kataloqda istənilən PHP faylı yarada və kod yazmağa başlaya bilərsiniz. Hələ öz qabiliyyətlərinə əmin olmayanlar üçün sizə aşağıdakıları etməyi məsləhət görürəm: ev qovluğunda Denver (adətən Z) olan virtual diskdə dərslər qovluğu yaradın. Sonra, bu qovluqda başqa bir qovluq yaradın - www. Bu, brauzerinizin ünvan çubuğundan əldə edilə bilən iş layihə qovluğunuzdur. Denveri yenidən başladın ki, yaradılmış host sistemdə qeydiyyatdan keçsin. Nəhayət, www qovluğunda index.php faylı yaradın. Bu, kodunuz olan əsas fayl olacaq.

Gördüyünüz kimi, bu, adi HTML işarələməsidir, lakin biz faylı index.php adlandırdıq, bu o deməkdir ki, indi PHP-də istənilən təlimatı sənədə daxil edə bilərik.

İndi brauzerinizdə http://derslər/ səhifəsinə keçsəniz, aşağıdakı nəticəni görəcəksiniz:

Sahələri doldurun (məsələn: ad – Vasya, doğum ili – 1990) və “göndər” düyməsini sıxın. Nə görürsən? Heç nə! Yenə eyni forma, yalnız boş. Bununla belə, üzülməyə tələsməyin - brauzerinizin ünvan çubuğuna nəzər salın. Dəyişdi və indi belə görünür:

Http://lessons/index.php?user_name=Vasya&user_year=1990&submit_form=send

Bu o deməkdir ki, server nəhayət məlumatlarınızı qəbul edib!

İndi bunu anlayaq.

GET üsulu

Birincisi, hər halda HTML forması nədir? Bu, müştəri brauzerindən serverə istənilən məlumatı göndərməyə imkan verən interfeysdir. Formanızın atributlarına nəzər salın:

Fəaliyyət atributu göndərilən məlumatın alıcısının ünvanına cavabdehdir. Bizim vəziyyətimizdə forma eyni ünvana göndərilir, yəni. dərslərdə/index.php.

Serverə sorğu göndərmə üsulunu təyin edən metod atributu xüsusilə diqqətəlayiqdir. Bir neçə belə üsul var və ən çox yayılmış (və praktiki) GET və POST üsullarıdır. İndi biz GET metodu ilə maraqlanacağıq.

GET sorğusu o deməkdir ki, verilənlər birbaşa ünvan çubuğu vasitəsilə serverə göndəriləcək. Siz artıq formanı təqdim etməklə bunu görmüsünüz - müəyyən məlumatlar ünvan xəttinə əlavə edilib. Bu məlumatlar haradan gəlir? HTML formasındakı giriş etiketlərinə diqqət yetirin. Onların hamısı sahənin adını təyin edən ad atributuna malikdir.

GET metodu ilə əsas ünvana "?" simvolu əlavə edilir. (sual işarəsi) serverin bəzi məlumatların gəldiyini başa düşməsi üçün. Sonra "?" Məlumatın özü birbaşa ad=dəyər formasında gedir. Birdən çox belə məlumat varsa, onlar "&" birləşmə simvolu ilə ayrılır. Formanı müxtəlif sahə dəyərləri ilə təqdim edin və özünüz baxın.

Alınan məlumatları necə "tutmağı" və emal etməyi öyrənməyin vaxtı gəldi. Fəaliyyət atributunun cari index.php faylına işarə etdiyinə görə, bu o deməkdir ki, verilənlər bura gəlir, ona görə də eyni faylda GET sorğusunun emal kodunu yazacağıq.

Beləliklə, etiketdən dərhal sonra Aşağıdakı PHP kodunu əlavə edək:

Faylı yadda saxlayın, yenidən http://lessons/ səhifəsinə keçin, formanı təqdim edin və - baxın və baxın! - nə görürsən?

Yalnız formanı təqdim etdikdən sonra server qəbul edilir və emal edilir məlumatları qəbul etdiniz və cavabınızı brauzerə göndərdiniz!

Layihəmizin şərti ifadə edən PHP koduna baxaq:

Əgər (isset($_GET["submit_form"])) ( )

Server submit_form adlı GET sorğu dəyişəninin qəbul edilib-edilmədiyini yoxlayır? Yəni, sadə dillə desək, forma hətta təqdim olunubmu? Əgər belədirsə, server tərəfindəki PHP kodu echo bəyanatından istifadə edərək birbaşa istifadəçinin brauzerinə cavabı ilə yeni HTML işarələməsini göndərir. Yazılı işləyici kodunu diqqətlə öyrənsəniz, hər şey dərhal sizə aydın olacaq!

Bu GET metodu maraqlıdır! Ünvan çubuğunu belə bir şeyə dəyişdirin:

Http://lessons/index.php?user_name=My-name&user_year=1900&submit_form=submit

və "Enter" düyməsini basın. Server artıq digər məlumatları qəbul edərək sizə yenidən cavab verəcək! Məncə, bütün bunlar aydındır.

GET metodunun çatışmazlıqları ondan ibarətdir ki, birincisi, ötürülən məlumatların həcminə məhdudiyyət qoyulur, ikincisi, bu üsul açıqdır və istənilən məlumat ələ keçirilə bilər. Buna görə də istifadəçinin şəxsi məlumatları(login, ad, parol və s.) heç vaxt ünvan xətti ilə ötürülə bilməz.

POST metodu

Bu üsul sorğunun gövdəsində məlumatların ayrıca paket axınında ötürülməsini nəzərdə tutur ki, bu da göndərilən məlumatları etibarlı şəkildə qoruyur və yalnız server parametrləri ilə məhdudlaşdırıla bilən təsirli miqdarda məlumat ötürməyə imkan verir. Buna görə də, bu tip sorğu şəxsi məlumatları və istənilən növ faylları göndərmək üçün idealdır.

PHP kodunda $_GET dəyişən adlarını $_POST ilə əvəz edərək faylınızı redaktə edin və formada method="POST" yazın. Səhifəni yeniləyin və formanı yenidən təqdim edin. Nəticə GET metodu ilə eyni olacaq, lakin ünvan çubuğu dəyişməz olaraq qalır, yəni məlumat sorğunun özündə təhlükəsiz formada təhlükəsiz şəkildə göndərilib.

Materialı birləşdirmək üçün istifadəçidən sayta daxil olmaq üçün giriş və şifrəni tələb edəcək kiçik bir veb tətbiqi yaradacağıq. Nümunə kodu nisbətən mürəkkəb olacaq və sizin diqqətinizi və PHP proqramının funksionallığını anlamaq istəyinizi tələb edir.

Index.php faylı:

Nümunəni işə salın və nə baş verdiyini görün. Əvvəlcə istifadəçinin loqini və şifrəsi tələb olunur (kodda onları “admin” və “gizli” olaraq təyin etdik), hər şey düzgündürsə, saytın əsas səhifəsinə, məlumat səhvdirsə, müvafiq xəbərdarlıq göstərilir.

Bu texnologiyanın həyata keçirilməsini nəzərdən keçirək.

Nəzərə alın ki, biz bütün HTML forma kodunu birbaşa çıxarmırıq, lakin onu $form dəyişənində saxlayırıq.

Sitatlarla diqqətli olun! Bütün HMTL kodları tək dırnaqların içərisindədir, ona görə də onun daxili dırnaqları ikiqat dırnaq olmalıdır. yazsaydın

$form = "...sizin kodunuz...",

onda daxili kod əksini ehtiva edəcək - tək dırnaqlar.

Sonra, 27-ci sətir formanın təqdim olunub-olunmamasını yoxlayır (şəkildə 1-ci şərt), yoxsa, HTML forması göstərilir və skript işini dayandırır– die() funksiyası. Brauzerdə formadan başqa heç nə göstərilmir.

Məlumat qəbul edilibsə, POST dəyişənlərinin göstərilənlərə uyğunluğu yoxlanılır (şəkildə 2-ci şərt). Əgər onlar uyğun gəlmirsə, xəbərdarlıq mesajı göstərilir, HTML giriş forması göstərilir və skript yenidən çıxır (die()).

İkinci şərt yerinə yetirilərsə, skript bütün digər ifadələri atlayır və əsas səhifəni göstərməyə keçir. (şəkildə keçid 3).

Bu ən sadə nümunədir. Təbii ki, real layihələrdə belə birbaşa yoxlamalar aparılmır - giriş və parol şifrələnmiş formada fayllarda və ya verilənlər bazasında saxlanılır. Buna görə məqalədə GET və POST sorğuları əsasında müştəri və server arasında qarşılıqlı əlaqə texnologiyası təsvir edilmişdir. Tam hüquqlu proqramlar yaratmaq üçün verilənlər bazası və obyekt yönümlü proqramlaşdırma haqqında möhkəm biliyə sahib olmalısınız. Bu barədə daha çox aşağıdakı məqalələrdə.

Formanın məzmunu metodla eyni şəkildə kodlanır GET(yuxarıya bax), lakin sətir əlavə etmək əvəzinə URL sorğunun məzmunu əməliyyatın bir hissəsi kimi məlumat bloku kimi göndərilir POST. ACTION atributu mövcuddursa, dəyər URL, orada olan bu məlumat blokunun hara göndəriləcəyini müəyyən edir. Bu üsul, artıq qeyd edildiyi kimi, böyük məlumat bloklarının ötürülməsi üçün tövsiyə olunur.

İstifadəçi tərəfindən daxil edilmiş və təqdim edilmiş məlumat server metodundan istifadə etməklə POST, atributda göstərilən proqrama standart girişə verilir hərəkət, və ya bu atribut buraxılıbsa, cari skript. Göndərilən faylın uzunluğu ötürülür mühit dəyişəni CONTENT_LENGTH və məlumat növü CONTENT_TYPE dəyişənindədir.

Metoddan istifadə edərək məlumatları ötürmək POST yalnız köməyi ilə mümkündür HTML formaları, çünki məlumatlar başlıqda deyil, sorğunun mətnində göndərilir GET. Müvafiq olaraq, parametrlərin dəyərini yalnız formada daxil edilmiş dəyəri dəyişdirməklə dəyişə bilərsiniz. İstifadə POST istifadəçi ötürülənləri görmür server data.

Əsas üstünlük POST sorğular GET sorğuları ilə müqayisədə onların daha böyük təhlükəsizliyi və funksionallığıdır. Buna görə də üsul POST Daha tez-tez vacib məlumatları, eləcə də geniş miqyaslı məlumatları çatdırmaq üçün istifadə olunur. Bununla birlikdə, məlumatlardan bəri bu mexanizmin təhlükəsizliyinə tamamilə etibar etməməlisiniz POST Sorğu, məsələn, maşınınızda html faylı yaratmaq və lazımi məlumatlarla doldurmaqla da saxtalaşdırıla bilər. Üstəlik, hamısı deyil müştərilərüsulu tətbiq edə bilər POST, bu da onun istifadə hallarını məhdudlaşdırır.

Məlumat göndərərkən server hər hansı bir üsuldan istifadə etməklə təkcə istifadəçinin daxil etdiyi məlumatlar deyil, həm də adlanan bir sıra dəyişənlər ötürülür. mühit dəyişənləri, xarakterizə edir müştəri, işinin tarixi, fayllara gedən yollar və s. Bunlardan bəziləri mühit dəyişənləri:

    REMOTE_ADDR – sorğu göndərən hostun (kompüterin) IP ünvanı;

    REMOTE_HOST – sorğunun göndərildiyi host adı;

    HTTP_REFERER – cari skriptə bağlanan səhifənin ünvanı;

    REQUEST_METHOD – sorğu göndərilərkən istifadə edilmiş üsul;

    QUERY_STRING - daxil olan məlumatlar URL sual işarəsindən sonra;

    SCRIPT_NAME – icra olunacaq proqrama virtual yol;

    HTTP_USER_AGENT – istifadə edən brauzer haqqında məlumat müştəri

php istifadə edərək sorğuların idarə edilməsi

İndiyə qədər yalnız o istəkləri qeyd etdik müştəri emal olunur server xüsusi proqramdan istifadə etməklə. Əslində, biz bu proqramı özümüz, o cümlədən PHP-də yaza bilərik və o, alınan məlumatlarla bizim istədiyimizi edəcək. Bu proqramı yazmaq üçün siz PHP-nin bu məqsədlə təklif etdiyi bəzi qaydalar və alətlərlə tanış olmalısınız.

PHP skriptində ötürülən məlumatlara daxil olmağın bir neçə yolu var müştəri protokola uyğun olaraq HTTP. PHP 4.1.0-dan əvvəl bu cür məlumatlara çıxış ötürülən dəyişənlərin adları ilə həyata keçirilirdi (yadda saxlayın ki, verilənlər “dəyişən adı, “=” simvolu, dəyişən dəyəri” cütləri şəklində ötürülür). Beləliklə, məsələn, first_name=Nina ötürülübsə, o zaman skriptin daxilində Nina dəyəri olan $first_name dəyişəni peyda oldu. Verilənlərin hansı üsulla ötürüldüyünü ayırd etmək lazımdırsa, o zaman assosiativ massivlərdən istifadə olunurdu. $HTTP_POST_VARS$HTTP_GET_VARS, açarları ötürülən dəyişənlərin adları və dəyərləri müvafiq olaraq bu dəyişənlərin dəyərləri idi. Beləliklə, əgər birinci_adı=Nina cütü metodla ötürülürsə GET, sonra $HTTP_GET_VARS["first_name"]="Nina".

Keçirilmiş dəyişənlərin adlarını birbaşa proqramda istifadə etmək təhlükəsiz deyil. Buna görə də, PHP 4.1.0-dan başlayaraq, HTTP sorğularından istifadə edərək ötürülən dəyişənlərə daxil olmaq üçün xüsusi massivdən istifadə etmək qərara alındı ​​- $_REQUEST. Bu massiv metodlarla ötürülən məlumatları ehtiva edir POSTGET, həm də köməyi ilə HTTP Peçenyelər. Bu superqlobal assosiativ massivdir, yəni. onun dəyərləri proqramın istənilən yerindən müvafiq dəyişənin (forma elementi) adından açar kimi istifadə etməklə əldə edilə bilər.

Misal 4.2. Deyək ki, yuxarıdakı nümunədə olduğu kimi proqramlaşdırma üzrə qiyabi məktəb üçün iştirakçıları qeydiyyatdan keçirmək üçün forma yaratdıq. Sonra bu formanı emal edən file1.php-də aşağıdakıları yaza bilərsiniz:

$str = "Salam,

".$_REQUEST["ad_ad"]."

".$_REQUEST["soyad_adı"]."!
";

$str .="Siz kursda təhsil almağı seçmisiniz

".$_REQUEST["kurs"];

Misal 4.2. Fayl1.php,emalformaform.html(html , mətn )

Sonra formaya “Vasya” adını, “Petrov” soyadını daxil etdikdə və bütün kurslar arasından PHP kursunu seçsək, brauzer ekranında aşağıdakı mesajı alacağıq:

Salam, Vasya Petrov!

Massivi təqdim etdikdən sonra $_REQUEST massivlər $HTTP_POST_VARS$HTTP_GET_VARS ardıcıllıq üçün adı dəyişdirildi $_POST$_GET müvafiq olaraq, lakin onlar özləri PHP-nin əvvəlki versiyaları ilə uyğunluq səbəbindən istifadədən itməyiblər. Sələflərindən fərqli olaraq massivlər $_POST$_GET super qlobal oldular, yəni. birbaşa və daxili funksiya və üsullara əlçatandır.

Bu massivlərin istifadəsinə bir misal verək. Tutaq ki, ad_ad, soyad, kurs adlı daxiletmə elementləri olan formanı emal etməliyik (məsələn, yuxarıdakı form.html). Metoddan istifadə etməklə məlumatlar ötürülür POST, və biz başqa üsullarla ötürülən məlumatları emal etmək istəmirik. Bu aşağıdakı kimi edilə bilər:

$str = "Salam,

".$_POST ["ad_ad"]."

".$_POST ["soyad_adı"] ."!
";

$str .= "Siz " üzrə kurs oxumağı seçmisiniz.

Sonra brauzer ekranında "Vasya" adını, "Petrov" soyadını daxil etdik və bütün kurslar arasında PHP kursunu seçsək, əvvəlki nümunədə olduğu kimi bir mesaj görəcəyik:

Salam, Vasya Petrov!

Siz PHP kursunu öyrənməyi seçmisiniz

PHP 4.1.0-dan əvvəl skriptləri emal etmək qabiliyyətini qorumaq üçün direktiv təqdim edildi. qeydiyyatdan_qloballar, dəyişənlərə birbaşa adları ilə daxil olmağa icazə verir və ya rədd edir. PHP parametrlər faylında register_globals=On parametri varsa, dəyişənlər ötürülür. serverüsulları GETPOST, sadəcə adları ilə əlaqə saxlaya bilərsiniz (yəni $first_name yaza bilərsiniz). register_globals=Deaktivdirsə, onda siz $_REQUEST["first_name"] və ya $_POST["first_name"], $_GET["first_name"], $HTTP_POST_VARS["first_name"], $HTTP_GET_VARS["first_name"] yazmalısınız. Təhlükəsizlik baxımından bu direktivi deaktiv etmək daha yaxşıdır (yəni register_globals=Off). Direktiv işə salındıqda qeydiyyatdan_qloballar yuxarıda sadalanan massivlər də ötürülən məlumatları ehtiva edəcək müştəri.

Bəzən bəzilərinin mənasını tapmaq zərurəti yaranır mühit dəyişəni, sorğunun ötürülməsi üçün istifadə olunan üsul və ya sorğunu göndərən kompüterin IP ünvanı kimi. Funksiyadan istifadə edərək belə məlumatları əldə edə bilərsiniz getenv(). Bir dəyər qaytarır mühit dəyişəni, adı ona parametr kimi ötürülür.

getenv("REQUEST_METHOD");

// istifadə olunan metodu qaytaracaq

echo getenv("REMOTE_ADDR");

// istifadəçinin IP ünvanını göstərəcək,

// sorğunu kim göndərdi

Misal 4.3. getenv() funksiyasından istifadə etməklə (html , mətn )

Artıq dediyimiz kimi, əgər üsul istifadə olunarsa GET, sonra data “dəyişən_adı=dəyər” cütləri şəklində sorğu sətri əlavə edilərək ötürülür. URL- resurs ünvanı." Yazılan hər şey URL sual işarəsindən sonra əmrdən istifadə etməklə əldə edilə bilər

getenv("QUERY_STRING");

Bu üsul sayəsində bu mümkündür GET məlumatları başqa formada ötürmək. Məsələn, siz plus işarəsindən istifadə edərək yalnız bir neçə parametrin dəyərlərini təyin edə bilərsiniz və skriptdə sorğu sətirini hissələrə ayıra bilərsiniz və ya yalnız bir parametrin dəyərini ötürə bilərsiniz. Bu halda, massivdə $_GET açarı bu dəyərə bərabər olan boş element (bütün sorğu sətri) görünəcək və sorğu sətirində rast gəlinən “+” işarəsi alt xətt “_” işarəsi ilə əvəz olunacaq.

Metod POST məlumatlar yalnız formalardan istifadə etməklə ötürülür və istifadəçi ( müştəri) hansı məlumatların göndərildiyini görmür server. Onları görmək üçün haker bizim formanı özününkü ilə əvəz etməlidir. Sonra server səhv formanın işlənməsinin nəticələrini yanlış yerə göndərəcək. Bunun qarşısını almaq üçün məlumatların göndərildiyi səhifənin ünvanını yoxlaya bilərsiniz. Bu funksiyadan istifadə edərək yenidən edilə bilər getenv():

getenv("HTTP_REFERER");

İndi mühazirənin əvvəlində tərtib edilmiş problemi həll etməyin vaxtıdır.

PHP hazırda veb proqramların həyata keçirilməsi üçün ən populyar dillərdən biridir. Bu kurs onun əsaslarını öyrənməyə həsr edilmişdir. Qazanılan bacarıqların praktiki tətbiqinə diqqət yetirilir.

PHP dili İnternetdə konkret praktiki problemi həll etmək üçün yaradılmışdır (bunu kursun ilk mühazirəsini oxumaqla öyrənmək olar). Biz də çalışacağıq ki, nəzəri mülahizələrlə diqqətimizi çox yayındırmayaq və hər bir mühazirədə konkret problemi həll etməyə çalışacağıq. Nümunələrin əksəriyyəti real həyat sistemindən götürülüb: kompüter elmləri tarixinin virtual muzeyi. Kursun birinci hissəsi sintaksis və idarəetmə strukturlarının əsaslarının öyrənilməsinə həsr edilmişdir. Bundan sonra müştəri-server texnologiyası PHP dilinin əsas tətbiq sahəsi hesab olunur. Sonra fikrimizcə ən faydalı daxili funksiyaları öyrənməyə və onların köməyi ilə praktiki problemləri həll etməyə davam edirik. PHP dilində obyekt modeli ən zəngin olmasa da, onun fundamental mövcudluğu obyekt məlumat modellərini təbii şəkildə təsvir etməyə imkan verir. Əsas model kimi virtual informatika muzeyinin sənəd modeli nəzərdən keçiriləcək. Bundan sonra bir sıra tətbiqi aspektlər nəzərdən keçiriləcək: fayl sistemi ilə, verilənlər bazası, sətirlər, sessiyalar, DOM XML ilə işləmək - bütün bunlar bizə dilin praktik istifadəsinin əsas vəzifələrini nəzərdən keçirməyə imkan verəcəkdir.

Yuxarıdakı cədvəldən göründüyü kimi, Apache serveri lider mövqe tutur. Əksi qeyd edilmədiyi təqdirdə veb serverlər haqqında deyəcəyimiz hər şey Apache mərkəzlidir. Artıq ilk mühazirədə onu kompüterinizə necə quraşdırmaq barədə danışdıq. İndi söz verdiyimiz kimi HTTP protokoluna keçək.

HTTP protokolu və verilənlərin serverə ötürülməsi üsulları

İnternet binar məlumatların ötürülməsinin fiziki aspektləri ilə məşğul olan fiziki səviyyədən istifadəçi ilə şəbəkə arasında interfeysi təmin edən tətbiq səviyyəsinə qədər çoxqatlı prinsip üzərində qurulub.

HTTP (HyperText Transfer Protocol) İnternetdə hipermətn məlumatlarının mübadiləsi üçün nəzərdə tutulmuş tətbiq səviyyəsi protokoludur.

HTTP serverə göndərilən sorğunun məqsədini təyin etmək üçün bir sıra metodlar təqdim edir. Bu metodlar istinad intizamına əsaslanır, burada Universal Resurs İdentifikatoru, ya Universal Resurs Lokatoru (URL) və ya Universal Resurs Adı kimi metodun tətbiq edilməli olduğu resursu göstərmək üçün istifadə olunur. ,URN).

HTTP protokolundan istifadə edərkən şəbəkə üzərindən mesajlar İnternet poçt mesajı formatına (RFC-822) və ya MIME (Çox Məqsədli İnternet Poçt Mübadiləsi) mesaj formatına oxşar formatda ötürülür.

HTTP müxtəlif istifadəçi proqramları və SMTP (E-poçt Protokolu), NNTP (Xəbərlər Transfer Protokolu), FTP (Fayl Transfer Protokolu), Gopher və WAIS kimi mövcud İnternet protokollarına çıxışı təmin edən şlüz proqramları arasında əlaqə üçün istifadə olunur. HTTP belə şlüzlərə məlumatları itkisiz olaraq proxy serverlər vasitəsilə ötürməyə imkan vermək üçün nəzərdə tutulmuşdur.

Protokol sorğu/cavab prinsipini həyata keçirir. Sorğu edən proqram - müştəri cavab verən proqram - server ilə qarşılıqlı əlaqəyə başlayır və aşağıdakıları ehtiva edən sorğu göndərir:

Giriş metodu;

URI ünvanı;

Protokol versiyası;

Göndərilən məlumatın növü, sorğu verən müştəri haqqında məlumat və ehtimal ki, mesajın məzmunu (gövdəsi) haqqında məlumatı ehtiva edən mesaj (forma baxımından MIME-ə bənzəyir).

Server cavabında aşağıdakılar var:

Protokol versiyasını və qaytarma kodunu (uğur və ya səhv) ehtiva edən status xətti;

Server məlumatını, meta məlumatı (yəni mesajın məzmunu haqqında məlumat) və mesajın gövdəsini ehtiva edən mesaj (MIME-yə bənzər formada).

Protokolda müştəri ilə server arasındakı əlaqəni kimin açıb bağlamalı olduğu göstərilmir. Təcrübədə əlaqə adətən müştəri tərəfindən açılır və server cavabı göndərdikdən sonra onun dayandırılmasına başlayır.

Sorğuların serverə göndərildiyi formaya daha yaxından nəzər salaq.

Müştəri sorğu forması

Müştəri sorğunu serverə iki formadan birində göndərir: tam və ya qısaldılmış. Birinci formada olan sorğu tam sorğu, ikinci formada isə sadə sorğu adlanır.

Sadə sorğuda giriş metodu və resurs ünvanı var. Formal olaraq bunu belə yazmaq olar:

<Простой-Запрос> := <Метод> <символ пробел>
<Запрашиваемый-URI> <символ новой строки>

Metod GET, POST, HEAD, PUT, DELETE və başqaları ola bilər. Onların ən çox yayılmışları haqqında bir az sonra danışacağıq. Tələb olunan URI ən çox resursun URL-dir.

Sadə sorğu nümunəsi:

http://phpbook.info/ ƏLDƏ EDİN

Burada GET giriş metodudur, yəni. tələb olunan mənbəyə tətbiq edilməli olan üsuldur və http://phpbook.info/ tələb olunan resursun URL-dir.

Tam sorğuda status xətti, bir neçə başlıq (sorğu başlığı, ümumi başlıq və ya məzmun başlığı) və ola bilsin, sorğu orqanı var. Formal olaraq, tam sorğunun ümumi forması aşağıdakı kimi yazıla bilər:

<Полный запрос> := <Строка Состояния>
(<Общий заголовок>|<Заголовок запроса>|
<Заголовок содержания>)
<символ новой строки>
[<содержание запроса>]

Buradakı kvadrat mötərizələr isteğe bağlı başlıq elementlərini göstərir və alternativ seçimlər şaquli çubuq vasitəsilə siyahıya alınır. Element<Строка состояния>sorğu metodu və resurs URI-ni (sadə sorğu kimi) və əlavə olaraq istifadə edilən HTTP protokolunun versiyasını ehtiva edir. Məsələn, xarici proqrama zəng etmək üçün aşağıdakı status xəttindən istifadə edə bilərsiniz:

POST http://phpbook.info/cgi-bin/test HTTP/1.0

Bu halda, POST metodu və HTTP 1.0 versiyası istifadə olunur.

Hər iki sorğu formasında tələb olunan resursun URI-si mühüm rol oynayır. Ən çox yayılmış URI resurs URL-i şəklində istifadə olunur. Serverə daxil olarkən həm URL-nin tam formasından, həm də sadələşdirilmiş formasından istifadə edə bilərsiniz.

Tam forma giriş protokolunun tipini, resurs serverinin ünvanını və serverdəki resursun ünvanını ehtiva edir (Şəkil 4.2).

Qısaldılmış formada, server kökündən yalnız resursun yerini göstərən protokol və server ünvanı buraxılır. Tam forma sorğunu başqa serverə yönləndirmək mümkün olduqda istifadə olunur. Əgər iş yalnız bir serverlə baş verirsə, onda qısaldılmış forma tez-tez istifadə olunur.


düyü. 4.2. Tam URL forması

Metodlar

Artıq qeyd edildiyi kimi, serverə istənilən müştəri sorğusu metodun spesifikasiyası ilə başlamalıdır. Metod müştərinin sorğusunun məqsədini bildirir. HTTP protokolu bir neçə metodu dəstəkləyir, lakin əslində yalnız üçü istifadə olunur: POST, GET və HEAD. GET metodu resurs sorğusunda URI tərəfindən müəyyən edilmiş istənilən məlumatı əldə etməyə imkan verir. Əgər URI proqrama işarə edirsə, onda onun mətni deyil, proqramın işinin nəticəsi qaytarılır (əlbəttə ki, mətn onun əməliyyatının nəticəsi deyilsə). Sorğunu emal etmək üçün lazım olan əlavə məlumat sorğunun özündə (status xəttində) qurulur. GET metodundan istifadə edərkən, resursun əsas sahəsinə faktiki tələb olunan məlumat (məsələn, HTML sənədinin mətni) qaytarılır.

GET metodunun variasiyası var - şərti GET. Bu üsul serverə sorğunun yalnız sorğu başlığının if-Modified-Since sahəsində olan şərt doğru olduğu halda cavablandırılmalı olduğunu bildirir. Daha dəqiq desək, əgər resurs if-Modified-Since-də göstərilən tarixdən sonra dəyişdirilibsə, resurs orqanı sorğuya cavab olaraq ötürülür.

HEAD metodu GET metoduna bənzəyir, lakin resurs orqanını qaytarmır və şərti analoqu yoxdur. HEAD metodu resurs haqqında məlumat əldə etmək üçün istifadə olunur. Bu, məsələn, hipermətn keçidlərinin sınaqdan keçirilməsi problemini həll edərkən faydalı ola bilər.

POST metodu resurs annotasiyaları, xəbərlər və poçt mesajları, verilənlər bazasına əlavə olunacaq məlumatlar kimi məlumatları serverə ötürmək üçün nəzərdə tutulmuşdur, yəni. böyük həcmli və olduqca vacib məlumatların ötürülməsi üçün. GET və HEAD metodlarından fərqli olaraq, POST forma sahələrindən və ya digər giriş mənbələrindən alınan məlumat olan resurs orqanını ötürür.

Bu vaxta qədər biz ancaq əsas anlayışlarla nəzəriləşdirmiş və tanış olmuşuq. İndi bütün bunları praktikada necə istifadə edəcəyinizi öyrənmək vaxtıdır. Sonrakı mühazirədə biz serverə sorğuların necə göndəriləcəyinə və onun cavablarının necə işlənəcəyinə baxacağıq.

Məlumatların Serverə Göndərilməsi üçün HTML Formalarından istifadə

Məlumatı serverə necə ötürmək olar? Bunun üçün HTML dilində xüsusi konstruksiya - formalar var. Formalar istifadəçidən məlumat almaq üçün nəzərdə tutulub. Məsələn, istifadəçinin saytın hansı səhifələrinə daxil olmasına icazə verilə biləcəyini müəyyən etmək üçün onun loqini və şifrəsini bilməlisiniz. Və ya onunla əlaqə saxlamaq üçün istifadəçinin şəxsi məlumatlarına ehtiyacınız var. Belə məlumatları daxil etmək üçün formalar dəqiq istifadə olunur. Siz onlara mətn daxil edə və ya siyahıdan müvafiq variantları seçə bilərsiniz. Formada yazılan məlumatlar serverdə xüsusi proqrama (məsələn, PHP skripti) emal üçün göndərilir. İstifadəçinin daxil etdiyi məlumatlardan asılı olaraq bu proqram müxtəlif veb səhifələr yarada, verilənlər bazasına sorğular göndərə, müxtəlif proqramları işə sala və s.

HTML formalarının sintaksisini anlayaq. Çoxları onunla tanış ola bilər, lakin biz yenə də əsas məqamları təkrar edəcəyik, çünki bu vacibdir.

Beləliklə, HTML-də forma yaratmaq üçün FORM teqindən istifadə olunur. Onun içərisində bir və ya bir neçə GİRİŞ əmri var. FORM teqinin fəaliyyət və metod atributlarından istifadə edərək, siz müvafiq olaraq forma məlumatlarını emal edəcək proqramın adını və sorğu metodunu təyin edirsiniz. INPUT əmri tələb olunan məlumatın növünü və müxtəlif xüsusiyyətlərini təyin edir. Forma məlumatları göndərmə növünün daxiletmə düyməsini basdıqdan sonra göndərilir. Qiyabi proqramlaşdırma məktəbində iştirakçıların qeydiyyatı üçün forma yaradaq.

Brauzer tərəfindən işləndikdən sonra bu fayl belə görünəcək:


düyü. 4.3. Nümunə html forması

HTML formaları belə yaradılır və görünür. Biz onları necə yaratmağı öyrəndiyimizi və ya xatırladığımızı güman edəcəyik. Gördüyümüz kimi, formada məlumat ötürmə üsulunu təyin edə bilərsiniz. Gəlin görək GET və ya POST metodunu göstərsəniz nə baş verəcək və fərq nə olacaq.

GET metodu üçün

GET metodundan istifadə edərək forma məlumatlarını təqdim edərkən, forma məzmunu sual işarəsindən sonra URL-ə ampersand & işarəsi ilə birləşdirilən ad=dəyər cütləri kimi əlavə olunur:

action?name1=value1&name2=value2&name3=value3

Burada fəaliyyət formanı emal etməli olan proqramın URL-dir (ya forma teqinin fəaliyyət atributunda göstərilən proqram, ya da bu atribut buraxılıbsa, cari proqramın özü). Ad1, ad2, ad3 adları forma elementlərinin adlarına, dəyər1, dəyər2, dəyər3 isə bu elementlərin qiymətlərinə uyğundur. Bütün xüsusi simvollar, o cümlədən = və &, bu parametr adları və ya dəyərlərdən çıxarılacaq. Buna görə də, forma elementlərinin adlarında və ya dəyərlərində identifikatorlarda bu simvollardan və kiril simvollarından istifadə etməməlisiniz.

Giriş sahəsinə hansısa xidmət simvolu daxil etsəniz, o, onun onaltılıq kodunda ötürüləcək, məsələn, $ simvolu %24 ilə əvəz olunacaq. Rus hərfləri də eyni şəkildə ötürülür.

Mətn və parol daxiletmə sahələri üçün (bunlar type=text və type=password atributuna malik daxiletmə elementləridir), dəyər istifadəçinin daxil etdiyi hər şey olacaq. Əgər istifadəçi belə sahəyə heç nə daxil etmirsə, o zaman ad= elementi sorğu sətirində mövcud olacaq, burada ad bu forma elementinin adına uyğun gəlir.

Yoxlama qutusu və radio düyməsi düymələri üçün, düymə yoxlanıldıqda dəyər VALUE atributu ilə müəyyən edilir. Sorğu sətirini tərtib edərkən yoxlanılmamış düymələr tamamilə nəzərə alınmır. Lazım gələrsə, bir neçə qeyd qutusu düymələri eyni NAME atributuna (və müxtəlif DƏYƏRLƏR) malik ola bilər. Radio düymə tipli düymələr bütün təklif olunan variantlardan biri üçün nəzərdə tutulub və buna görə də eyni NAME atributuna və fərqli VALUE atributlarına malik olmalıdır.

Prinsipcə, GET metodundan istifadə edərək məlumatların ötürülməsi üçün HTML forması yaratmaq lazım deyil. Siz sadəcə istədiyiniz dəyişənləri və onların dəyərlərini URL sətirinə əlavə edə bilərsiniz.

http://phpbook.info/test.php?id=10&user=pit

Bu baxımdan, GET metodundan istifadə edərək məlumat ötürülməsinin bir əhəmiyyətli çatışmazlığı var - hər kəs parametr dəyərlərini saxtalaşdıra bilər. Buna görə də, parolla qorunan səhifələrə daxil olmaq və ya proqramın və ya serverin təhlükəsizliyinə təsir edən məlumatları ötürmək üçün bu üsuldan istifadə etməyi tövsiyə etmirik. Bundan əlavə, istifadəçinin dəyişdirməsinə icazə verilməyən məlumatları ötürmək üçün GET metodundan istifadə etməməlisiniz.

Bütün bu çatışmazlıqlara baxmayaraq, GET metodundan istifadə skriptləri sazlayarkən (sonra ötürülən dəyişənlərin dəyərlərini və adlarını görə bilərsiniz) və təhlükəsizliyə təsir etməyən parametrləri ötürmək üçün olduqca əlverişlidir.

POST metodu üçün

Formanın məzmunu GET metodu ilə eyni şəkildə kodlaşdırılır (yuxarıya bax), lakin URL-ə sətir əlavə etmək əvəzinə sorğu məzmunu POST əməliyyatının bir hissəsi kimi verilənlər bloku kimi göndərilir. ACTION atributu mövcuddursa, orada tapılan URL dəyəri bu məlumat blokunun hara göndəriləcəyini müəyyən edir. Bu üsul, artıq qeyd edildiyi kimi, böyük məlumat bloklarının ötürülməsi üçün tövsiyə olunur.

İstifadəçi tərəfindən daxil edilmiş və POST metodundan istifadə edərək serverə göndərilən məlumat, fəaliyyət atributunun müəyyən etdiyi proqrama və ya bu atribut buraxılıbsa, cari skriptə standart girişdə xidmət göstərir. Göndərilən faylın uzunluğu CONTENT_LENGTH mühit dəyişəninə, məlumat növü isə CONTENT_TYPE dəyişəninə ötürülür.

Siz yalnız HTML formasından istifadə edərək POST metodundan istifadə edərək məlumatları göndərə bilərsiniz, çünki məlumatlar GET-də olduğu kimi başlıqda deyil, sorğunun mətnində göndərilir. Müvafiq olaraq, parametrlərin dəyərini yalnız formada daxil edilmiş dəyəri dəyişdirməklə dəyişə bilərsiniz. POST istifadə edərkən istifadəçi serverə göndərilən məlumatları görmür.

POST sorğularının əsas üstünlüyü onların GET sorğuları ilə müqayisədə daha yüksək təhlükəsizlik və funksionallıqdır. Buna görə də POST metodundan daha çox mühüm informasiyanın, eləcə də iri miqyaslı informasiyanın ötürülməsində istifadə olunur. Bununla belə, siz bu mexanizmin təhlükəsizliyinə tamamilə etibar etməməlisiniz, çünki POST sorğu məlumatları da saxtalaşdırıla bilər, məsələn, maşınınızda bir HTML faylı yaratmaq və lazımi məlumatlarla doldurmaqla. Bundan əlavə, bütün müştərilər POST metodundan istifadə edə bilməz, bu da onun istifadə hallarını məhdudlaşdırır.

Hər hansı üsulla serverə verilənlər göndərilərkən təkcə istifadəçinin daxil etdiyi məlumatlar deyil, həm də müştərini, onun iş tarixini, fayl yollarını xarakterizə edən mühit dəyişənləri adlanan bir sıra dəyişənlər ötürülür. Budur ətraf mühit dəyişənlərindən bəziləri:

REMOTE_ADDR – sorğu göndərən hostun (kompüterin) IP ünvanı;

REMOTE_HOST – sorğunun göndərildiyi host adı;

HTTP_REFERER – cari skriptə keçid edən səhifənin ünvanı;

REQUEST_METHOD – sorğu göndərilərkən istifadə olunan üsul;

QUERY_STRING – sual işarəsindən sonra URL-də yerləşən məlumat;

SCRIPT_NAME – icra edilməli olan proqrama virtual yol;

HTTP_USER_AGENT – müştərinin istifadə etdiyi brauzer haqqında məlumat

Hələlik biz yalnız qeyd etmişik ki, müştəri sorğuları xüsusi proqram vasitəsilə serverdə işlənir. Əslində biz bu proqramı özümüz, o cümlədən PHP-də yaza bilərik və o, alınan məlumatlarla bizim istədiyimizi edəcək. Bu proqramı yazmaq üçün siz PHP-nin bu məqsədlə təklif etdiyi bəzi qaydalar və alətlərlə tanış olmalısınız.

PHP skriptində müştəri tərəfindən HTTP vasitəsilə göndərilən məlumatlara daxil olmağın bir neçə yolu var. PHP 4.1.0-dan əvvəl bu cür məlumatlara çıxış ötürülən dəyişənlərin adları ilə həyata keçirilirdi (yadda saxlayın ki, verilənlər “dəyişən adı, “=” simvolu, dəyişən dəyəri” cütləri şəklində ötürülür). Beləliklə, məsələn, first_name=Nina ötürülübsə, o zaman skriptin daxilində Nina dəyəri olan $first_name dəyişəni peyda oldu. Verilənlərin hansı üsulla ötürüldüyünü ayırd etmək lazım idisə, o zaman $HTTP_POST_VARS və $HTTP_GET_VARS assosiativ massivlərindən istifadə edildi, onların açarları ötürülən dəyişənlərin adları, dəyərlər isə müvafiq olaraq dəyərlər idi. bu dəyişənlərdən. Beləliklə, əgər first_name=Nina cütü GET metodu ilə ötürülürsə, onda $HTTP_GET_VARS["first_name"]="Nina".

Keçirilmiş dəyişənlərin adlarını birbaşa proqramda istifadə etmək təhlükəsiz deyil. Buna görə də, PHP 4.1.0-dan başlayaraq HTTP sorğuları vasitəsilə ötürülən dəyişənlərə daxil olmaq üçün xüsusi massivdən – $_REQUEST – istifadə etmək qərara alındı. Bu massiv POST və GET metodlarından, həmçinin HTTP kukilərindən istifadə etməklə ötürülən məlumatları ehtiva edir. Bu superqlobal assosiativ massivdir, yəni. onun dəyərləri proqramın istənilən yerindən müvafiq dəyişənin (forma elementi) adından açar kimi istifadə etməklə əldə edilə bilər.

Misal 4.2. Deyək ki, yuxarıdakı nümunədə olduğu kimi proqramlaşdırma üzrə qiyabi məktəb üçün iştirakçıları qeydiyyatdan keçirmək üçün forma yaratdıq. Sonra bu formanı emal edən 1.php faylında aşağıdakıları yaza bilərsiniz:

$str = "Salam,
".$_REQUEST["ad_ad"]."
".$_REQUEST["soyad_adı"]."!
";
$str .="Siz kursda təhsil almağı seçmisiniz
".$_REQUEST["kurs"];
echo $str;
?>

Sonra formaya “Vasya” adını, “Petrov” soyadını daxil etdikdə və bütün kurslar arasından PHP kursunu seçsək, brauzer ekranında aşağıdakı mesajı alacağıq:

Salam, Vasya Petrov!

$_REQUEST massivinin tətbiqindən sonra ardıcıllıq üçün $HTTP_POST_VARS və $HTTP_GET_VARS massivlərinin adları müvafiq olaraq $_POST və $_GET adlandırıldı, lakin onlar özləri PHP-nin əvvəlki versiyaları ilə uyğunluq səbəbindən istifadədən itmədilər. Sələflərindən fərqli olaraq, $_POST və $_GET massivləri super qlobal oldu, yəni. birbaşa və daxili funksiya və üsullara əlçatandır.

Bu massivlərin istifadəsinə bir misal verək. Tutaq ki, ad_ad, soyad, kurs adlı daxiletmə elementləri olan formanı emal etməliyik (məsələn, yuxarıdakı form.html). Məlumat POST metodu ilə ötürülüb və biz başqa üsullarla ötürülən məlumatları emal etmək istəmirik. Bu aşağıdakı kimi edilə bilər:

$str = "Salam,
".$_POST ["ad_ad"]."
".$_POST ["soyad_adı"] ."!
";
$str .= "Siz " üzrə kurs oxumağı seçmisiniz.
$_POST["kurs"];
echo $str;
?>

Sonra brauzer ekranında "Vasya" adını, "Petrov" soyadını daxil etdik və bütün kurslar arasında PHP kursunu seçsək, əvvəlki nümunədə olduğu kimi bir mesaj görəcəyik:

Salam, Vasya Petrov!
Siz PHP kursunu öyrənməyi seçmisiniz

PHP 4.1.0-dan daha erkən skriptləri emal etmək qabiliyyətini qorumaq üçün, dəyişənlərə birbaşa adları ilə daxil olmağa icazə verən və ya rədd edən register_globals direktivi təqdim edildi. register_globals=On parametri PHP parametrləri faylındadırsa, GET və POST metodlarından istifadə etməklə serverə ötürülən dəyişənlərə sadəcə adları ilə daxil olmaq olar (yəni $first_name yaza bilərsiniz). register_globals=Deaktivdirsə, onda siz $_REQUEST["first_name"] və ya $_POST["first_name"], $_GET["first_name"], $HTTP_POST_VARS["first_name"], $HTTP_GET_VARS["first_name"] yazmalısınız. Təhlükəsizlik baxımından bu direktivi deaktiv etmək daha yaxşıdır (yəni register_globals=Off). register_globals direktivi aktiv olduqda, yuxarıda sadalanan massivlər həmçinin müştəri tərəfindən ötürülən məlumatları ehtiva edəcək.

Bəzən sorğunun göndərilməsi üçün istifadə olunan üsul və ya sorğunu göndərən kompüterin IP ünvanı kimi mühit dəyişəninin dəyərini bilməlisiniz. Bu məlumatı getenv() funksiyasından istifadə etməklə əldə edə bilərsiniz. Adı ona parametr kimi ötürülən mühit dəyişəninin dəyərini qaytarır.

getenv("REQUEST_METHOD");
// istifadə olunan metodu qaytaracaq
echo getenv("REMOTE_ADDR");
// istifadəçinin IP ünvanını göstərəcək,
// sorğunu kim göndərdi
?>

Dediyimiz kimi, GET metodundan istifadə olunarsa, onda verilənlər resursun URL-inə dəyişən_adı=dəyər cütləri şəklində sorğu sətri əlavə edilməklə ötürülür. URL-də sual işarəsindən sonra hər şeyi əmrdən istifadə etməklə əldə etmək olar

getenv("QUERY_STRING");

Bunun sayəsində GET metodundan istifadə edərək məlumatları başqa formada ötürmək mümkündür. Məsələn, siz plus işarəsindən istifadə edərək yalnız bir neçə parametrin dəyərlərini təyin edə bilərsiniz və skriptdə sorğu sətirini hissələrə ayıra bilərsiniz və ya yalnız bir parametrin dəyərini ötürə bilərsiniz. Bu halda, $_GET massivində açarı bu qiymətə bərabər olan boş element (bütün sorğu sətri) görünəcək və sorğu sətirində rast gəlinən “+” işarəsi “_” alt xətt işarəsi ilə əvəz olunacaq.

POST metodu ilə məlumatlar yalnız formalardan istifadə etməklə ötürülür və istifadəçi (müştəri) serverə hansı məlumatların göndərildiyini görmür. Onları görmək üçün haker bizim formanı özününkü ilə əvəz etməlidir. Sonra server səhv formanın işlənməsinin nəticələrini yanlış yerə göndərəcək. Bunun qarşısını almaq üçün məlumatların göndərildiyi səhifənin ünvanını yoxlaya bilərsiniz. Bu getenv() funksiyasından istifadə etməklə yenidən edilə bilər:

getenv("HTTP_REFERER");

İndi mühazirənin əvvəlində tərtib edilmiş problemi həll etməyin vaxtıdır.

PHP istifadə edərək sorğunun işlənməsi nümunəsi

Tapşırığın nə olduğunu xatırlayaq və onun tərtibini aydınlaşdıraq. İştirakçıları qiyabi proqramlaşdırma məktəbində qeydiyyatdan keçirmək üçün bir forma yazmalısınız və qeydiyyatdan keçdikdən sonra iştirakçıya mesaj göndərməlisiniz. Biz bu mesajı universal məktub adlandırdıq, lakin əvvəlki mühazirədə tərtib etdiyimiz məktubdan bir qədər fərqli olacaq. Burada da spam göndərənlər kimi olmamaq üçün e-poçt vasitəsilə heç nə göndərməyəcəyik, sadəcə olaraq bu mesajı yaradıb brauzer ekranında göstərəcəyik. Biz artıq yuxarıda qeydiyyat formasının ilkin versiyasını təqdim etmişik. Biz onu elə dəyişəcəyik ki, hər bir qeydiyyatçı iştirak etmək istədiyi qədər kurs seçə bilsin və biz qeydiyyat formasının alındığını təsdiqləməyəcəyik.

Burada hər şey olduqca sadə və aydındır. Qeyd etmək lazım olan yeganə şey, onay qutusu elementinin dəyərlərinin ötürülmə üsuludur. Element adına kurs yazdıqda, bu o deməkdir ki, birinci işarələnmiş qeyd qutusu elementi kurs massivinin birinci elementinə, ikinci işarələnmiş qeyd qutusu ikinci massiv elementinə yazılacaq və s. Siz, əlbəttə ki, qeyd qutusunun elementlərinə sadəcə müxtəlif adlar verə bilərsiniz, lakin bu, çoxlu kurslar varsa, məlumatların işlənməsini çətinləşdirəcək.

Bütün bunları təhlil edəcək və emal edəcək skript 1.php adlanır (forma xüsusi olaraq onun action atributunda yazılmış bu fayla aiddir). Varsayılan olaraq, ötürülmə üçün GET metodu istifadə olunur, lakin biz POST-u təyin etdik. Qeydiyyatdan keçmiş şəxsdən alınan məlumata əsasən, skript müvafiq mesaj yaradır. Bir şəxs bəzi kursları seçibsə, o, onların keçirilmə vaxtı və onları öyrədən mühazirəçilər haqqında mesaj alacaq. Bir şəxs heç nə seçməyibsə, Qiyabi Proqramçılar Məktəbinin (ZSH) növbəti iclası haqqında mesaj göstərilir.