MultiServis.Net //PHP El Kitabı

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

PHP ve Veritabani Baglantilari - BOLUM 10 Yazar: Serkan Tarih: 01/04/02

Bu bolumde PHP icerisinde kullanilan komutlar yardimiyla MySQL veritabanindan veri elde etme konusuna deginecegiz.Ilk olarak PHP'nin veri elde etme fonksiyonlarina goz gezdirip ardindan SELECT yapisi ile SQL sorgularinin yapisi ve "sizin istediginiz verinin" sakli tutulan veritabanindan cekilmesini ogrenecegiz.Bu konunun icerisine, istenilen sayida sonucun veritabanindan dondurulmesi (sonuclarin belirli bir limit ile ekrana gelmesi), nasil siraya sokulacagi ve gruplanacagi dahildir.Bu yazi aslinda iki bolum olarak tasarlanmis ve ilk bolumde veriyi elde etmek ikinci bolumde ise onu istenilen sekilde gruplandirmak isleminin anlatilmasi dusunulmustur.Bu yazi bu serinin ilk yazisidir...

En son olarak ogrenilen butun bilgiler bu konudaki yazilarimiza basladigimiz gunden beri gelistirdigimiz "ornek_db" veritabani uzerindeki "kullanicilar" ve "erisim" olarak hazirladigimiz iki tane tablo uzerinde gosterilecek uygulamalar yapilacak ve basit bir program hazirlanarak (kullanici yonetimi ile ilgili bir betik,kullanici adina tiklayinca o kullanici ile ilgili detaylar ekrana geliyor...) konu en ince ayrintisina kadar anlatilmaya calisilacaktir.

Simdiye kadar olan bolumde adimlari takip ettiyseniz elinizde "ornek_db" isminde bir veritabani ve icinde iki adet tablo hazir olmalidir.Eger yaziyi okumaya simdi basliyorsaniz size tavsiyem once asagidaki gibi bir SQL sorgusu ile "ornek_db" isminde bir veritabani yaratmanizdir : (Yaziyi ilk gunden beri okuyup ornek veritabani olan "ornek_db" ve bu veritabanin icinde yer alan iki tablo "kullanicilar" ve "erisim" tablolarini onceki makalerde anlatildigi sekilde yaratanlarin asagidaki islemi uygulamasina gerek yoktur.)

Ornek Veritabani ve Tablolarin Yaratilmasi :

DOS veya UNIX kabugundan asagidaki adimlari sirayla uygulayarak ornek veritabani ve tablolarini yaratabilirsiniz : (Eger daha once veritabanini ve icinde yer alan tablolari yaratmis iseniz bu adimlar gerekli degildir.)

1.Asagidaki dosyalari bilgisayarinizin mysql/bin klasorune kopyalayin.

http://www.turk-php.com/ornekler/kullanicilar.sql

http://www.turk-php.com/ornekler/erisim.sql

http://www.turk-php.com/ornekler/veriler.sql

2.Simdi DOS veya UNIX komut satirindan asagidaki komutlari girin : (Tabii ki once mysql/bin dizinine gecmeyi unutmayin.)

mysql -uroot < kullanicilar.sql

mysql -uroot < erisim.sql

mysql -uroot < veriler.sql

Yani sonuc olarak elinizde bir veritabani ve o veritabaninin icinde yer alan iki tablo olmali.Ancak bu sekilde konun ilerleyen kisimlarindaki ornekleri kendinizde uygulama sansi yakalayabilirsiniz.

Sonuclarin PHP kullanilarak Veritabanindan Dondurulmesi :

Simdiye kadar olan konularda mysql_query fonksiyonu ile SELECT sorgusu kullanilarak belirledigimiz verinin,veritabanindan dondurulmesini saglamayi gorduk.Umarim artik bu fonksiyon ile yeterince rahat bir sekilde calisabiliyorsunuzdur.Simdi biraz daha detaya girip bir sonucun nasil donduruldugune bakalim :

mysql_query fonksiyonu yardimiyla bir degiskene atanan sonuc seti ($sonuc) (ayni mysql komut satirindan bir SQL sorgusu girdiginizde ekrana yazilan sonuc setinde oldugu gibi) $sonuc hafizasina aktarilir ve bu sete ait bir isaretliyici (ayni kursor gibi dusunun ve islem yapildikca ornegin satirlar veya alanlar arasinda gezinen ve en son nerde kaldiginizi bilen akilli bir kursor.) dondurulur.Ardindan donen bu sonucu diger fonksiyonlarda kullanmak mumkun olur.Yani sonuc olarak ayni mysql komut satirinda elinizle girdiginizde ekranda gorunen veri bu sefer mysql_query fonksiyonu yardimiyla aliniyor ve bir degiskene atanabiliyor.Daha sonra sizde bu sonuc setini istediginiz gibi kullanabiliyorsunuz.Simdiye kadar olan konularda bu islemler ile ilgili mysql_fetch_row () fonksiyonunun nasil kullanildigini gorduk.Bu fonksiyon iste bu sonuc setinden bir satir veriyi almak icin kullanilir.Son makalemizde yazmis oldugumuz ve "SHOW DATABASES" sorgusunu calistiran ornegimizde oldugu gibi bu sefer biraz daha gelistirielim ve kendi veritabanimizdaki iki tablo icinde biraz once sql dosyasi kullanarak girdigimiz verilere (veriler.sql) PHP arayuzunden ulasmaya calisalim :

<>Q>
<?php
/*
Once veritabani baglantimizi gerceklestiren daha once yazdigimiz kutuphaneyi bu dosyaya ekleyelim.
Biliyorsunuz bir dosyayi digerinin icine gommek icin include ()
fonksiyonu kullaniliyor.
*/

include "./db_genel.inc";

$link_id = db_baglan('ornek_db');

$sonuc = mysql_query("SELECT * FROM kullanicilar", $link_id);

while ($sorgu_verisi = mysql_fetch_row($sonuc)) {
echo "'",$sorgu_verisi[1],"' isimli kullanicinin gercek adi: ",$sorgu_verisi[3],"<P>";
}
?>

Boyle kucuk bir programin sonucu asagidaki gibi ekrana gelecektir :

> 'serkan' isimli kullanicinin gercek adi: Serkan Hadi Ceylani
> 'oktay' isimli kullanicinin gercek adi: Oktay Altunergil
> 'tayfun' isimli kullanicinin gercek adi: Tayfun Ulu
> 'memis' isimli kullanicinin gercek adi: Memis Cetinkaya
> 'hikmet' isimli kullanicinin gercek adi: Hikmet Gumus
> 'ahmet' isimli kullanicinin gercek adi: Ahmet Yazici

Ornek Dosya

http://turk-php.com/ornekler/mysql/sonuc_goster.php

http://turk-php.com/ornekler/mysql/sonuc_goster.phps

Programa, daha onceden yazdigimiz bir veritabani rutinini dosyamiza ekleyerek basladik.Bu kucuk veritabani rutinin ne oldugunu ve nasil calistigini ayrintili olarak onceki yazilarimizda bulabilirsiniz.Ben buraya gene de kaynak kodunu aliyorum : (Bu kutuphanenin icinde sitemizin calisan veritabanin kullanici adi ve sifresi oldugu icin, apache web sunucusunda yapilan bir ayarlama ile ".inc" uzantili dosyalarin web arayuzunden siteye erisen kullanicilara goruntulenmesini yasakladik.)

db_genel.inc

> <?php

> //
> //db_genel.inc
> //

> $dbhost = 'localhost';
> $dbkuladi = 'root';
> $dbkulsifre = '';
> $default_veritabani = 'ornek_db';

> $MYSQL_ERRNO = '';
> $MYSQL_ERROR = '';

> function db_baglan() {

> global $dbhost,$dbkuladi , $dbkulsifre, $default_veritabani;
> global $MYSQL_ERRNO, $MYSQL_ERROR;

> $link_id = mysql_connect($dbhost,$dbkuladi, $dbkulsifre);
> if(!$link_id) {
> $MYSQL_ERRNO = 0;
> $MYSQL_ERROR = "Baglanti hatasi olustu.Sunucu adi : $dbhost.";
> return 0;
> }
> else if(empty($dbismi) && !mysql_select_db($default_veritabani)) {
> $MYSQL_ERRNO = mysql_errno();
> $MYSQL_ERROR = mysql_error();
> return 0;
> }
> else return $link_id;
> }

> function sql_hatasi() {
> global $MYSQL_ERRNO, $MYSQL_ERROR;

> if(empty($MYSQL_ERROR)) {
> $MYSQL_ERRNO = mysql_errno();
> $MYSQL_ERROR = mysql_error();
> }
> return "$MYSQL_ERRNO: $MYSQL_ERROR";
> }

> ?>

Daha sonra programin ikinci satirinda $link_id ile veritabanina bir baglanti acmaya ve bir baglanti linki dondurmeye calistik.

Ucuncu satirda gordugunuz $sonuc degiskeni ile veritabaninda uygulanan bir sorgunun sonucu iste bu degiskene depolanmaya calisilmaktadir.Gordugunuz gibi donen sonuc bir dizi seklindedir ve bu dizinin elemanlarina ornegin $sonuc[0],$sonuc[1] seklinde ulasilabilmektedir.Yani tablonun ilk sutunundaki degerler $sonuc[0] da ikinci sutunundaki degerler $sonuc[1] degiskeninde saklanmaktadir.

mysql_fetch_row () fonksiyonu ile aslinda bizler bu saklanan degerlere erismis oluyoruz.Her seferinde bir dahili kursor hangi satirda islem yapmis isek bunu bilecek sekilde satirlar arasinda gezinmektedir.Boylece ornegin siz sonuclari "while" gibi bir dongude satir satir ekrana getiriken aslinda PHP sonuc setinde her zaman nerede kursorun kaldigini bilmektedir.Bu fonksiyon, veri setindeki tum veriler bittiginde "false" yani "yanlis" bilgisi dondurur.Bu yapisal sonucu alan "while" dongusu boylece donguden cikar.

Simdi birazda uyguladigimiz SQL sorgusuna bakalim :

> SELECT * FROM kullanicilar;

Burada SELECT komutu ile veriler secilmektedir.Secilecek veriler olarak goruldugu uzere tum tablo bastan sona secilmistir.(* notasyonu bir tablodaki butun verileri satir ve sutunlar seklinde secmek icin kullanilir.)

Eger yukaridaki gibi bir programla belirli sutunlardaki veriler ile calisacaksaniz (Ornegin yukaridaki basit programda kullanicilar tablosundaki kullaniciadi ve gercekadi alanlarindaki verilerle calisiyoruz.) bu durumda secme sorgusu biraz daha sofistike yapilarak sonuc setine ayrilan hafiza alani kucultulebilir ve belirli oranda bir hiz ve performans artisi saglanabilir.Bu durumda asagidaki gibi bir sorgu yukaridaki programdaki SELECT sorgusunun yerine kullanilabilir :

> <?php
> include "./db_genel.inc";

> $link_id = db_baglan('ornek_db');

> $sonuc = mysql_query("SELECT kullaniciadi,gercekadi FROM kullanicilar",$link_id);

> while ($sorgu_verisi = mysql_fetch_row($sonuc)) {
> echo "'",$sorgu_verisi[0],"' isimli kullanicinin gercek adi: ",$sorgu_verisi[1],"<P>";
> }
> ?>

Bu durumda hem hafiza hemde sureden tassaruf etmis olduk.

PHP icerisinde verileri,veritabanindan gidip getiren iki degisik fonksiyon daha vardir.Bunlar :

- mysql_fetch_array ()
- mysql_fetch_object ()

  Her iki fonksiyonda temel olarak mysql_fetch_row () fonksiyonu ile ayni sekilde calisir.Tek degisiklik dondurdukleri veri tipinin farkli olmasidir.Son ornegimizi goz onune alirsak bu iki fonksiyon yardimiya veri asagidaki sekilde de dondurulebilirdi :

  > mysql_fetch_array () fonksiyonu bir karekter indeksli dizi dondurur.Bu karekter indeksli dizide her veri,veritabanindaki tabloda sahip oldugu sutunun adiyla indekslenir.Ornegin "kullaniciadi" ve "gercekadi" secilmis bir tablodan donen sonuc setindeki veri mysql_fetch_array () fonksiyonu ile artik karekter indeksli bir diziye donusturulur.

  > > <?php
  > > include "./db_genel.inc";

  > > $link_id = db_baglan('ornek_db');

  > > $sonuc = mysql_query("SELECT kullaniciadi,gercekadi FROM kullanicilar",$link_id);

  > > while ($sorgu_verisi = mysql_fetch_row($sonuc)) {
  > > echo "'",$sorgu_verisi["kullaniciadi"],"' isimli kullanicinin gercek adi: ",$sorgu_verisi["gercekadi"],"<P>";
  > > }
  > > ?>

  > mysql_fetch_object () fonksiyonu ise bir nesne dondurur.Bu nesne sonuc setindeki tablo alanlarini bir nesne ozelligi yaparak kullanir.Eger yukaridaki ornekte sonuclari bu fonksiyon yardimiyla goruntuleseydik asagidaki gibi kullanmamiz gerekirdi :

  > <?php
  > include "./db_genel.inc";

  > $link_id = db_baglan('ornek_db');

  > $sonuc = mysql_query("SELECT kullaniciadi,gercekadi FROM kullanicilar",$link_id);

  > while ($sorgu_verisi = mysql_fetch_row($sonuc)) {
  > echo "'",$sorgu_verisi->kullaniciadi,"' isimli kullanicinin gercek adi: ",$sorgu_verisi->gercekadi,"<P>";
  > }
  > ?>

  Yukarida anlatilan her iki fonksiyonda mysql_fetch_row () fonksiyonundan yavas calisirlar.Bu nedenle ozel bir sebep olmadikca kullanilamlari tavsiye edilmez.

  Simdi biraz daha detaya girelim ve sonuclarin bir baska fonksiyon olan mysql_result () ile nasil ekrana getirilecegine bakalim.Bu fonksiyon dahili bir sonuc belirleyicisini , satir numarasini ve alan ismini argument olarak alir.

  Yukarida yaptigimiz ornek icin bu fonksiyonu kullanmak istersek :

  > <?php
  > include "./db_genel.inc";

  > $link_id = db_baglan('ornek_db');

  > $sonuc = mysql_query("SELECT kullaniciadi,gercekadi FROM kullanicilar",$link_id);

  > for ($i=0;$i < mysql_num_rows($sonuc); $i++) {
  > echo "'",mysql_result($sonuc, $i, "kullaniciadi"), "' isimli kullanicinin gercek adi: ",mysql_result($sonuc, $i, "gercekadi"),"<P>";
  > }
  > ?>

  Bu durumda goreceginiz sonuc asagidaki gibi olacaktir :

  > 'serkan' isimli kullanicinin gercek adi: Serkan Hadi Ceylani
  > 'oktay' isimli kullanicinin gercek adi: Oktay Altunergil
  > 'tayfun' isimli kullanicinin gercek adi: Tayfun Ulu
  > 'memis' isimli kullanicinin gercek adi: Memis Cetinkaya
  > 'hikmet' isimli kullanicinin gercek adi: Hikmet Gumus
  > 'ahmet' isimli kullanicinin gercek adi: Ahmet Yazici

  Eger tersine dogru bir goruntuleme yapmak istiyorsaniz asagidaki sekilde bir kod parcasi ile sonuca gidebilirsiniz :

  > <?php
  > include "./db_genel.inc";

  > $link_id = db_baglan('ornek_db');

  > $sonuc = mysql_query("SELECT kullaniciadi,gercekadi FROM kullanicilar",$link_id);

  > for ($i = mysql_num_rows($sonuc)-1; $i >=0; $i--) {
  > echo "'",mysql_result($sonuc, $i, "kullaniciadi"), "' isimli kullanicinin gercek adi: ",mysql_result($sonuc, $i, "gercekadi"),"<P>";
  > }
  > ?>

  Ornek Dosyalar

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

  http://www.turk-php.com/ornekler/mysql/mysql_result.phps

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

  http://www.turk-php.com/ornekler/mysql/mysql_result_ters.phps

  NOT : Eger gercekten belirli bir sebebiniz yoksa mysql_result () fonksiyonunu kullanmayaniz.Bu fonksiyon diger veri erisim fonksiyonlarindan yavastir.

  Bir baska, veriye ulasma fonksiyonu ise mysql_data_seek () fonksiyonudur.Bu fonksiyon ayni dosya islemlerinde kullanilan fseek () ile ayni mantik ve yapi ile calisir.Fonksiyon argument olarak, sayisal bir deger (sonuc setindeki verinin konumunu gosteren) ve verinin bakildigi sonuc setini alir.Basari halinde "true" yani dogru,basarisizlik halinde ise "false" yani yanlis yapisal sonuc degerini dondurur.(Eger sonuc setindeki dizi sinirini asarsaniz fonksiyon gene "false" dondurur.)

  Yukaridaki ornegi bu fonksiyon ile yapmak istersek :

  > <?php
  > include "./db_genel.inc";

  > $link_id = db_baglan('ornek_db');

  > $sonuc = mysql_query("SELECT kullaniciadi,gercekadi FROM kullanicilar",$link_id);

  > for ($i = mysql_num_rows($sonuc)-1; $i >=0; $i--) {

  > mysql_data_seek($sonuc, $i);
  > $sonuc_verisi = mysql_fetch_array($sonuc);

  > echo "'", $sonuc_verisi["kullaniciadi"], "' isimli kullanicinin gercek adi: ", $sonuc_verisi["gercekadi"], "<P>";
  > }
  > ?>

  Ornek Dosyalar

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

  http://www.turk-php.com/ornekler/mysql/mysql_data_seek.phps

  Evet buraya kadar olan islemlerde MySQL veritabani tablosundan bir verinin nasil cekilebilcegini gorduk.Bu veri setini ekranda bastan asagi veya asagidan yukari olarak siralayabildik.Peki ya alfabetik olarak siralamak isteseydik nasil bir program yazabilirdik?

  Tum bu sorularin cevaplarini bir sonraki bolumde deginecegiz.Simdilik yanlizca bir tablodan veri seti secilirken sure ve hafiza etmenlerini iyi ogrenemenizi ve istenilmeyen alanlarin secilmesi durumunda ileride problem yasayabilceginizi (performans acisindan) soylemekle yetiniyorum.

  Saglicakla Kalin,

  Serkan Hadi Ceylani
  serkan@turk-php.com

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