20 Kasım 2014 Perşembe

Form Uygulamaları: Çok Form Alanı kullanmak için çok kod yazmaya gerek yok (PHP)

Merhabalar,
Website Formları hakkında aşırı kısa bir bilgi paylaştıktan sonra şimdi de kullanacağınız form elemanları fazla olduğunda işkenceye dönüşen bilgi çekme ve kullanma işlemlerinden bahsedeceğim.



Basit bir form kod bloğu şu şekildedir:

<!--Kod Başlangıç-->
    <form method="post">
        İsim:
        <input type="text" name="isim" />
        <input type="submit" name="submit" value="Yolla" />
    </form>
<!--Kod Bitiş-->

Görüntüsü şu şekilde: 




Bu kodu kullanıp Yolla butonuna bastığınızda textbox (yazı alanı) içerisine yazdığınız bilginin gönderilmesini sağlamış olursunuz. Buna POST deniyor.

Gönderilen formda, eğer <form> tagı içerisinde başka bir adrese doğru "action" parametresi belirtilmemişse aynı sayfaya iletilir. Kod bloğu içerisinde gelen bir POST varmı diye bakılarak gelen bilgi, sayfadan ayrılmadan işleme alınabilir. Mesela ekrana yazdırmak, veritabanına kaydetmek yada mail olarak göndermek gibi.

Standart olarak bir form ile gönderilen bilgiler şu şekilde yakalanır:
<?php echo $_POST["isim"]; ?>
Şimdi bu kodu yukarıdaki kodun altına, </form> tagından sonraya ekleyelim.
<!--Kod Başlangıç-->
    <form method="post">
        İsim:
        <input type="text" name="isim" />
        <input type="submit" name="submit" value="Yolla" />
    </form>

    <?php
    echo $_POST["isim"];
    ?>

<!--Kod Bitiş-->


Bu halde sayfayı yenilediğinizde herhangi bir fark göremezsiniz. Yine ekranda birşey yoktur. Fakat yazı alanı içerisine bir şey yazıp Yolla butonuna bastığınızda yazdığınız ifadeyi ekranda gösterir.

Yolla butonuna basmadan önce:




Yolla butonuna bastıktan sonra:

Peki bu yapı nasıl çalışıyor?
<form> tagları arasında <input>,<textarea>,<select> gibi form elemanlarını kullandığınız zaman POST işlemi bu elemanların içerdiği değerleri sayfaya gönderir.
Farkındaysanız <form> taglarının arasında bir de buton var. Yolla butonu. Bu butonda input elemanıdır ve yazı alanı gibi o da gönderilmektedir.
Özetle form elemanlarının tümünü ayrım yapmadan gönderir. Bunların arasından hangisini kullanmak istiyorsanız onu "name" parametresindeki değer yardımıyla yakalarsınız.
Örnekte bu değer "isim" olarak kullanıldı Bu nedenle $_POST["isim"] şeklinde yakaladık.


$_POST 'un kullanımından anlayacağınız üzere kendileri dizi türündedir ve dizi içerisindeki bir değeri nasıl alıyorsanız bundakini de öyle alıyorsunuz.

dizi[0] -> $_POST[0]
dizi["isim"] -> $_POST["isim"]

Şimdi $_POST 'u olduğu gibi ekrana yazdırmayı deneyelim:
Eğer direk ekrana basmayı deneyecek olursanız (<?php echo $_POST; ?> gibi) ekrana yolladığınız bu öğenin bir dizi olduğunu anlatan Array ifadesini yazacaktır.

Yani şöyle:





Bir diziyi ekrana yazdırırken içeriğini de okumak istiyorsanız kodu şu şekilde değiştirmelisiniz:
(Ben düzgün görünmesi için <pre> tagı arasında yazmayı tercih ediyorum.)
<!--Kod Başlangıç-->
<?php
    echo "<pre>". print_r($_POST,TRUE) ."</pre>";
?>
<!--Kod Bitiş-->
 
Yazı alanının içerisine birşey yazıp Yolla butonuna bastığınızda bu sefer şöyle bir görüntü elde edersiniz:








Şimdi esas konumuza, yani çoklu input elemanı olan bir form üzerinde çalışmaya gelelim.
Örnekteki yazı alanını biraz arttıralım:
 <!--Kod Başlangıç-->
    <form method="post">
        İsim:
        <input type="text" name="isim" /><br />
        Telefon:
        <input type="text" name="telefon" /><br />
        E-posta:
        <input type="text" name="eposta" /><br />
        Şehir:
        <input type="text" name="sehir" /><br />
        Ülke:
        <input type="text" name="ulke" /><br />
        <input type="submit" name="submit" value="Yolla" />
    </form>

    <?php
    echo "<pre>". print_r($_POST,TRUE) ."</pre>";
    ?>
<!--Kod Bitiş-->

Bu haliyle alanları doldurup yolla butonuna bastığınızda şöyle bir görüntü alırsınız:

Çalışmalarımızda bol bol form kullanmak durumunda olduğumuzdan bize en fazla vakit kaybettiren işlemlerden "form elemanlarından gelen verileri tek tek veri tabanına yazma" konusuna değinelim.

Bu tip işlemlerde kendi kullandığım bir yöntemden bahsedeceğim. Veritabanındaki tabloda, sütun isimleri verirken form isimlerini de dikkate alıyorum. Bire bir aynı ismi kullanmıyorum ama tamamlayıcı olarak form ismini kullanıyorum. Yani örnek vermek gerekirse;

Formdaki name -> isim
Tabloda sütun -> isim_45821

Formdaki name -> telefon
Tablodaki sütun -> telefon_45821

Yani neden böyle atraksyonlara ihtiyaç duyuyorum bende bilmiyorum. Direk isim olarak da kalabilir halbuki. Neyse.

Form elemanlarını dizi olarak alabildiğimiz için veritabanına eklerken bu nimetten faydalanıyoruz.
Formun altındaki kodu şu şekilde değiştiriyoruz:
 <!--Kod Başlangıç-->
<?php
    $sql_cumlemiz = "insert into kisiler set ";
    foreach ($_POST as $form_ogesi => $deger) {
        $sql_cumlemiz .= "$form_ogesi" . "_45821='$deger', ";
    }
    echo "SQL Cümlemiz:<br />" . $sql_cumlemiz;
    ?>
<!--Kod Bitiş-->

Kodun çalıştıktan sonraki ekran görüntüsü:

Butonu da dahil etmek saçma oldu tabi. Kodu şöyle değiştirelim:
<!--Kod Başlangıç-->
    <?php
    //echo "<pre>" . print_r($_POST, TRUE) . "</pre>";
    $sql_cumlemiz = "insert into kisiler set ";
    foreach ($_POST as $form_ogesi => $deger) {
        if ($form_ogesi != "submit") {
            $sql_cumlemiz .= "$form_ogesi" . "_45821='$deger', ";
        }
    }
    echo "SQL Cümlemiz:<br />" . $sql_cumlemiz;
    ?>
<!--Kod Bitiş-->
Son olarak sql cümlesi hata vermesin diye sondaki fazla virgül(,)den de kurtulalım:
<!--Kod Başlangıç-->
    <?php
    $sql_cumlemiz = "insert into kisiler set ";
    foreach ($_POST as $form_ogesi => $deger) {
        if ($form_ogesi != "submit") {
            $sql_cumlemiz .= "$form_ogesi" . "_45821='$deger', ";
        }
    }
    $sql_cumlemiz = rtrim($sql_cumlemiz, ", ");
    echo "SQL Cümlemiz:<br />" . $sql_cumlemiz;
    ?>
<!--Kod Bitiş-->
Bunu mysql_query($sql_cumlemiz) şeklinde çalıştırırsanız veritabanınıza kaydı eklemiş olursunuz.

Kolaylığı şu ki form elemanı olarak 100 tane de öğeniz olsa bu döngüyle hepsini insert cümlenize ekleyebilirsiniz.

Bunu veritabanı işlemlerinin yanında bazen mail formlarında da kullanıyorum. Fikir vermesi adına paylaşım umarım faydasını görürsünüz.

Saygılarımla.

Hiç yorum yok: