PHP'de Pratikçe Sorgu Cümlesi Oluşturmak

Dikkat: Bu yazının yazılma tarihinin üzerinden en az 60 gün geçmiş. İçerisindeki bilgiler güncelliğini yitirmiş olabilir. Yorumları ve güncellemeleri göz önünde bulundurarak yazıyı takip ediniz.
Daha önce SQL injection ve MDB2 hakkında birşeyler yazmıştım.

Bu döküman birkaç konuda size yardımcı olacak, pratikleştirecek sorunlar :
  • Çok alan (4-5+) kullanırken sorgu cümlesi oluşturmak zor
  • Gözden kaçırıp alanları kontrol etmek bazen mümkün olmuyor.
  • Yukarıdaki 2 maddeyi yapmak için satırlarca duplicate kod yazmak gerekebiliyor

Kısaca 3-4 adımda kocaman bir sorgu cümlesini oluşturacağız. Genel olarak bu dökümandaki sorun insert ve update türü sorgularda çıkan kargaşayı kolaylaştıracaktır. Zira select sorguları hem çok veri içermiyor hem de özel cümleler olabiliyor.

Bu methodolojide doğal olarak bir otomatizasyon var. Bunun için verinin düzenli olması gerekiyor. Bu noktada genelde bir dizi içinde verilerin tutulduğunu düşünelim.
$data = array(
	'ref_code' => $_GET[ref],
	'phone'    => $_GET[tel],
	'text'     => $_GET[yorum],
	'date'     => date('Y-m-d H:i:s'),
	'ip'       => $_SERVER[REMOTE_ADDR]
);
Verinin anahtarları veritabanındaki alan adları ile aynı olmalı. Zaten bu veri dizisini oluştururken gerekli sql injection kontrolleri yapılıp kolayca kurtulabilinir fakat her değerde bir ton fonksiyon çağırmaya gerek yok. Kısaca :
$data = array_map('mysql_real_escape_string', $data);
kullanımıyla tüm diziye mysql_real_escape_string() uygulayabiliriz.

Sonra zaten cümleyi oluşturmak için genel method olan sprintf ile alanları ve değerleri basacağız. Ancak işin güzelliği burada bu alanlar ve değerler kısımlarını bir sürü döngü ile çözmeyeceğiz.
$sql = sprintf('INSERT INTO comments (%s) VALUES ("%s")',
	implode(", ", array_keys($data)),
	implode('", "', array_values($data))
);

Gördüğünüz gibi array_keys ve array_values ile hızlıca alanlar ve değerleri alıp implode ile aralarına virgül ve tırnak ekleyebiliriz. Burada dikkat edeceğimiz şey implode sadece değerlerin aralarına tırnak ve virgül ekleyecektir. En dışda kalan tırnakları sprintf içinde tanımlayacağız.

Sonuç olarak bu noktada $sql değişkeninde, değerler ve alanlar giydirilmiş, aşağıdaki gibi bir sql cümlesi elde etmiş olacağız.
INSERT INTO comments (ref_code, phone, text, date, ip) VALUES ("google", "1234567", "aısdfyısodaf qewrewrewqr 232fsfdsd", "2009-08-25 16:08:34", "127.0.0.1")
Bu cümleyi de mysql_query($sql) ile çalıştırıp sonucu işlemede bitiyor olay.

Hazırlayan : Mehmet Fatih YILDIZ

Yorumlar

Üye Resmi ferhat ülker
10 Nisan Cumartesi ´10 23:53
ii de $server tanımlaması kalşmdı ki eski sürümlerdeydi yazıyı günceller misiniz????
21 Nisan Çarşamba ´10 00:06
Ferhat, yanlış biliyorsun. $HTTP_SERVER_VARS dizisi kaldırıldı ve $_SERVER dizisi getirildi.

Bakınız: http://php.net/manual/en/reserved.variables.server.php
14 Ekim Perşembe ´10 03:18
Üye Resmi Vehbi PEKPAK
14 Kasım Pazar ´10 20:41
Merhaba!
Kodları denemedim ama;
mesela kayıt girilecek alanın veri türü "int" ve bu türde tırnak kullanmıyoruz... Bu olay nasıl olur?

eğer veri türü varchar olan alana veri girerken projeAdi='".$_GET["projeAdi"]."' olarak, veri türü int olan alana veri girerkende projeKodu=".$_GET["projeKodu"]." olarak giriyorum. bu tırnak farklılığı verdiğiniz kodlarda sorun olmuyormu ?
Üye Resmi İbrahim Ş. Örencik
22 Temmuz Cuma ´11 09:22
"Çok alan (4-5+) kullanırken sorgu cümlesi oluşturmak zor" sorunundan yola çıkıp, kolay sql sorguları oluşturabilen bir sınıf yazmıştım. O da bu konuya alternatif olabilir: http://www.serpito.com/visle-v1-2-0-mysql/
26 Temmuz Salı ´11 03:10
aslinda pratikte yanlis uygulama ama, myslq'a integer verileri string olarak iletsek bile mysql onlari cast edip integera cevirir. ve aslinda bir sayiyi string olarak tanimlayip sonra integer'a cevirirseniz integer degerinde degisme olmaz. Bircok dil bunu sorunsuz cevirir.
Üye Resmi tavşanlı
13 Aralık Pazar ´15 12:29
teşekkürler
Yeni Yorum *
İletişim Bilgileri
*
*
E-Posta adresiniz gösterilmeyecektir.
(unut)
Güvenlik Kodu *

Gönderiliyor