İçeriğe geç
← Blog

Php’de tüm tablolar için ortak insert function

15 Ocak 2010, 02:25 PHP 4 dk 4.7k 5

Veritabanı ile çalışan uygulamalarda en sık yaptığımız işlemlerden biri INSERT sorguları oluşturmaktır.

Ancak her tablo için ayrı ayrı INSERT sorgusu yazmak zamanla kod tekrarına neden olur. Bunun yerine tablo adını ve eklenecek verileri parametre olarak alan genel bir fonksiyon yazmak çok daha kullanışlıdır.

Bu yazıda, tablo kolonlarını otomatik olarak okuyup gönderilen verilerle eşleştirerek dinamik bir INSERT sorgusu oluşturan basit bir yöntem hazırlayacağız.

Temel Mantık

Fonksiyonumuz şu adımları takip ediyor.

  1. İlgili tablonun kolon isimlerini alır.
  2. Gönderilen verileri dizi olarak kabul eder.
  3. Kolonlar ile verileri eşleştirir.
  4. INSERT sorgusunu dinamik olarak oluşturur.

Bu sayede her tablo için tekrar tekrar INSERT sorgusu yazmak zorunda kalmayız.

Kullanılan PHP Fonksiyonları

Bu örnekte iki önemli PHP fonksiyonundan yararlanıyoruz.

array_map()

array_map() fonksiyonu, dizideki her elemanı belirttiğimiz başka bir fonksiyona göndererek dönen sonucu yeni bir dizi hâline getirir.

Örneğin;

PHP
<?php

function cube($number)
{
    return $number * $number * $number;
}

$numbers = array(1, 2, 3, 4, 5);

$result = array_map("cube", $numbers);

print_r($result);

?>

Çıktı:

PHP
Array
(
    [0] => 1
    [1] => 8
    [2] => 27
    [3] => 64
    [4] => 125
)

Biz bu fonksiyonu SQL sorgusunu oluştururken mysql_escape_string() fonksiyonunu tüm elemanlara tek tek uygulamak için kullanacağız.


array_combine()

array_combine() fonksiyonu iki farklı diziyi tek bir ilişkisel dizi hâline getirir.

Örneğin;

PHP
<?php

$columns = array("id", "title");

$values = array(1, "gokalp");

$data = array_combine($columns, $values);

print_r($data);

?>

Çıktı:

PHP
Array
(
    [id] => 1
    [title] => gokalp
)

Dinamik INSERT Fonksiyonu

Aşağıdaki fonksiyon, tablo kolonlarını okuyarak dinamik INSERT sorgusunu oluşturmaktadır.

PHP
public function insert_data($table, $values = array())
{
    try {

        $query = $this->query("SHOW COLUMNS FROM " . $table);

        $columns = array();

        while ($column = mysql_fetch_row($query)) {

            $columns[] = $column[0];

        }

        $data = array_combine($columns, $values);

        $sql = sprintf(
            'INSERT INTO %s (%s) VALUES ("%s")',
            $table,
            implode(', ', array_map('mysql_escape_string', array_keys($data))),
            implode('", "', array_map('mysql_escape_string', $data))
        );

        echo $sql;

    } catch (Exception $e) {

        die($e->getMessage());

    }
}

Kullanımı

Fonksiyonu kullanmak oldukça kolaydır.

PHP
<?php

$values = array(
    1,
    "gokalp"
);

$this->insert_data("haber", $values);

?>

Oluşturulan SQL sorgusu aşağıdaki gibi olacaktır.

PHP
INSERT INTO haber (id, title)
VALUES ("1", "gokalp")

Dikkat Edilmesi Gereken Nokta

Bu yöntemde gönderilen veri dizisinin sırası, veritabanındaki kolon sırası ile aynı olmalıdır.

Örneğin tablo aşağıdaki şekildeyse;

idtitle

Gönderilecek dizi de şu sırada olmalıdır.

PHP
array(
    1,
    "gokalp"
);

Aksi durumda kolonlar ile veriler yanlış eşleşecektir.

Sonuç

Bu yöntem sayesinde her tablo için ayrı INSERT sorguları yazmak yerine tek bir yardımcı fonksiyon kullanabilirsiniz. Özellikle küçük ve orta ölçekli projelerde kod tekrarını azaltmak açısından oldukça pratik bir çözümdür.

İlerleyen aşamalarda bu yapı daha da geliştirilebilir. Örneğin tek seferde birden fazla tabloya veri eklemek, toplu INSERT işlemleri yapmak veya farklı SQL sorgularını otomatik oluşturacak yardımcı metodlar hazırlamak mümkündür.


📝 Arşiv Notu

Bu yazı ilk olarak 2010 yılında hazırlanmıştır. Örnekler PHP 5 ve mysql_* fonksiyonları kullanılarak hazırlanmıştır. Günümüzde bu fonksiyonlar kaldırılmıştır ve yerlerine PDO veya MySQLi ile birlikte Prepared Statements kullanılması önerilmektedir. Ayrıca bu örnekte kolon isimlerinin SHOW COLUMNS ile okunması eğitim amacıyla tercih edilmiştir; modern uygulamalarda kolon isimleri genellikle uygulama katmanında tanımlanır ve SQL Injection riskine karşı tablo adları doğrudan kullanıcı girdisinden alınmaz.

5 yorum

  1. anladigim kadariyla tablo ismini verince ilgili kolonlari bulup her birine istedigin verileri ekliyor yanilmiyorum degil mi gokalp?