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
|