PHP 7.0.26 Released

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

add a note add a note

User Contributed Notes 5 notes

up
-2
martellare at hotmail dot com
14 years ago
I do not think you are right about not being able to specify something for the value attribute, but I can see where you would have thought it would fail:

A fair warning about testing to see if a variable exists...
when it comes to strings, the values '' and '0' are interpreted as false when tested this way...

<?php
if ($string) { ... }  //false for $string == '' || $string == '0'
?>

The best practice for testing to see if you received a variable from the form (which in the case of a checkbox, only happens when it is checked) is to test using this...

<?php
if ( isSet($string) ) { ... } //true if and only if the variable is set
?>

The function tests to see if the variable has been set, regardless of its contents.

By the way, if anyone's curious, when you do make a checkbox without specifying the value attribute, the value sent from the form for that checkbox becomes 'on'.  (That's for HTML in general, not PHP-specific).
up
-4
jetboy
11 years ago
While previous notes stating that square brackets in the name attribute are valid in HTML 4 are correct, according to this:

http://www.w3.org/TR/xhtml1/#C_8

the type of the name attribute has been changed in XHTML 1.0, meaning that square brackets in XHTML's name attribute are not valid.

Regardless, at the time of writing, the W3C's validator doesn't pick this up on a XHTML document.
up
-8
martellare at hotmail dot com
14 years ago
A JavaScript Note: Using element indexes to reference form elements can cause problems when you want to add new elements to your form; it can shift the indexes of the elements that are already there.

For example, You've got an array of checkboxes that exist at the beginning of a form:
===================

<FORM>
    <INPUT type="checkbox" name="fruits[]" value="apple">apple
    <INPUT type="checkbox" name="fruits[]" value="orange">orange
    <INPUT type="checkbox" name="fruits[]" value="banana">banana
</FORM>

===================
... These elements could be referenced in JavaScript like so:
===================

<SCRIPT language="JavaScript" type="text/javascript">
<!--
    var index = 0; //could be 1 or 2 as well
    alert(document.forms[0].elements[index]);
//-->
</SCRIPT>

===================
However, if you added a new textbox before these elements, the checkboxes indexes become 1 - 3 instead of 0 - 2;  That can mess up what ever code you create depending on those indexes.

Instead, try referencing your html arrays in JavaScript this way.  I know it works in Netscape 4 & IE 6, I hope it to some extent is universal...
===================

<SCRIPT language="JavaScript" type="text/javascript">
<!--
    var message = "";
    for (var i = 0; i < document.forms[0].elements['fruits[]'].length; i++)
    {
        message += "events[" + i + "]: " + document.forms[0].elements['fruits[]'][i].value + "\n";
    }
    alert(message);
//-->
</SCRIPT>

===================
up
-14
davis at risingtiger dot net
13 years ago
I thought this might be useful to fellow PHP heads like myself out there.

I recently came across a need to transfer full fledged mutli-dimensional arrays from PHP to JAVASCRIPT.

So here it is and hopefuly good things come from it.

<?php
function phparray_jscript($array, $jsarray)
{
    function
loop_through($array,$dimen,$localarray)
    {
        foreach(
$array as $key => $value)
        {
            if(
is_array($value))
            {
                echo (
$localarray.$dimen."[\"$key\"] = new Array();\n");
               
loop_through($value,($dimen."[\"".$key."\"]"),$localarray);
            }
            else
            {
                echo (
$localarray.$dimen."[\"$key\"] = \"$value\";\n");
            }
        }
    }

    echo
"<script language=\"Javascript1.1\">\n";
    echo
"var $jsarray = new Array();\n";
   
loop_through($array,"",$jsarray);
    echo
"</script>";
}
?>
up
-14
Jay
3 years ago
If you have a really large form, be sure to check your max_input_vars setting.  Your array[] will get truncated if it exceeds this.  http://www.php.net/manual/en/info.configuration.php#ini.max-input-vars
To Top