Gönderi istekler ve başka neye gelin. GET ve GÖNDERİN İSTİYORUM İLE ÇALIŞMAYIN

Neredeyse tüm programlar için ortak olan iki kavram vardır - bu, giriş verilerinin ve çıkış çıkışının işlenmesidir. Bu sayfada, CGI program girişinin işlenmesine odaklanıyoruz. İlk olarak, giriş verilerinin geldiği ve ikincisi, giriş verileri sunucuya iletilir. Verimli CGI programları yazmak için, bunlar hakkında net bir fikriniz olmalıdır.

Http hakkında biraz.

Sunucu üç tür istek alır: alın, gönderin ve başlayın. Web sunucusuna program talebi aşağıdaki gibidir:

Al /index.html http / 1.0

İlk bölüm bu durum Alın, İkinci, Index.html, İstenen URL, üçüncü, HTTP / 1.0, istemci tarafından kullanılan protokol.

İki ana sorgu yöntemi olsun ve gönderin. Bunlar, bir form oluştururken sizin için mevcut olan yöntemlerdir. Kafa yöntemi, tarayıcı tarafından nadiren kullanılır, çünkü yalnızca bir yanıt başlığı istediği ve yanıt gövdesi bu durumda iletilmez. Örneğin, sayfanın değişmediğini doğrulamak için, tarayıcı bir başlık isteyebilir, ancak tam teşekküllü bir veri değişimi oluşturmaz.

Yöntem almak

Varsayılan olarak, Talep ederken GET yöntemi kullanılır. Post yöntemi, yalnızca form isteğinde açıkça belirtildiğinde kullanılır. Bir CGI programcısı için, get yöntemini talep ederken bu formların URL ile birlikte sunucuya iletildiğini anlamak çok önemlidir. CGI Destek Web Sunucuları Bu verileri Query_String adlı ortam değişkenine kopyalayın. Bundan sonra, çevre değişkeninden veri elde etmek için endişe ve işlemleri CGI programına atanır.

Sorgu dizisinden URL şöyle görünüyor:

Http://www.domen-name.com/login.pl?nick\u003dmaks&psw\u003dparol

İşaret? Sorgu dizesini kaynak URL'sinden ayırır; Nick ve PSW - Sunucuya, Maks ve Parol'a iletilen değişkenler sırasıyla değerleri.

Posta yöntemi

Mesaj yöntemi, yöntem formu özniteliğinde açıkça belirtildiğinde kullanılır. GET yönteminin aksine, URL'de değil, sorgu gövdesinde verileri yerleştirin. Mesaj sorgusu büyük ölçüde HTTP yanıtına benzer. İlk satır standarttır http sorgu.post yönteminin belirtildiği. İsteğin gövdesinden boş bir dize ile ayrılmış gerekli ek başlıklara sahip olabilir.

Mesaj yöntemini kullanırken sorgu gövdesi, programa standart bir giriş akışı olarak iletilir.

Get ve Post Arasında Seçim

CGI programcısının önündeki formlar geliştirildiğinde, soru şu şekilde olacaktır: bu yöntemlerden hangisi geçerlidir. Çoğu durumda, her iki yöntem de uygulanabilir ve her ikisi de iyi çalışacaktır. Bununla birlikte, bir veya başka bir yöntemin kullanımının belirli avantajlar verdiği durumlar vardır.

GET veya POST yöntemini tercih etmek mantıklı olduğu çeşitli durumları göz önünde bulundurun.

  • Programınızın referans olarak çağrılmasını istiyorsanız, PREERENCERENCE GET yöntemi verilmelidir.
  • Programınız tarafından iletilen argümanların sunucu rapor dosyasına kaydedilmesini istemiyorsanız, posta yöntemini kullanın. Örneğin, form kullanıcı adını ve şifreyi belirtmeyi gerektiriyorsa, isimlerin ve şifrelerin rapor dosyasına kaydedilmesini isteme ihtimaliniz düşüktür. Ek olarak, şifreyi URL'nin bir parçası olarak geçmek mantıklı değildir.
  • Formunuzun önemli boyutları varsa, notlar ve yorumlar içeren bir metin kutusu değildir, posta yöntemi kullanılmalıdır. Genel olarak konuşursak, mümkündür ve bu durumda, GET yöntemini kullanın, ancak o zaman URL'nin boyutunda, farklı için farklı sınırlamalarla karşılaşabilirsiniz. işletim sistemleri ve tarayıcılar (çevre değişkenlerinin büyüklüğü nedeniyle sınırlama). Post yöntemini kullanmak daha kolaydır.
  • Formunuz bir dosya alanı içeriyorsa, posta yöntemini kullanın. Ek olarak, bu durumda, MultyPart / Form-Veri'deki Encype niteliğinin değerini ayarlamanız gerekir.

Tarayıcı istemcileri bir Web sunucusuna bilgi gönderebilirler.

Tarayıcı bilgi göndermeden önce, URL kodlaması adı verilen bir şemayı kullanarak kodlar. Bu çift şemada, isim / değer eşit işaretlerle birleştirilir ve farklı çiftler ampersand'a bölünür.

İsim1 \u003d value1 & name2 \u003d value2 & name3 \u003d value3

Boşluklar kaldırılır ve bir + sembolü ile değiştirilir ve diğer alfa olmayan sayısal karakterler onaltılık değerler ile değiştirilir. Bilgi kodlandıktan sonra, sunucuya gider.

Yöntem almak

GET yöntemi, sayfanın isteğine eklenen kodlanmış kullanıcı bilgilerini gönderir. Sayfalar ve kodlanmış bilgiler birbirinden ayrılır mı? Bir soru imzala.

http://www.test.com/index.htm?name1\u003dvalue1&name2\u003dvalue2.

  • GET yöntemi, sunucunuzda görüntülenen uzun bir dize, tarayıcının "konum" alanında oturum açar.
  • GET yöntemi sadece 1024 karakter göndermekle sınırlıdır.
  • Bir şifreniz ya da başka bir şifreniz varsa, Ala yöntemini asla kullanmayın. kesin bilgi Sunucuya göndermek için.
  • Görüntüler veya metin belgeleri gibi ikili verileri sunucuya aktarmak için kullanılamaz.
  • GET yöntemiyle gönderilen verilere erişim, Query_String ortam değişkeni kullanılarak elde edilebilir.
  • PHP, GET yöntemini kullanarak gönderilen tüm bilgilere erişmek için bir ilişkisel $ _GET dizisi sağlar.

if ($ _ almak ["isim"] || $ _GET ["Hoş Geldiniz". $ _GET ["İsim"]; Echo "Sen." $ _GET ["Yaş"]. "Yaşında."; Çıkış () ;)

İsim: Yaş:

Posta yöntemi

Yöntem İLETİ. HTTP başlıkları ile bilgi gönderir. Bilgi, bir yöntem durumunda açıklandığı şekilde kodlanır. Almak.ve başlığa yerleştirildi Query_string..

  • Post yönteminin göndermek istediğiniz verilerin boyutunda herhangi bir kısıtlama yoktur.
  • Post yöntemi, ASCII'yi ve ikili veri göndermek için kullanılabilir.
  • Posta yöntemi tarafından gönderilen veriler bir HTTP başlığından geçer, bu nedenle güvenlik HTTP protokolüne bağlıdır. Güvenli HTTP kullanarak, bilgilerinizin korunmasını sağlayabilirsiniz.
  • PHP, posta yöntemini kullanarak gönderilen tüm bilgilere erişmek için bir ilişkisel $ _POST dizisi sağlar.

Kaynak kodunu Test.php komut dosyasına yerleştirerek aşağıdaki örneği deneyin.

if ($ _ sonrası ["isim"] || $ _POST ["AGE"]) (eğer (preg_match ("[^ a-za-z" -] ", $ _ sonrası [" isim "])) ("Geçersiz isim ve ad alfa olmalıdır");) echo "hoş geldiniz". $ _POST ["isim"]; yankı "sen. $ _Post [" yaş "]." Yaşında. "; Çıkış ();)

İsim: Yaş:

Değişken $ _Request

Php değişkeni $ _Request. Gibi içerik içerir $ _GET., $ _POST., yani ben. $ _COOKIE.. Değişkeni tartışacağız $ _COOKIE.Kurabiyeleri anlattığımızda.

PHP $ _REQUEST değişkeni, GET ve POST yöntemleri kullanılarak gönderilen form verilerinden bir sonuç elde etmek için kullanılabilir.

Aralarında ortak olarak, eşit olarak çalıştıkları gerçeği. Aralarındaki fark teknik olarak no. Ancak ideolojik farklılıklar var.

PHP bağlamında onlar hakkında söyleyeceğim. PHP'nin HTTP protokolünün dolaylı bir tutum olduğunu, çünkü değiş tokuş için yaratıldığını unutmayın. html sayfaları PHP basitçe olasılıkları ve diğerini genişletir.

Verileri göndermek için bir posta almak için bir sorgu alın. (Size teknik olarak eşit olarak çalıştığını hatırlatırım).

Bu nedenle, PHP bağlamında, bu ideolojiye güvenmek aşağıdaki gibi yapıldı:
1. Her PHP piyasaya sürülürken, süperglobal dizileri ($ _GET, $ _POST) varsayılan olarak oluşturulur.
2. Sorgu dizesinde (?) Bir soru işareti varsa. Sonra her şey peşinden sayılır parametreler "Anahtar" formatında sunuldukları istekleri alın \u003d "değer" ve bir AMPERSAND işareti (&) ayırıcı olarak kullanılır
Misal:
Al /index.php?name\u003dandrey&surname\u003dhalkin
Bu, burada 2 parametre bir sorgu dizesidir. Bu parametreler $ _GET dizisine düşecektir.
3. $ _POST başka bir yolla doludur. Bu dizinin içeriği "istek başlıkları" ndan doldurulur. Yani, gözlerden gizlenen yerden açıkça. Bu tür başlıkları oluşturmak için tüm rutin bir tarayıcıyı alır. Bazen bir şey manuel olarak manuel olarak düzenlenmesine rağmen.

En sık, posta isteği formlarda kullanılır (veri göndermek için).

Örneğin, 2 alan giriş ve şifreyi oturum açmak için bir formumuz var.

GET yöntemini kullandığımızı hayal edin. Ardından, bir form gönderirken, aşağıdaki adrese döneriz. /Login.php?login\u003dandrey&password\u003d123, bu bilgileri iletmek için güvenli olmadığına karar veriyoruz. Herkes tarayıcınızı açabilir ve site adresini girmeye başlayabilir. Şifrelerinizi ve girişinizi görebilir.

Ancak posta yöntemiyle belirtildiysek, aşağıdaki talebi alırız:
Post / login.php (login \u003d Andrey & Password \u003d 123) Parantez içindeki neyin gizleneceği ve tarayıcıya kaydedilmemelidir.

Genel olarak, özetleme:
Alın, belirli bir formda belirli bir sayfa elde etmektir (sıralama, geçerli sayfa Blog, Arama Dize vb.).
Post - Sayfa ekranını etkilemeyen mandrel verileri için, bu verilerin yalnızca komut dosyası yürütülmesi sonucunu etkiler (girişler, şifreler, kredi kartı numaraları, mesajlar vb.).

Ve örneğin bir daha iyi haber birleştirilebilir, örneğin
Post /index.php?page\u003dLogin (login \u003d Andrey & Password \u003d 123) Sanırım, ortaya çıktığını ve hangi dizinin hangi parametrelerin düşeceğini yeterince açıkladım.

Modern web kaynakları sadece ziyaretçiye bilgi vermez, aynı zamanda bununla etkileşimde bulunur. Kullanıcı ile etkileşime geçmek için, ondan biraz bilgi almanız gerekir. Veri elde etmek için çeşitli yöntemler, çok yaygın yöntemler vardır. Almak. ve İLETİ.. Ve sırasıyla B. Php. Bu veri aktarım yöntemleri için destek var Almak. ve İLETİ.. Bu yöntemlerin nasıl çalıştığını görelim.
Yöntem almakVeri aLMAK. Bunları, alınan bilgileri işlemek için tasarlanan senaryoların URL adresine ekleyerek iletilir. Açıklama için bu method Adres çubuğundaki adres çubuğundaki Kaynak URL'sini çevirin ve önce soru işareti (?) Ve ardından num \u003d 10 numarasını ekleyin. Örneğin

http: //domure.ru/script.php? num \u003d 10


Eğer varsa yerel sunucu, sonra genellikle etki alanı localhost olacak ve daha sonra önceki giriş görünecek

http: //localhost/script.php? num \u003d 10


Bu durumda, num parametresini 10 olarak iletiyoruz. Aşağıdaki parametreleri eklemek için, komut dosyası kullanılmalı - örneğin

http: //domure.ru/script.php? num \u003d 10 & type \u003d new & v \u003d metin


Bu durumda, üç parametreyi komut dosyasına aktardık: numara 10 değeri olan numara, "Yeni" ve V değeri ile "Metin" değeri ile yazın.
Bu parametreleri komut dosyasında almak için yerleşik bir diziyi kullanmanız gerekir. $ _GET. $ _GET ["num"], $ _GET ["Tipi"], $ _ GET ["V"]. Bu dizi elemanları, iletilen parametrelerin değerlerini içerecektir. Bu örneği göstermek için, aşağıdaki gibi bir Script.php dosyası oluşturun.



PHP'de GET yönteminin kontrol edilmesi


yankı ($ _GET ["num"]. "
");
echo ($ _GET ["tipi"]. "
");
echo ($ _get ["v"]);
?>


Ve şimdi bu dosyayı tarayıcıda arayın

http: //at/script.php? num \u003d 10 & type \u003d new & v \u003d metin


ve tarayıcı penceresindeki iletilen parametreleri göreceksiniz. Ancak bu dosyayı olmadan ararsanız ek parametreler http: ////script.php, tercüman verecek hataları göreceksiniz Php.Array $ _get'in bu tür unsurları olmadığını. Bu verileri kullanıcıdan kontrol etmek, bir makale değil, bu makalede bu anda dokunmayacağım.
Muhtemelen anladığınız gibi, kullanıcının adres çubuğundaki verileri çevirmesini zorlamak için çok iyi ve tamamen uygunsuz değildir. Bu nedenle, kullanıcıdan veri almak için HTML formu kullanmanız gerekir. Basit bir HTML -Form yazın.


Numarayı girin

Bilgisayarın var mı?

Senin yorumun:





Oluşturulan formda yorum yapıyorum. Formlar form etiketi tarafından oluşturulur. Form alanları giriş, SELECT, TEXTAREA etiketlerine göre oluşturulur (daha fazlasını okuyabilirsiniz). Form etiketinde, komut dosyasının URL'si bu formları alacak olan Eylem niteliğinde belirtilmiştir. Bizim durumumuzda, zaten mevcut Script.php dosyasını zaten belirledik. Yöntem niteliği veri gönderme yöntemini ayarlar. Yöntemi belirttik Almak.. Şimdi bu dosyanın hangi dosyanın bulaşacağını ve hangi yöne yollanacağını biliyoruz.
Bu form verileri, bunları URL'ye ekleyerek Web Kaynak Tarayıcısına aktarılacaktır: Öncelikle bir soru işareti (?), Ardından parametreler parametre (&) ile ayrılır. Parametre adı, herhangi bir alan alanından hecelenmesi gereken Ad Özniteliğinden alınacaktır. Parametrenin değeri, alanın türüne bağlı olacaktır. Alan metinliyse, kullanıcı tarafından girilen metin kullanıcı olacaktır. Alan bir liste olacaksa, bir grup anahtar veya bayrak olursa, seçilen öğenin değerinin değerinin değeri parametrenin değeri olacaktır. Formumuzun örneğini açıklayacağım. Kullanıcı giriş alanındaki 10 numaraya girerse, parametrenin adı num (giriş etiketinin ad özniteliğinin değeri) ve değer (kullanıcı tarafından girilen sayı) olacaktır. Buna göre, tarayıcı bir çift "num \u003d 10" oluşturur. Eğer listedeki kullanıcı "YES" seçeneğini seçerse, parametrenin adı türü olacaktır (isim etiketinin seçilen değer özniteliği) ve değer değer olacaktır (değer etiketinin değerinin değerinin değeri) ). Buna göre, tarayıcı bir çift "Tip \u003d YES" oluşturur.
Şimdi bu form forma.php sayfasına yerleştirilecektir.



GET ve PHP kullanarak veri aktarım formu



Numarayı girin

Bilgisayarın var mı?

Senin yorumun:







Form alanlarına herhangi bir değer girin ve "Gönder" düğmesini tıklayın. Tarayıcı düğmesine bastıktan sonra, başka bir sayfayı (script.php) açar ve girdiğiniz veriler tarayıcı penceresi görüntülenecektir. Neden olduğunu düşünüyorum: Tarayıcı veri script.php dosyasına ve komut dosyasına veri aktarır. Bu veriler işlenecek ve görüntülenecektir.
Posta yöntemiŞimdi yöntemin nasıl çalıştığına bakalım İLETİ..
Bu yöntemleri göndermek için İLETİ. HTML formunu kullanmanız gerekir. Veri gönderme yönteminin yöntem özniteliğine cevap verdiğini nasıl hatırlıyoruz. etiket formu . Bu nedenle, Yöntem niteliğindeki posta değerini belirtmeniz gerekir. Aksi takdirde, form GET yöntemiyle aynı olabilir. POST yöntemiyle veri aktarma yöntemine veri aktarmak için kullandığımız şeklimi değiştireceğiz.


Numarayı girin

Bilgisayarın var mı?

Senin yorumun:





Gördüğünüz gibi, form, yöntem ve eylem nitelikleri hariç aynı şekilde kalır. Şimdi veriler script_post.php komut dosyasına geçilecektir. Formumuzu forma_post.php sayfasında konumlandırın.



Post ve PHP veri aktarım formu



Numarayı girin

Bilgisayarın var mı?

Senin yorumun:







Şimdi form verilerimizi işleme koyacak bir komut dosyası yazmanız gerekir.
Veri komut dosyasında bulaşan bir yöntem elde etmek için İLETİ. yerleşik bir diziyi kullanmanız gerekir $ _POST.. Bu dizinin anahtarları parametrelerin isimleri olacaktır. Bizim durumumuzda, kullanmanız gerekir $ _POST ["num"], $ _POST ["Tipi"], $ _ sonrası ["v"]]. Bu dizi elemanları, iletilen verilerin değerlerini içerecektir. GET yöntemini kullanmanın farkını gördüğünüz gibi, yalnızca yalnızca bir dizi $ _POST kullanımında ifade edilir. Bu nedenle, bir script_post.php dosyası yazmak zor olmayacağız:



PHP'deki posta yönteminin doğrulanması


yankı ($ _POST ["num"]. "
");
yankı ($ _POST ["tipi"]. "
");
yankı ($ _post ["v"]);
?>


Şimdi tarayıcıdaki forma_post.php dosyasını açın. Form alanına bazı verileri girin ve "Gönder" düğmesine basın. Şimdi, muhtemelen, posta yöntemi arasındaki farkı fark ettiniz - bu formlar tarayıcının adres çubuğunda görünmedi. Veri Yöntemi İLETİ. Tarayıcının adres çubuğundan geçemezsiniz. Bu temel farkın hatırlanması gerekir.
İÇİNDE Php. Bağımsızlıkta, hangi yöntem verileri gönderildi - POST YÖNTEMİ VEYA GET YÖNTEMİ tarafından - bir $ _REQUEST dizisini kullanarak veri elde etmek için. GET ve POST yöntemlerinin karşılaştırılmasıGET yöntemini kullanırken, veriler URL'ye eklenerek iletilir. Böylece, kullanıcı tarafından güvenlik açısından her zaman iyi olmadığı için görülebilirler. Ayrıca, bulaşan veri miktarı tarayıcıya bağlıdır - tarayıcı adres çubuğunun kesilebilir maksimum sayıdaki maksimum sayıda tarayıcıya bağlı olacaktır.
Gönder yöntemini kullanırken, veriler kullanıcı tarafından görülmeyecektir (tarayıcının adres çubuğunda görüntülenmiyor). Bu nedenle, daha fazla korunurlar ve bu nedenle, bu verilerin işlenmesi güvenlik açısından daha fazla korunur. Ayrıca, bulaşan verilerin miktarı pratik olarak sınırlı değildir.
Bir veri aktarımının bir yolunu seçerken, verilen özellikleri dikkate almanız ve durdurmanız gerekir.

HTML formu. Diziler $ _POST ve $ _GET

HTML formu. Sunucuya veri gönderme yöntemleri

HTML-Formlar ile muhtemelen zaten tanıştınız:

Adınızı giriniz:

Bu kodu HTML dosyasında kaydetme ve favori tarayıcınızla görüntüleme, her zamanki HTML formunu göreceksiniz:

Etiket

Bir çift final etiketine sahip olmak
, Aslında formu sorar. Nitelikleri her ikisi de isteğe bağlıdır:

  • eylem - formun gönderileceği URL'yi (dolu veya akraba) gösterir. Bu özellik belirtmezse, çoğu tarayıcı (daha kesin bir şekilde konuşurken, tüm tarayıcılar) geçerli belgeye bir form göndermez, yani "kendilerine". Bu uygun bir azalma, ancak HTML standardına göre, eylem niteliği gereklidir.
  • yöntem, form göndermenin bir yoludur. İkisi var.
    • GET - Adres çubuğunda form verilerini gönderme.
      "?" Sembolünün URL'sinin sonundaki varlığını fark edebilir misiniz? Ve aşağıdaki veriler format parametresinde \u003d değer. Burada "parametre", form öğelerinin ad özniteliğinin değerine karşılık gelir (TEG hakkında aşağıya bakınız. ) ve "değer" - değer niteliğinin içeriği (örneğin, içinde, kullanıcı girişini aynı etiketin metin alanına içerir. ).
      Örneğin, Yandex'te bir şey aramayı deneyin ve tarayıcının adres çubuğuna dikkat edin. Bu bir get yöntemdir.
    • Kalıp sonrası bunlar sorgu gövdesine gönderilir. Tamamen açık değilse (veya tamamen belirsizdir), ne olduğu - endişelenmeyin, yakında bu soruna geri döneceğiz.
    Yöntem niteliği belirtilmezse - GET demek istedim.

Etiket - Tip özniteliği tarafından tanımlanan form öğesini belirtir:

  • "Metin" değeri, tek hatlı bir giriş alanı ayarlar
  • "Gönder" değeri, formun sunucuya basıldığında düğmeyi ayarlar.

Diğer değerler mümkündür (ve - Form öğesini belirten tek etiket değil).

Peki "Tamam" düğmesine bastığımızda ne olur?

  1. Tarayıcı, şekle dahil edilen elemanları tarayan ve isimlerinden üretir ve bu formların özelliklerini oluşturur. Vasya isminin tanıtıldığını varsayalım. Bu durumda, bu formlar - İsim \u003d Vasya & Okbutton \u003d Tamam
  2. Tarayıcı, sunucuya bir bağlantı kurar, eylem etiketi özniteliğinde belirtilen sunucuya bir istek gönderir.
    Yöntem niteliğinde belirtilen gönderme yöntemini (bu durumda - olsun) kullanarak, sorguya veri iletmek.
  3. Sunucu, alınan sorguyu analiz eder, bir cevap oluşturur, tarayıcıya gönderir ve bağlantıyı kapatır
  4. Tarayıcı, sunucudan alınan belgeyi görüntüler.

Aynı sorguyu manuel olarak göndermek (Telnet'in yardımıyla) böyle görünüyor (varsayalım alan adı Site - www.example.com):

Telnet www.example.com 80 al /cgi-bin/form_handler.cgi?name\u003dvasya&okbutton\u003dok http / 1.0 \\ r \\ n Ana Bilgisayar: www.example.com \\ r \\ n \\ r \\ n

Sizin gibi, büyük olasılıkla, "get" gönderme yöntemiyle formdaki Gönder düğmesine basıldığında, tarayıcı adresindeki karşılık gelen URL'nin girişine benzerdir (bir soru işareti ve formda veri formu ile) bar:

Http://www.example.com/cgi-bin/form_handler.cgi?name\u003dvasya&okbutton\u003dok

Aslında, GET yöntemi her zaman sunucudan bir belge istediklerinde, sadece URL'sini girerek veya bağlantıyı tıklatarak kullanılır. Kullanma URL sadece bir soru işareti ekler ve veri formu ekleyin.

Belki de tüm bu teknik detaylar ve telnet-ohm ile yapılan alıştırmalar inanılmaz derecede sıkıcı ve hatta gereksiz ("ve php nedir?").). Ve boşuna. :) Bunlar, her bir Web programcısını bilmeniz gereken HTTP protokolünde çalışmanın temelleridir ve bu teorik bilgi değil - tüm bunlar pratikte faydalıdır.

Şimdi formumuzun ilk dizesini aşağıdakilere değiştirin:

"Mesaj" ın Gönderme yöntemini belirttik. Bu durumda, veriler sunucuya başka bir şekilde gönderilir:

Telnet www.example.com 80 post /cgi-bin/form_handler.cgi http / 1.0 \\ r \\ n Ana Bilgisayar: www.example.com \\ r \\ n İçerik türü: Uygulama / x-www-form-urlencoded \\ r \\ N İçerik boyu: 41263 \\ r \\ n \\ r \\ n Name \u003d Vasya & Okbutton \u003d OK

POST yöntemini kullanırken, bu formlar sorgu gövdesinde "iki girer" sonra gönderilir. Yukarıdaki tüm bunlar aslında bir sorgu başlığıdır (ve get yöntemini kullandığımızda, bu formlar başlığa gönderildi). Sunucunun, isteğin bedenlerini okumayı nasıl bitireceğini bilmesi için, başlık içerik uzunlukta satırında bulunur; Hakkında, form verilerinin parametre1 \u003d value1 ve parametre2 \u003d value2 ... parametresiyle iletileceği ve değerler urlencode olarak iletilir - bu, bu, bu, GET yöntemiyle olduğu gibi, ancak sorgu gövdesinde, sunucuda olduğu gibi İçerik başlığını bildirir -Type: Uygulama / X-WWW-Form-urlencoded.

Posta yönteminin avantajı, form verileri ile dizenin uzunluğundaki sınırın olmamasıdır.

POST yöntemini kullanırken, bir form göndermek imkansızdır, sadece "Bağlantıya girmeye", olsun.

Posta formunu kullanırken, eylem özniteliğinde, soru işaretinden ve parametrelerin elde ettiğinden sonra belirtebilirsiniz. Böylece, posta yöntemi hem GET yöntemini de içerir.

Diziler $ _GET ve $ _POST

Böylece, formlar web sunucusu ile tarayıcı arasında veri alışverişinde bulunmanın ana yoludur, yani, kullanıcı ile etkileşim sağlayan, bunun için web programına ihtiyacınız olan.

Basit bir örnek düşünün:



İf ($ _server ["Request_method"] \u003d\u003d "POST") (
Eko "

Merhaba, "$ _POST [" isim "]."

!" ;
}
?>
">
Adınızı giriniz:




8-12 satırlarındaki form iki madde içerir: İsim ve Okbutton. Yöntem niteliği, form form yöntemini belirtir, formun gönderildiği URL'yi gösteren eylem niteliği PHP_SE Server değişken değeri - şu anda komut dosyasının adresi.

- Kısaltılmış kayıt şekli .

Diyelim ki, İsim alanında Vasya'nın değerine girdik ve OK düğmesine basıldı. Aynı zamanda, tarayıcı posta sunucusuna gönderir. Sorgu Gövdesi: İsim \u003d Vasya & Okbutton \u003d Tamam. PHP, $ _POST dizisini otomatik olarak doldurur:

$ _POST ["name"] \u003d "Vasya"
$ _POST [OKBUTTON] \u003d "Tamam"

Aslında, "Vasya" değeri, URLENCODE formundaki tarayıcıya gönderilir; Windows-1251 kodlaması için, bu değer% C2% E0 F1% FF gibi görünür. Ancak, PHP otomatik olarak gerekli kod çözmeyi gerçekleştirdiğinden, bu özelliği "unutabiliriz" - HTTP sorgularıyla manuel olarak çalışmanız gerekir.

Sorgu gövdesinde olduğundan, yalnızca ad ve değerler belirtilir, ancak form elemanlarının türleri değil, PHP'nin hiçbir fikri yoktur, $ _POST ["ad"] giriş satırı, düğme veya liste karşılık gelir. Ancak bu bilgi genel olarak kesinlikle gerekli değildir. :)

Gönder düğmesinde neyin yazıldığını bildiğinizden, isteğe bağlıdır, 11 numaralı satırda, ad özniteliğini siler, düğme açıklamasını kısaltabilirsiniz. . Bu durumda, tarayıcı adını gönderir \u003d Vasya-Vasya.

Ve şimdi - aynı, ancak elde edilenler için:



if (isset ($ _ almak ["isim"])) (
Eko "

Merhaba, "$ _GET [" isim "]."

!" ;
}
?>
">
Adınızı giriniz:





8. sırada aynı başarı ile yazmak mümkün olacaktır.

: GET - Varsayılan yöntem. Bu sefer, tarayıcı adres çubuğunun girmesine eşdeğer olan GET-Talep gönderir: http: //adress-site./mety-script.php? Name \u003d Vasya.

Get-Forms ile PHP, $ _GET dizisinin doldurulması farkı olan postayla aynı şekilde girer.

Kardinal farkı 4. hattadır. Tarayıcı dizesindeki adresin basit girişi bir alıcıdır, ($ _Server ["Request_method"] \u003d\u003d "get") anlamsız olup olmadığını kontrol edin. Bu nedenle, bu değişken tanımlanmışsa (yani, bir değer atandı) ve yanlış - değişken tanımlanmadıysa, Disket () tasarımına başvuruyoruz. Form doldurulmuşsa - zaten anlaşıldığınız gibi, PHP, ilgili değeri otomatik olarak $ _get ["ad"] atar.

Muayene, ISSET () - Universal kullanılarak kullanılır, posta formu için kullanılabilir. Ayrıca, formun hangi alanlarının doldurulduğunu bulmanıza izin verdiği için tercih edilir.

Biraz daha karmaşık bir örnek.




Echo "adını belirtin!
" ;
< 1900 || $_POST [ "year" ] > 2004 ) {
Eko.
"
;
) BAŞKA (

" ;

Echo "sen. $ Yaş. "Yıllar
" ;
}
Eko "


" ;
}
?>
">
Adınızı giriniz:


Doğum yılınızı girin:





Burada yeni teknik kullanılmaz. Gözlem, kodu yürütür, değiştirmeyi deneyin ...

Son örneği değiştirin, böylece kullanıcının alanları yeniden doldurması gerekmez. Bunu yapmak için, yalnızca girilen form elemanlarının değer özelliklerini doldurun.



$ İsim \u003d issas ($ _ sonrası ["İsim"])? $ _POST ["İsim"]: "";
$ YIL \u003d ISSET ($ _ sonrası ["Yıl"])? $ _POST ["YIL"]: "";

İf (issas ($ _ sonrası "adı"], $ _POST ["YIL"])) (
Eğer ($ _POST ["adı"] \u003d\u003d "") (
Echo "adını belirtin!
" ;
) Eğer ($ _post ["yıl"]< 1900 || $_POST [ "year" ] > 2004 ) {
Eko. "Doğum yılını belirtin! Geçerli değerler aralığı: 1900..2004
"
;
) BAŞKA (
Echo "Merhaba". $ _POST ["İsim"]. "!
" ;
$ YAŞ \u003d 2004 - $ _POST ["YIL"];
Echo "sen. $ Yaş. "Yıllar
" ;
}
Eko "


" ;
}
?>
">
Adınızı giriniz:


Doğum yılınızı girin:





Birkaç anlaşılmaz çizgi 4 ve 5. Her şey çok basittir: 4 satır 4 olarak kaydedilebilir:

eğer (issas ($ _ sonrası "adı"]))
$ İsim \u003d $ _POST ["İsim"];
bAŞKA.
$ İsim \u003d "";

Bir soru ortaya çıkabilir - neden telleri 4-5 atmıyor ve yazmıyor:

Adınızı giriniz: ">

Doğum yılınızı girin: ">

Gerçek şu ki, eğer bu yayınlar tanımlanmamışsa - ve form henüz doldurulmamışsa, - PHP, başlatılmamış değişkenlerin kullanımı hakkında uyarılar yapacak (ve iyi kurulmuş: böyle bir mesaj hızlı bir şekilde yapmanızı sağlar Değişken isimlerde sert tutturulmuş yazım hataları bulun ve ayrıca sitedeki olası "delikleri" uyarır. Elbette, kodu doğrudan formun içine koyabilirsiniz, ancak çok hantal döner.

Çözmek? Ve şimdi aşağıdaki kodda bir hata bulmaya çalışın. Peki, pek bir hata değil, kusurları.

htmlspecialchars ()

Bulamadın mı? Sana söyleyeceğim. Örneğin, "Ad" alanında çift tırnak ve bazı metinlerde, örneğin, VA "SIA. Bir form gönderin ve alınan sayfanın kaynak koduna bir göz atın. Dördüncü sırada bir şey olacak :

Adınızı giriniz:

Bu - iyi bir şey değil. Ve eğer cunning kullanıcısı JavaScript koduna girdiyse?

Bu sorunu çözmek için, HTML temsilcilerindeki servis karakterlerini (örneğin, tırnak işaretleri ") yerini alacak HTMLSpecialchars () işlevini kullanmak gerekir:



$ İsim \u003d issas ($ _ sonrası ["İsim"])? HTMLSpecialchars ($ _POST ["ad"]): "";
$ YIL \u003d ISSET ($ _ sonrası ["Yıl"])? Htmlspecialchars ($ _POST ["YIL"]): "";

İf (issas ($ _ sonrası "adı"], $ _POST ["YIL"])) (
Eğer ($ _POST ["adı"] \u003d\u003d "") (
Echo "adını belirtin!
" ;
) Eğer ($ _post ["yıl"]< 1900 || $_POST [ "year" ] > 2004 ) {
Eko. "Doğum yılını belirtin! Geçerli değerler aralığı: 1900..2004
"
;
) BAŞKA (
Echo "Merhaba". $ İsim. "!
" ;
$ YAŞ \u003d 2004 - $ _POST ["YIL"];
Echo "sen. $ Yaş. "Yıllar
" ;
}
Eko "


" ;
}
?>
">
Adınızı giriniz:


Doğum yılınızı girin:





Tecrübe tekrarlayın ve HTML kodunun şimdi doğru olduğundan emin olun.

Unutmayın - HTMLSpecialchars () işlevi, HTML özelliğinin mevcut olabileceği değişkenin içeriği her zaman kullanılmalıdır.

phpinfo ()

PHPINFO () işlevi, PHP'deki en önemli olanlardan biridir. PHP ayarları, her türlü yapılandırma değişkeninin değerleri hakkında bilgi görüntüler ...

Neden formdaki makalede ondan bahsediyorum? phpinfo () - daha rahat hata ayıklama aracı. phpinfo (), diğer şeylerin yanı sıra, tüm $ _get, $ _POST ve $ _SERVER değişkenlerinin değerlerini görüntüler. Bu nedenle, değişken "kayıp" formları, tespit etmenin en kolay yolu, durumun ne olduğunu - PHPINFO () işlevini kullanın. İşlevin yalnızca değişkenlerin değerlerini göstermesi için (ve bir onlarca sayfa arasında gezinmemeniz gerekmez), aşağıdaki gibi çağrılmalıdır: phpinfo (info_varibles); veya - bu kesinlikle aynı - phpinfo (32);



">
Adınızı giriniz:


phpinfo (32);
?>

Veya, örneğin, bu durum: Ziyaretçinin IP adresini bilmek istiyorsunuz. İlgili değişkenin bir dizi $ _Server dizisinde saklandığını unutmayın, ancak - bu yeterli değil - değişkenin tam olarak adlandırıldığını unutmuşlardır. Yine, phpinfo (32) çağırın; , Plaka içindeki IP adresinizi arıyoruz ve onu buluyoruz - $ _Server string ["Remote_addr"].