PHP ve HTML etkileşir: PHP, HTML üretir; HTML, PHP'ye bilgi aktarır. Bu SSS'yi okumaya başlamadan önce değişkenlerin dış kaynaklardan nasıl elde edildiğini öğrenmiş olmanız önemlidir. Bu konu ile igili kılavuz sayfası ayrıca örnekler de içerir. register_globals konusunu da incelerseniz iyi olur.
Hangi kodlamanın hangi aşamada kullanılacağı önemlidir. İçeriğini kodlamaksızın aktarmak istediğiniz string türünde $data diye bir değişkeniniz olduğunu varsayalım. Aşamalar şunlardır:
HTML yorumlaması. Rasgele bir dizgeyi belirtirken dizgeyi çift tırnak içine almanız ve değerin tamamına htmlspecialchars() uygulamanız gerekir.
URL: Bir URL çeşitli parçalardan oluşur. Verinizin tek bir öğe olarak yorumlanmasını isterseniz, veriyi urlencode() ile kodlamanız gerekir.
Örnek 1 - Gizli bir HTML form elemanı
<?php
echo "<input type='hidden' value='" . htmlspecialchars($data) . "' />\n";
?>
Bilginize: $data için urlencode() kullanmak yanlıştır, çünkü veriyi urlencode() türünde kodlamak tarayıcının sorumluluğundadır. Bunun yöntemden (yani GET veya POST) bağımsız oluşuna dikkat ediniz. Bunu sadece GET isteklerinde farkedersiniz, çünkü POST istekleri normalde gizlidir.
Örnek 2 - Kullanıcı tarafından düzenlenen veri
<?php
echo "<textarea name='mydata'>\n";
echo htmlspecialchars($data)."\n";
echo "</textarea>";
?>
Bilginize: Umulduğu gibi veri tarayıcıda gösterilir, çünkü HTML öncelemeli simgeleri tarayıcının yorumlaması gerekir. Verinin GET veya POST üzerinden gönderiminde veri aktarılırken tarayıcı tarafından kodlanır (urlencode) ve bu kodlama PHP tarafından çözülür (urldecode). Böylece, sizin kodlamayla ilgili birşeyler yapmanız gerekmez, herşey özdevinimli olarak gerçekleşir.
Örnek 3 - Bir URL içinde
<?php
echo "<a href='" . htmlspecialchars("/nextpage.php?stage=23&data=" .
urlencode($data)) . "'>\n";
?>
Bilginize: Aslında bir HTML GET isteğini taklit ettiğinizden veriye urlencode() uygulamanız gerekmez.
Bilginize: URL, bir HTML özniteliğinin değeri olduğundan URL'nin tümüne htmlspecialchars() kodlaması uygulamanız gerekir. Bu durumda, tarayıcı değere htmlspecialchars() çözümlemesi uyguladıktan sonra URL olarak aktarır. PHP, URL'yi doğru olarak algılayacaktır, çünkü veriye urlencode() uygulamışsınızdır. URL'deki & yerine & yazıldığını farkedeceksiniz. Çoğu tarayıcı bunu sizin yerinize yaptığından bunu yapmayı unutsanız da o kadar önemli değildir. Ancak, URL'niz devingen olmasa bile, URL'ye htmlspecialchars() uygulamanız gerekir.
Bir formu göndermek için bir gönderi düğmesi yerine aşağıdaki gibi bir resim kullanmak da mümkündür:
<input type="image" src="dugme.gif" name="foo" />
foo.x ve foo.y PHP'de geçersiz değişken isimleri olduklarından sihirli bir şekilde bunlar foo_x ve foo_y değişkenlerine dönüşürler. Yani, nokta imi yerine altçizgi imi yerleştirilir. Dolayısıyla, bu değişkenlere dış kaynaklı değişkenler bölümünde açıkladığı gibi erişebilirsiniz. Örnek: $_GET['foo_x'].
Bilginize:
İstekle aktarılan değişken isimlerindeki boşluklar da alçizgi imleri ile değiştirilir.
<form> sonucunu bir dizi olarak göndermek için PHP betğinizde <input>, <select> veya <textarea> elemanlarını şöyle isimlendirmeniz gerekir:
<input name="Dizim[]" /> <input name="Dizim[]" /> <input name="Dizim[]" /> <input name="Dizim[]" />
<input name="Dizim[]" /> <input name="Dizim[]" /> <input name="ÖbürDizim[]" /> <input name="ÖbürDizim[]" />
<input name="DiğerDizim[]" /> <input name="DiğerDizim[]" /> <input name="DiğerDizim[eposta]" /> <input name="DiğerDizim[telefon]" />
Bilginize:
HTML'de dizi anahtarı belirtmek isteğe bağlıdır. Anahtar belirtmezseniz, dizi elemanları formda yer alış sırasına göre numaralanır. Örneğimizde anahtarlar 0, 1, 2 ve 3 olacaktır.
Ayrıca bakınız: Dizi İşlevleri ve Dış Kaynaklı Değişkenler .
Bir HTML'deki çok seçenekli bir select oluşumu kullanıcıların bir listeden çok sayıda öğe seçebilmesini mümkün kılar. Seçilen öğeler form için atanmış bir eylemciye aktarılırlar. Burada sorun, hepsinin aynı değişken ismiyle aktarılmasıdır. Örnek:
<select name="var" multiple="yes">
var=seçim1 var=seçim2 var=seçim3
<select name="var[]" multiple="yes">
JavaScript kullanıyorsanız eleman ismindeki [] ayraçları, elemanlara isimleriyle başvururken sorun çıkarabilir. Ya eleman anahtarı yerine sayısal biçimi kullanın ya da değişken isimlerini tek tırnak içine alıp bunları dizi elemanlarını indislemekte kullanın. Örnek:
variable = documents.forms[0].elements['var[]'];
Javascript'in (normal olarak) istemci taraflı, PHP'nin sunucu taraflı olması ve HTTP'nin de 'durumsuz' bir protokol olması nedeniyle iki dil değişkenleri doğrudan paylaşamazlar.
Bununla birlikte, ikisi arasında değişken alışverişi mümkündür. Bunu sağlamanın tek yolu Javascript kodunu PHP ile üretmek ve tarayıcıya tazeletip özel değişkenleri gerisin geriye PHP'ye aktarmaktır. Aşağıdaki örnekte bunun nasıl yapıldığı ayrıntılı olarak gösterilmiştir. Normalde sadece istemci tarafında mümkün olan ekran yüksekliği ve genişliğinin elde edilmesi PHP kodunda gerçeklenmektedir.
Örnek 4 - PHP ile Javascript üretimi
<?php
if (isset($_GET['width']) AND isset($_GET['height'])) {
// Boyut değişkenlerini çıktılayalım
echo "Ekran genişliği: ". $_GET['width'] ."<br />\n";
echo "Ekran yüksekliği: ". $_GET['height'] ."<br />\n";
} else {
// Boyut değişkenlerini aktaralım
// (özgün sorgu dizgesini koruyalım
// -- post değişkenleri farklı şekilde elde edilecek)
echo "<script language='javascript'>\n";
echo " location.href=\"${_SERVER['SCRIPT_NAME']}?${_SERVER['QUERY_STRING']}"
. "&width=\" + screen.width + \"&height=\" + screen.height;\n";
echo "</script>\n";
exit();
}
?>