Php’de tüm tablolar için ortak insert function
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.
- İlgili tablonun kolon isimlerini alır.
- Gönderilen verileri dizi olarak kabul eder.
- Kolonlar ile verileri eşleştirir.
- 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
function cube($number)
{
return $number * $number * $number;
}
$numbers = array(1, 2, 3, 4, 5);
$result = array_map("cube", $numbers);
print_r($result);
?>
Çıktı:
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
$columns = array("id", "title");
$values = array(1, "gokalp");
$data = array_combine($columns, $values);
print_r($data);
?>
Çıktı:
Array
(
[id] => 1
[title] => gokalp
)
Dinamik INSERT Fonksiyonu
Aşağıdaki fonksiyon, tablo kolonlarını okuyarak dinamik INSERT sorgusunu oluşturmaktadır.
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
$values = array(
1,
"gokalp"
);
$this->insert_data("haber", $values);
?>
Oluşturulan SQL sorgusu aşağıdaki gibi olacaktır.
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;
| id | title |
|---|
Gönderilecek dizi de şu sırada olmalıdır.
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 isimlerininSHOW COLUMNSile 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.
kanka yine dellenmişssin sanırım 😀
anladigim kadariyla tablo ismini verince ilgili kolonlari bulup her birine istedigin verileri ekliyor yanilmiyorum degil mi gokalp?
evet aynen öyle çalışıyor 🙂
array_map benim aşık oldugum bir fonksiyon gercekten cok seviyorum onu 🙂
Çok Güzel Bir teknik Saol