Mysqli veri tabanı bağlantı yöntemi nesne tabanlı (OOP) olarak oluşturulmuştur. Bu yöntem eski mysql_connect ‘in geliştirilmiş yöntemidir. Php mysql_connect yöntemi desteklemeyi bıraktı bunun yerine mysqli ve PDO yöntemini geliştirdi. Her iki veri tabanı bağlantı yöntemi birbirinden iyi olsa da, en çok tercik edilen PDO dur. Fakat mysqli yönteminde PDO yönteminde olan prepare metodu kullanılmaktadır. Bu nedenle mysli’nin pdo’dan kalır bir yanı yoktur. Bu yazımda sizlere bir mysqli veri tabanı bağlantısı nasıl oluşturulur ve veri tabanına select,insert,delete nasıl yapılır ayrıntılı örneklerle vereceğim. Bu örneklere başlamadan önce bazı fonksiyon ve mysqli metotları hakkında ön bilgi vereceğim.
$db->query("select") ; Bu yöntem prepare yöntemine göre daha hızlı fakat gerekli güvenlik önlemleri alınmazsa sql injection’a uğraya bilirsiniz. Bu nedenle dışarıdan gelen verileri real_escape_string fonksiyonundan geçirelim. Benim şahsi tercihim olarak. Sayfa açılırken ki veri tabanından gelecek sorguların hızlı olması için query kullanıyorum. Kullanıcıdan gelen verilerde ise prepare yöntemini kullanmaktayım.
$db->real_escape_string($disveri) : real_escape_string bu fonksiyon kullanıcıdan gelen verilerde güvenliği sağlamak (sql injection’ı önlemek) için kullanılır. Bu fonksiyonla sql için tehdit oluşturan yatay tek tırnak veya özel karakterlerin başına \ işareti konur.
$db->fetch_array() ; Veri tabanından verileri çekerken hangi yöntemle alacağımızı belirtmek için kullanılır. Parantez içerisine aşağıda belirtilen metotlar yazılır. Eğer değer verilmezse MYSQL_ASSOC kabul edilir.
$db->fetch_array(MYSQL_ASSOC) : Veri tabanından gelen verilerde sütun başlıklarını indeks olarak alır.
$db->fetch_array(MYSQL_NUM ) : Veri tabanından gelen verilerde sütun sırasını indeks olarak alır.
$db->fetch_array(MYSQL_BOTH) : Veri tabanından gelen verilerde sütun sırasını ve sütun başlıklarını indeks olarak alır.
Aşağıdaki fonksiyonlarda yukarıda belirtilen fonksiyonlarla aynı görevi yapmaktadır.
///prepare method
$db->prepare("select") : Bu metot sql sorgularını çalıştırmadan önce sql’de bir hata olup olmadığı kontrolünü yapar. Geriye ise boolen (true/false) bir değer gönderir. Ayı zamanda bind_param fonksiyonu ile sql injection’ı önler. Bunun için ön hazırlık veya ekstra bir şeye gerek yoktur. Daha güvenli ve daha profesyoneldir.
$db->affected_rows() : INSERT-DELETE-REPLACE veya UPDATE gibi sql sorguları sonucunda kaç satırı etkilediğini öğrenmek için kullanılır. Select yönteminde işe yaramaz.
$sorgu->num_rows() : Veri tabanından select ile veri çekme sqli yazdığımızda, dönen verinin kaç satır olduğunu öğrenmek için kullanılır. Sorguların başarılı olup olmadığı denetimini yapmamızda yardımcı olur.
$sorgu->bind_param(parametre,Değiken1,Değişken2) : Prepare yöntemi ile yazılan sql’lerde dışarıdan gelecek verileri geldiği yerlere ? konur. Daha sonra bu soru işaretinin yerine gelecek verileri ise bind_param yöntemi ile belirtiriz. Parametre yazan yere değişken sırasına göre integer ise i, string ise s yazarız. Tabi tırnaklar içinde yazmayı unutmuyoruz. Parametreden sonra ise sırasına göre değişkenleri virgüllerle yazarız.
bind_param->parametreleri
i => İlgili değişken tipi tamsayı int
d => İlgili değişken tipi noktalı
s => İlgili değişken tipi String
b => İlgili değişken tipi Binary
$sorgu->execute() : Prepare yöntemi ile girilen sql başarılıysa, sql çalıştırmak için bu fonksiyonun kullanırız.
$sorgu->get_result() : Sql sorgularından dönen sonuçları dizi şeklinde bir değişkene almamızı sağlar.
$sorgur->fetch_assoc() : Prepare ile gönderilen sorgu ile veri tabanından satır başlıklarına göre veri çekmeye yarar.
$db-close(): Son olarak veri tabanı bağlantımızı kapatıyoruz.
Öncelikle veri tabanı bağlantımız kuracağız. Veri tabanı bağlantımız kurarken hata ayıklama yöntemine göre iki tane yapacağız. Eğer hataları normal hata numaraları ve nedenleri ile almak istiyorsak aşağıdaki bağlantıyı kuracağız.
1 2 3 4 5 | $dbBag=new mysqli("localhost","root","","deneme"); //$dbBag=new mysqli(sunucu","dbkullanıcı","şifre","dbadı"); if(function_exists('mysqli_stmt_get_result')===false) die("Mysqlnd sürücü desteği yok");//veri tabanı get_result desteği olup olmadığını kontrol ettik. if($dbBag->connect_errno) die("hata :".$dbBag->connect_error);//Bağlantı hatası varsa durdurduk. $dbBag->set_charset("utf8");//Karakter setini belirledik. |
Bu yötemle bağlanmayıp tyr catch gibi hata ayıklama yapmak istiyorsak aşağıdaki bağlantıyı kurmalıyız.
1 2 3 4 5 6 7 8 | mysqli_report(MYSQLI_REPORT_STRICT); try{ $veriBag=new mysqli("localhost","root","","deneme"); if(function_exists('mysqli_stmt_get_result')===false) die("Mysqlnd sürücü desteği yok"); $dbBag->set_charset("utf8");//Karakter setini belirledik. }catch(Exception $hata){ echo "HATA ".$hata->getMessage(); } |
Veri tabanından birden fazla veri çekmek istiyorsak aşağıdaki yöntemi kullanmalıyız. Veri tabanı bağlantısını yukarıda kurduğumuz için tekrar etmiyorum.
1 2 3 4 5 6 7 8 9 | /*Çoklu query veri çekme*/ $veriSor=$dbBag->query("select * from verisozler"); if($veriSor==false) echo "hata:".$dbBag->error; if($veriSor->num_rows>0){ while($gelenVeri=$veriSor->fetch_assoc()){ echo $gelenVeri["sozIcerik"]."<br />"; } }else{ echo "Böyle bir veri yok";} $dbBag->close(); |
Veri tabanından sadece bir satırlık veri çekeceksek aşağıdaki yöntemi kullanmalıyız.
1 2 3 4 5 6 7 8 | $veriSor=$dbBag->query("select * from verisozler where id=5"); if($veriSor==false) echo "hata:".$dbBag->error; if($veriSor->num_rows>0){ $gelenVeri=$veriSor->fetch_assoc(); echo $gelenVeri["sozIcerik"]."<br />"; }else{ echo "Böyle bir veri yok";} $dbBag->close(); |
Query ile veri tabanına veri girişi örneği.
1 2 3 4 5 6 7 | $veriSor=$dbBag->query('insert into verisozler(id,sozSahibi,sozIcerik) values (null,"çağlar bostancı","Hayat duygulu insanlar için trajedi, düşünen insanlar içinse komedi")'); if($veriSor==false) echo "hata:".$dbBag->error; if($dbBag->affected_rows>0){ echo "Girilen veri sayısı".$dbBag->affected_rows; echo "<br /> Girilen veri id".$dbBag->insert_id; }else{ echo "Veril girilemedi";} $dbBag->close(); |
Query metodu ile veri tabanı işlemlerinde kullanıcılardan gelen verileri aşağıdaki yöntemle temizleyeceğiz.
1 2 | /*NO SQL INJECTION*/ $_POST=array_merge(array($db2,"real_escape_string"),$_POST); |
Prepare metodu ile veri tabanından çoklu satır veri çekmek için aşağıdaki yöntemi kullanacağız.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /*prepare method select çoklu veri*/ $veriGir=$dbBag->prepare("select * from verisozler"); if($veriGir==false) die($dbBag->error);//sql kontrol $veriGir->execute();//sql çalıştır $gelVeri=$veriGir->get_result();//gelen verileri al. if($gelVeri->num_rows>0){//gelen veri sayisi 0'dan büyükse while($gelenVeri=$gelVeri->fetch_array()){//gelen verileri döngüyle yazdır. printf("%s %s <br />",$gelenVeri["sozIcerik"],$gelenVeri["sozSahibi"]); } }else{ echo "veriYok";} $veriGir->close();//Gelen verileri sildik $dbBag->close();//Veri tabanını kapattık |
Prepare metot ile tekli satır veri alacaksak aşağıdaki yöntemi kullanacağız.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /*prepare method select tekli veri*/ $veriId=2; $veriGir=$dbBag->prepare("select * from verisozler where id=?"); $veriGir->bind_param("i",$veriId);//Gelen verilerin değerlerini ve türünü belirleme if($veriGir==false) die($dbBag->error);//sql kontrol $veriGir->execute();//sql çalıştır $gelVeri=$veriGir->get_result();//gelen veriyi al. if($gelVeri->num_rows>0){//gelen veri sayisi 0'dan büyükse $gelenVeri=$gelVeri->fetch_array();//gelen veriyi yazdır. printf("%s %s <br />",$gelenVeri["sozIcerik"],$gelenVeri["sozSahibi"]); }else{ echo "veriYok";} $veriGir->close();//Gelen verileri sildik $dbBag->close();//Veri tabanını kapattık |
Prepare bind_result ile veri tabanından gelen verilerde sütun başlıklarını belirtiğimiz değişkenlere atayarak kullanacağız. Aşağıda.
1 2 3 4 5 6 7 8 9 10 11 | /*prepare bind_result kullanımı*/ $veriGir=$dbBag->prepare("SELECT sozSahibi,sozIcerik FROM verisozler ORDER BY id LIMIT 5"); if($veriGir==false) die("Hata oluşutu.");//sql kontrol $veriGir->execute();//sql çalıştır $veriGir->bind_result($soz,$sozSoyleyen);//gelen verileri al. while($veriGir->fetch()){//gelen verileri döngüyle yazdır. printf("%s %s <br />",$soz,$sozSoyleyen); } $veriGir->close();//Gelen verileri sildik $dbBag->close();//Veri tabanını kapattık |
Prepare ile veri tabanına veri girişi. Aşağıda.
1 2 3 4 5 6 7 8 9 10 11 12 | /*prepare method veri girişi*/ $sahibi="Nazım Hikmet"; $soz="Yaşamak bir ağaç gibi tek ve hür, ve bir orman gibi kardeşçesine…"; $veriGir=$dbBag->prepare("insert into verisozler(sozIcerik,sozSahibi) values(?,?)"); if($veriGir==false) die($dbBag->error); $veriGir->bind_param("ss",$soz,$sahibi); $veriGir->execute(); if($veriGir->affected_rows>0){ print $dbBag->insert_id." Veri eklendi"; }else{ exit($dbBag->errno);} $veriGir->close();//Gelen verileri sildik $dbBag->close();//Veri tabanını kapattık |
Prepare metodu ile veri silme.
1 2 3 4 5 6 7 8 9 10 11 | /*prepare method veri sil*/ $id=14; $veriSil=$dbBag->prepare("delete from verisozler where id=?"); if($veriSil==false) die($dbBag->error); $veriSil->bind_param("i",$id); $veriSil->execute(); if($veriSil->affected_rows>0){ print $veriSil->affected_rows." Veri silindi"; }else{ exit($dbBag->errno);} $veriSil->close();//Gelen verileri sildik $dbBag->close();//Veri tabanını kapattık |