MultiServis.Net //PHP El Kitabı

<<= Önceki Sayfa | PHP Ana Sayfa | Sonraki Sayfa =>>

PHP ve Veritabani Baglantilari - BOLUM 6 Yazar: Serkan Tarih: 01/03/02

PHP'nin cok kullanilan MySQL veritabani fonksiyonlarina giris

Bir veritabani sunucusu ile calisabilmeniz icin asagidaki adimlari takip etmeniz gereklidir:

- Sunucuya baglanti acin,

- Sunucu icindeki veritabanlari ile calisin,

- Sunucuya baglantiyi kapatin,

  Bu adimlari gerceklestirebilmek icin ayni FTP ve Mail sunucularinda oldugu gibi bir kullanici adi / sifre ikilisine ihtiyaciniz vardir.

  Temel PHP -MySQL Baglanti- Fonksiyonlari

  PHP, bazi -built in- yapisal olarak hazir veritabani baglanti fonksiyonlari ile berber gelir.

  mysql_connect ()

  PHP'nin sundugu mysql_connect () fonksiyonu ile MySQL veritabani sunucusuna baglanti acilir.Uc argumnet alir :

- SUNUCU MAKINE ADRESI
- KULLANICI ADI
- SIFRE

  Baglanti basarili olursa baglanti numarasi, degilse NULL deger doner.

  Ornek Kullanim

  > $link_id = mysql_connect("localhost","phpuser","phppass");

  Donen link baglanti degerine yapilacak tum basvurular ve deginmeler ayni dosyalara acilan baglantilarda oldugu gibidir.Herhangi bir veritabani islemi ancak acilan link referans gosterilerek yapilabilir.

  Fonksiyondaki butun argumnetler opsiyoneldir ve deger girilmaz ise :

- localhost
- Kabuk kullanici adi
- Bos sifre

  degerlerinin oldugu varsayilir.

  mysql_close ()

  Veritabanina acilan baglantilar, programiniz calismasini bitirince otomatik olarak sistemden kaldirilir. Baglantiyi daha once kendi kontrolunuzde olarak kapatmak istiyorsaniz:

  > mysql_close ($link_id);

  komutu ile programin veritabanina olan baglantisini sonlandirabilirsiniz.Bu fonksiyon bir tek baglanti ismini argument olarak alir ve o baglantiyi sona erdirir.

  mysql_list_dbs ()

  Bu fonksiyon daha onceki konularda gordugumuz MYSQL'in SHOW DATABASES komutuna esdegerdir.Tek bir argument alir.Veritabani sunucusuna baglanti referans verilerek (opsiyonel bir argument) kullanilir.Bu fonksiyonun sonucunda veritabani sunucusundaki butun veritabani isimleri bir dizinin elemanlari olacak sekilde bir dizi degiskende saklanir : ($sonuc degiskeni)

  > $sonuc = mysql_list_dbs($link_id);

  mysql_select_db()

  Bu fonksiyon mysql sunucusunda bir veritabani secmek icin kullanilir.Basarili olmasi halinde true yani dogru -built in- sonucu doner.Basarisizlik haline false yani yanlis -built in- degisken degeri degiskene atanir.Bu fonksiyon secilmek istenen veritabani ismi ve sunucu baglanti ismini argumnet olarak alir.(Sunucu baglanti ismi yani $link_id opsiyoneldir.Eger kullanilmaz ise en son acilan veritabani baglantisi ile islem yapilir.)

  Egr herhangi bir veritabani baglantisi yapilmadan bu fonksyion bir "veritabani ismi" ile cagrilirsa, fonksyion sunucuya bir baglanti gerceklestirmek ister.

  Simdi daha onceki konularimizda yarattigimiz "phpuser" isimli hesap ve "phppass" sifresi ile sunucuya baglanmaya calisalim :

  > $link_id = mysql_connect("localhost","phpuser","phppass");
  > if (mysql_select_db("mysql", $link_id) echo "Basarili sekilde baglandi ve mysql isimli veritabani secildi"; else die ("Baglanti hatasi olustu.");

  Bu kod ile mysql sunucusuna baglanip "mysql" isimli veritabani secilmektedir.(Biliyorsunuz bu veritabani icerisinde sunucu icin kullanici izinleri saklanmaktadir.)

  mysql_list_tables ()

  Bu PHP fonksyionu, daha onceden gordugumuz MySQL hazir sunucu fonksiyonu olan SHOW TABLES ile esdegerdir.Veritabani ve baglanti isimleri fonksyiona argument olarak gecirilir :

  $sonuc = mysql_list_tables ("mysql", $link_id);

  Yukaridaki komutun sonucunda "mysql" isimli veritabanindaki butun tablo isimleri bir karekter indeksli dizinin elemanlari olacak sekilde $sonuc degiskeninde depolanmak uzere geriye dondurulur.

  mysql_num_rows ()

  Bu fonksyion ile sorgu sonucunda donen "sonuc setindeki" satir sayisini bulabiliyoruz.Argument olarak satir sayisi hesaplanmak istenen "sonuc seti" girilmelidir :

  $satir_sayisi = mysql_num_rows($sonuc);

  SELECT sorgularinin sonucunda donen sonuc setleri icin cok kullanisili bir fonksiyondur.

  mysql_affected_rows ()

  INSERT,UPDATE, veya DELETE sorgu komutlari kullanildiginda, bu SQL sorgularinin sonucunda etkilenen satir sayisini bulabilmek icin, mysql_num_rows () yerine mysql_affected_rows () hazir fonksiyonu kullanilmalidir.Opsiyonel olarak veritabani baglanti ismini argument olarak alir :

  > $satir_sayisi = mysql_affected_rows ($link_id);

  Daha onceki konulardan da bildiginiz gibi DELETE komutu WHERE ile kullanilmadiginda veritabani tablosundaki butun kayitlari siler.Bu durumda mysql_affected_rows () fonksiyonu 0 (sifir) sonucunu dondurur.

  mysql_fetch_row ()

  Veritabanin'dan SQL komutlari ile secilen kayitlarin programa dondurulmesi mysql_fetch_row () fonksyionu ile saglanir.

  fetch : Turkcedeki git-getir manasina gelir.Daha cok kedi kopek gibi hayvanlarin atilan bir cismi geri getirmesi gibi oyunlarda emir kelimesi olarak kullanilir.

  Bu hazir fonksiyon yanlizca sonuclarin dondurulmesinin istendigi sorgu-sonucu-setini argument olarak alir.Bu komutun sonucunda, sorgunun sonucunda eslesen satirlara ait veriler dizinin elemanlari olacak sekilde doner.Daha fazla dondurecek satir kalmadiginda (sorgunun sonucunda secilen butun satirlar bittiginde) "false" -yanlis- degisken degeri doner.

  $getirilen_satir = mysql_fetch_row($sonuc_seti);

  PHP kendi icinde bir isaretleyeci kullanarak bir onceki mysql_fetch_row () fonksiyonun dondurdugu satiri bilmektedir.Boylece her seferinde bu fonksiyon cagrildiginda bir sonraki satira gecilmektedir.Artik gececek satir kalmadiginda bu fonksiyon false yani yanlis degerini dondurur.

  Tum bu fonksyionlarin kullanildigi ornek bir program yazalim

  > <?php
  > //listele.php
  > $db_host = "localhost";
  > $db_kullaniciadi = "phpuser";
  > $db_kullanicisifresi= "phppass";
  > $db_veritabaniadi = "turkphp_veritabani";

  > $baglantim = mysql_connect ("$db_host", "$db_kullaniciadi","$db_kullanicisifresi");
  > $sonuc=mysql_list_dbs($baglantim);
  > $satirlar = mysql_num_rows($sonuc);

  > while($db_verileri = mysql_fetch_row($sonuc)) {
  > echo $db_verileri[0]. "<BR>";
  > $sonuc2 = mysql_list_tables($db_verileri[0]);
  > $satirlar2 = @mysql_num_rows($sonuc2);
  > while ($tablo_verileri = @mysql_fetch_row($sonuc2)) echo "--" . $tablo_verileri[0] . "<BR>";
  > echo "==> $satirlar2 tane tablo " . $db_verileri[0] . "<P>";
  > }
  > ?>

  Programin calisan haline ulasmak icin :

  http://www.turk-php.com/ornekler/mysql/listele.php

  Program nasil calisiyor?

  Yazilan program MySQL sunucusuna bizim sagladigimiz parametrelerle baglaniyor : "localhost", "phpuser" ve "phppass".Kendi sunucunuz icin ,bu yazi dizisinin basindan beri okuyorsaniz, muhtemelen "phpuser" kullanicisinida diger makalelerde anlatilan sekilde "phppass" sifresi ile yaratmis olmalisiniz.Degilse hemen o makalelere donup bir mysql kullanicisi nasil yaratilir? ogrenmelisiniz...

  mysql_connect () fonksiyonu ile sunucuya baglandiktan sonra, bu fonksyionun sonucunda donen baglanti link degerini diger veritabani fonksiyonlarini kullanirken argument olarak kullanmayacagim.Bunun nedeni bu fonksyionlara -zaten opsiyonel olarak- bir link degeri verilmediginde, bunlarin en son acilan baglantiyi kullanmalaridir...

  $sonuc=mysql_list_dbs($baglantim);

  Ornegin yukaridaki satirda opsiyonel olarak baglanti link degerini ($baglantim degiskeni icerisinde saklaniyor) fonksiyona gecirmisim. Bunu yapmamis olsaydim en son acilan baglanti fonksiyon tarafindan otomatik olarak kullanilacakti...

  $sonuc2 = mysql_list_tables($db_verileri[0]);

  Yukarida da link baglanti degeri verilmeden($baglantim) yazilan bir kod satiri goruyorsunuz.

  Yapilan en buyuk hatalardan birisi yukaridaki programlama pratiginde goruldugu sekilde, baglanti link ismi verilmeden yapilan sorgu sonuclarinin sonucunda donen degerlerin bir baska sonucun uzerine yazilmasidir.Nasil bir dosyayi birden fazla baglanti ile aciyorsaniz, veritabani baglantilarini da birden fazla kez yapabilirsiniz.Boylece bir sorgu setinin sonucunda donen degeri dongu icine koydugunuzda, bir baska sonuc setinin uzerine yazmamis olursunuz.Her baglanti ve sorgu kendi biricik baglanti degerini tasidigi icin ozel olarak baglanti degeri belirtilmedigi surece sorgu sonucunda donen sonuc setleri bozulmadan kalabilecektir.

  mysql_list_dbs () fonksiyonun donderdigi sonuc seti while dongusunun icine alinmaktadir. Bu dongunun icine konulan ikinci bir dongu ile (mysql_list_tables () fonksiyonun sonucunda donen degerler) ilk dongunun sonucunda donen elementlere teker teker bakilmaktadir.Boylece herbir veritabaninin sahip oldugu tablolara bakilmakta ve ekrana yazilmaktadir.

  @ isareti fonksiyonlarin sonucunda donebilecek olasi hata mesajlarinin ekrana yazilmasini engellemek amaciyla konulmustur.

  Serkan Hadi Ceylani
  serkan@turk-php.com

<<= Önceki Sayfa | PHP Ana Sayfa | Sonraki Sayfa =>>