PHP ve HTML

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.

Bir değeri bir form veya URL üzerinden aktarırken nasıl kodlamak gerekir?

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 &amp; 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 <input type="image"> etiketi kullanmayı deniyorum, ama $foo.x ve $foo.y değişkenlerini bulamıyorum. $_GET['foo.x'] mevcut değil mi? Bunlar neredeler?

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" />
Kullanıcı bu resmin herhangi bir yerine tıkladığında sunucuya formla birlikte ek olarak foo.x ve foo.y diye iki değişken aktarılır.

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.

Bir HTML <form>'unda dizileri nasıl oluşturabilirim?

<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[]" />
Değişken isimlerinden sonra gelen köşeli ayraçları farketmişsinizdir. Bunlar değişkeni bir dizi haline getirirler. Farklı elemanlara aynı dizi isimlerini atamak suretiyle elemanları farklı diziler içinde gruplayabilirsiniz:
<input name="Dizim[]" />
<input name="Dizim[]" />
<input name="ÖbürDizim[]" />
<input name="ÖbürDizim[]" />
Bu örnekte PHP betiğine gönderilmek üzere iki dizi üretilmektedir: Dizim ve ÖbürDizim. Dizilerinize ayrıca özel anahtarlar atamanız da mümkündür:
<input name="DiğerDizim[]" />
<input name="DiğerDizim[]" />
<input name="DiğerDizim[eposta]" />
<input name="DiğerDizim[telefon]" />
Burada, DiğerDizim dizisi 0, 1, eposta ve telefon anahtarlarını içerecektir.

Bilginize:

HTML'de dizi anahtarlarını 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 .

Çok HTML etiketli bir select etiketinden tüm sonuçları nasıl alırım?

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">
Seçilen her seçenek eylemciye şöyle aktarılacaktır:
var=seçim1
var=seçim2
var=seçim3
      
Her seçenek bir önceki $var değişkeninin içeriğinin üzerine yazacaktır. Çözüm, değişken ismi olarak dizi kullanmaktır:
<select name="var[]" multiple="yes">
Bu satır PHP'ye $var değişkenini bir dizi olarak ele almasını ve her seçeneğin içeriği için bir dizi elemanı eklemesini söyler. İlk seçim $var[0], ikincisi $var[1], vs. olur. Kaç seçeneğin seçilmiş olduğunu count() işlevi ile öğrenebilir veya gerekirse sort() işleviyle seçenek dizisini sıraya sokabilirsiniz.

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 = document.forms[0].elements['var[]'];
      

Bir değişkeni Javascript'ten PHP'ye nasıl aktarabilirim?

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();
}
?>