You are on page 1of 17

MySQL ve PHP

PHP'nin yaygınlaşmasında en büyük yardımcılarından biri de MySQL oldu.


Windows ve Unix versiyonları ücretsiz olarak dağıtılan MySQL'in PHP'yle
beraber gelişmesi sayesinde, hem PHP hem de MySQL karlı çıktılar. Gelişmiş
veritabanı sistemlerinde olan ilişkisel veritabanı mantığıyla geliştirilen MySQL,
çoklu bağlantı desteği ve performansıyla, İnternet’te uzunca süreden beri
adını duyurmayı başarmıştı. Kısa bir süre önce GPL lisansıyla kaynak kodları
açıklanan MySQL'in PHP'yle stratejik işbirliği sayesinde PHP 4 ve MySQL
birlikte diğer veritabanı ve dil ikililerine karşı performans üstünlüğü sağlıyor.
PHP'nin, MySQL ve Apache'yle birlikte derlenerek kullanıldığı sistemlerde
veritabanı ve Web sunucusu arasında kurulan kalıcı bağlantılar (persistent
connection) sayesinde Web sunucusu ve veritabanı tek bir yazılımmış gibi
çalışabiliyorlar. Bu sayede çalışan iki ayrı yazılıma göre % 400'lere varan
performans üstünlüğü de sağlanmış oluyor. Kısa bir süre önce Internet’te
dünyanın en çok kullandığı site olan Yahoo! da bazı bölümlerinde MySQL
kullanmaya başladı.

PHP Kullanarak MySQL'e Bağlanmak


PHP yaygın şekilde kullanılan her türlü veritabanının kullanıcısına,
veritabanına özel PHP komutlarıyla kullanım imkanı sağlar. PHP kullanım
kılavuzu incelendiğinde, veritabanları arasındaki pek çok PHP komutunun
önce MySQL daha sonra Oracle için olduğu görülecektir. MySQL komutlarının
birçoğu özel durumlarda gerekli olurken, 10 kadar komut her türlü MySQL
işleminde yaygın şekilde kullanılırlar. Bir PHP dosyasında MySQL veritabanı
kullanılmak istendiğinde, mutlaka veritabanı sunucusuna bağlanılmalı ve bir
veritabanı seçilmelidir. Genellikle bir PHP dosyasından bir veritabanına
bağlantı yapılacağı için veritabanı sunucusuna bağlandıktan sonra, bir
veritabanı ismi verilerek, o veritabanı sunucusu ve o veritabanı üzerinde tüm
diğer MySQL işlemleri yapılabilir. Eğer istenirse birden çok veritabanı
sunucusundaki birden çok veritabanına da bağlantı yapılabilir. Aşağıdaki
komutlarda mysql_connect() komutuyla veritabanı sunucusuna IP, kullanıcı
adı ve şifre verilerek bağlantı sağlanır. Daha sonraki mysql_select_db()
komutuyla da dosyadaki tüm MySQL işlemlerinde kullanılacak olan veritabanı
tercihi belirtilmiş olur.PHP dosyasında tüm veritabanı işlemlerinden önce
veritabanı sunucusuyla bağlantı kurulmalıdır.

mysql_connect("localhost","root","") ;
mysql_select_db("baslangicdb") ;

MySQL'e SQL Sorgusu Göndermek


PHP'de MySQL'e sorgu göndermek için mysql_query() komutu kullanılır.
Parantez arasındaki alanda çift tırnak işareti kullanarak, SQL dilinde MySQL'in
anlayacağı veritabanı sorgulama komutları girilmelidir. MySQL'e gönderilen
sorguyla dönen kayıtlar tümüyle bir PHP değişkenine aktarılır.
$isimler = mysql query("select * from ogrenciler");

Bu örnekte ogrenciler adındaki tablodan tüm kayıtların çekilmesi SQL ile


istenmiştir. Veritabanından dönen tüm kayıt listesi, isimler adındaki bir PHP
değişkeni tarafından sembolize edilir. MySQL'in sorgulanmasından geriye
dönen sonuç tablosundaki veriler de mysql_result() komutuyla alınır.

$ad = mysql_result($isimler,$i,"ad");
$soyad = mysql_result($isimler,$i,"soyad");

Veritabanından dönen tablodaki ilk satırın satır numarası 0'dır. Her sonucun
bir satır olduğu bu tabloda tablo alanının ismiyle satır numarası verilerek
sonuçlar çağırılabilir. Öğrenci numarası, adı ve soyadının bulunduğu
öğrenciler isimli tabloya yapılacak olan genel sorguda, geriye dönen sonuç
tablosunun her satırında bir öğrenci numarası, ad ve soyad bulunacaktır.
Sonuç tablosundaki satır sayısını öğrenmek için mysql_numrows() komutu
kullanılır.

$sayi = mysql_numrows($isimler);

MySQL'den Gelen Kayıtları PHP de Ekrana Yazmak


MySQL'e gönderilen sorguyla dönen kayıtların tümü, PHP dosyasının çalışma
süreci sona erene kadar bir PHP değişkeninde sembolik olarak tutulurlar. Az
önceki örnekte MySQL'e gönderilen SQL sorgusunun cevabı isimler adında bir
değişkende depolanmıştı. Tüm sonuçların bir arada tutulduğu bu
değişkenden, sonuçlarını satır satır alınarak tarayıcıya gönderilmesi gereken
durumlarda genelde while döngüsü kullanılır. Bu döngüde sorguya karşılık
dönen kayıt sayısı kere isimler değişkeninden satir çekilir. Yani 15 adet
öğrenci ad, soyad bilgileri sorguya döndüyse, toplam dönen kayıt
sayısı 15'tir ve 15 kere isimler değişkeninden satır çekilerek ekrana basılacak
demektir.
Veritabanına daha önce anlatıldığı gibi bağlanıldıktan sonra mysql_query()
komutuyla sorgu gönderilir. Bu sorguya karşılık gelen satır sayısı
mysql_num_rows() ya da mysql_numrows() komutlarıyla öğrenilir, vvhile
döngüsüyle i değişkenine bağlı olarak toplam kayıt sayısı kadar
mysql_result() kullanılarak satırlar çekilir ve ekrana echo ile basılır. Bu
yöntemde kullanılması gereken PHP komutları aşağıdaki gibidir.

$isimler = mysql_query("select * from öğrenciler");


$sayi = mysql_num_rows($isimler);
$i = 0;'
while ($i < $sayi) :
$ad = mysql_result($isimler,$i,"ad");
$soyad = mysql_result($isimler,$i,"soyad") ;
echo ("Ad : $ad Soyad : $soyad<br>\n") ;
$i++;
endwhile;

Bu PHP komutları ekrana Ad : Mehmet Soyad ; Sakin şeklinde tüm listeyi


dökecektir. PHP değişkenleri kullanılarak MySQL'e gönderilecek SQL
sorgusunda değişiklik yapabilmek de mümkündür. Listelenecek olan bilgi
türünde değişiklik yapılmak istendiğinde, kullanılacak olan where kalıbına
PHP değişkenlerini yazabilmek mümkündür. Örneğin adı Mahmut olan
kullanıcıların listelenmesi için SQL'de

select * from ogrenciler where ad = 'Mahmut'


cümleciği kullanılmalıdır. Bu sorgu aynen

$isimler = mysql query("select * from ogrenciler where ad = 'Mahmut '");

şeklinde PHP'ye gönderilebilir. Eğer listelenecek kalıp, örneğin bir form


aracılığıyla Web sitesi ziyaretçisinden alınacaksa Yukarıdaki kalıpta Mahmut
kelimesi yerine $ad adında bir PHP değişkeni de yazılabilir.

$isimler = mysql_query("select * from ogrenciler where ad = '$ad' ");

Bu sayede kullanıcıdan gelen talep doğrultusunda ekrana dökülecek olan


bilginin türü de değiştirilmiş olur. PHP'yle MySQL'den bilgi çekme yöntemleri
ve örnek uygulamalar, MySQL'de farklı Yöntemler başlığı altında daha detaylı
anlatılacak.

MySQL'de Hata Kontrolü


Kullanıcının MySQL'de oluşabilecek hataları PHP içinde fark edebilmesi için,
PHP'de özel komutlar vardır. Bu komutlar sayesinde veritabanı
sorgulamasında oluşan sonuçlar hata numarasıyla birlikte fark edilebilir. Hata
gösterge komutları kullanılmadan PHP, MySQL'e dair hiçbir hata mesajı
vermeden işleme devam eder.

if (mysql_error()) { echo ("MySQL hatası oluştu. Hata: ");


echo mysql_error() ;
}

Yukarıdaki PHP satırları mysql_error() komutunu kullanarak herhangi bir


MySQL hatası oluştuğunda ekrana MySQL hatasının yazılmasını ve PHP
yazılımcısının uyarılmasını sağlar.
PHP Kullanarak MySQL'e Bilgi Girişi
PHP kullanılarak kullanıcı ya da ziyaretçilerden alınan bilgilerin MySQL'e
depolanması aslında sorgu cümleciği olan SQL’ de insert'ün kullanılmasından
başka bir şey değildir. PHP'ye dışarıdan alınan tüm bilgiler değişken dizileri
halinde MySQL'e yerleştirilebilir. Daha önceki bölümde anlatılan ad, soyad,
eposta ve cinsiyet bilgilerinin depolanacağı bir tabloya veri girmek için
kullanılacak bir PHP dosyasında veri girişi aslında mysql_query() komutuyla
gönderilen SQL cümleciğiyle yapılır.ı Eğer veri girişinde kullanılacak olan
kullanicilar tablosu kullandığınız veritabanında hazır değilse aşağıdaki
satırların Pma'nın SQL giriş alanına yazılmasıyla tablo oluşturulacaktır.

CREATE TABLE kullanicilar


(
kullaniciid INT not null AUTO_INCREMENT,
ad VARCHAR (16) not null ,
soyad VARCHAR (16) not null ,
eposta VARCHAR (50) not null , cinsiyet ENUM ('e','k') not null , PRIMARY
KEY (kullaniciid)
)

Aşağıdaki mysql_query() komutu SQL cümleciğim MySQL'e gönderir.


Gönderilen SQL cümleciği de MySQL'deki kullanicilar adındaki tablonun
kullaniciid, ad, soyad, eposta ve cinsiyet alanlarına bilgi gönderir.
Veritabanındaki kullanicilar tablosunda ilk alan olan kulaniciid alanı aslında
otomatik olarak oluşturulan bir alan olduğu için, SQL'de ona karşılık gelecek
alana null kelimesinin yazılması yeterli olacaktır.

mysql_query("insert into kullanicilar (kullaniciid, ad, soyad, eposta, cinsiyet)


values (null,'Suat', 'Koyuncu','suat@baslangic.net', 'e')");

Ad, soyad, e-posta ve cinsiyet bilgileri için sırasıyla Suat,


Koyuncu,suat@baslangic.net, e bilgileri gönderilir. Dikkat edilmesi gereken
önemli bir nokta bu bilgilerin SQL içerisine tek tırnakla ayrılarak konulmuş
olmalarıdır. MySQL, kendisine gönderilen bu yeni bilgileri veritabanına
yerleştirirken, tablo özelliklerinde auto_increment olarak belirtilen alanlar için
otomatik olarak bir sıra numarası üretir. Bu sıra numarası, geliştirilen PHP
yazılımının türüne bağlı olarak tabloda yer alan bilgilerin birbirlerinden ayırt
edilmesinde gerekli olabilir. MySQL tarafından bu tabloda gerçekleştirilen
insert işleminde üretilen sıra numarası

$kullaniciid = mysql_insert_id();

komutuyla alınabilir. mysql_insert_id() komutu en son insert işleminin


değerin! vereceğinden mysql_query()'den hemen sonra yazılması
gerekmektedir.

Veri Girişi Örnek Uygulaması: Basit Form


Bu bölüme kadar anlatılanlarla tüm okuyucular ilk form denemelerini ve daha
fazlasını yapabilecek kadar bilgiye sahip oldular. Anlatılanların hepsin! bir
örnek üzerinde pekiştirerek ilk Web formu hazırlamak için daha önceki
örneklerde değinilen kullanicilar adındaki ad, soyad, e-posta ve cinsiyet
bilgilerinin depolandığı tabloyu kullanılacak. Önceki bölümlerde kullanıcıdan
adım ve soyadını alarak ekrana yazmak için kullanılan PHP dosyası

<?
if ($gonderim)
{ echo ("Merhaba... Adınız : $ad, soyadınız da :$soyad");
}
else
{ ?>
<form action="form.php" method="post">
Ad :<input type="text" name="ad" size="6" maxlength="16">
Soyad :<input type="text" name="soyad" size="6" maxlength="16">
<input type="submit" name="gonderim" value="Gönder"> </form>
<? } ?>

şeklindeydi. Bu formdan sadece ad ve soyad bilgileri alınıyordu. E-posta ve


cinsiyet bilgilerim eklemek ve üzerinde görsel bir iki değişiklik yapmak için
aşağıdaki hale dönüştürülür. Aşağıdaki kodda halen MySQL'le ilgili en ufak bir
komut yok, sadece formdan alınan bilginin doğruluğunu denemek için ekrana
echo komutuyla PHP değişkenlerinin değerleri gönderiliyor.

<?
if ($gonderim)
{
echo ("Merhaba... Adınız : $ad, soyadınız da :$soyad Cinsiyet : $cinsiyet, E-
posta : $eposta") ;
} else
{
?>
<form action="form.php" method="post">
Ad :<input type="text" name="ad" size="16" maxlength="16"><br>
Soyad :<input type="text" name="soyad"size="16" maxlength="16"><br>
E-posta :<input type="text" name="eposta" size="50" maxlength="50">
<br> Cinsiyet :e<input type="radio" name="cinsiyet" value="e">
k<input type="radio" name="cinsiyet" value="k">
<br><br>
<input type="submit" name="gonderim" value="Gönder"> </form>
<?
}
?>

Yukarıdaki basit bilgi formundaki bilgiyi MySQL'e kayıt etmek için tek
yapılması gereken mysql_query() komutu içeren bir satır eklemek olacaktır.
Bunun için echo komutunun altındaki satıra MySQL veritabanı sunucusuna
bağlantı için gereken komutlar ve sorgu cümleciklerinin eklenmesi yeterlidir.

mysql_connect("localhost","root","şifre") ;
mysql_select_db("baslangicdb");
mysql_query("insert into kullanicilar, (kullaniciid, ad, soyad, eposta,
cinsiyet) values (null,'$ad', '$soyad', '$eposta', '$cinsiyet')") ;

Yukarındaki komutlarla önce MySQL veritabanı yazılımına root kullanıcı adı ve


şifre şifresiyle bağlanılır. Daha sonra tüm sorguların gönderileceği
baslangicdb veritabanı mysql_select_dbs komutuyla seçilir. Veri girmek için
gerekli olan insert sorgusu da mysql_query() komutuyla gönderildiğinde, veri
girişi tamamlanmış olur. Olası kodlama hatalarını fark edebilmek için, en alta
aşağıdaki hata denetleme satırının yazılması faydalı olabilir.

if (mysql_error())
{
echo ("MySQL hatası oluştu. Hata: ") ;
echo mysql_error() ;
}

Bazı durumlarda veritabanına bağlantı kullanıcı adı veya şifre yanlışlığı


üzerinden gerçekleşmez. Bu durumda bağlantı gerçekleşmediği mesajını
kullanıcı istenilen bir mesajla değiştirmek mümkündür.

@mysql_connect("localhost","root","şifre") or die("MySQL'e ulaşamadım...");

@mysql_select_db("baslangicdb") or die("Veritabanına ulaşamadım...");

Yapılması gereken şey mysql_connect ve mysql_select_db komutlarının


basma hata oluşsa bile hata mesajı göstermemeleri için @ işareti konulur.
Bağlantının gerçekleşmediği durumda PHP'nin alternatif bir yol izleyerek
çalıştıracağı komut or kalıbıyla belirtilir. Hata mesajı vererek kullanıcının
uyarılması ve PHP dosyasının çalıştırılmasına son vermek için daha önceden
de anlatılan die() komutu kullanılır. Form, bu değişiklik ve hata kontrol
kalıplarının yerleştirilmesinden sonra

<?
if ($gonderim) {
@mysql_connect("localhost","root","şifre") or die("MySQL'e ulaşamadım...");
@mysql_select_db("baslangicdb") or die("Veritabanına ulaşamadım...");
echo ("Merhaba... Adınız : $ad, soyadınız da : $soyad Cinsiyet : $cinsiyet, E-
posta : $eposta") ;
mysql_query("insert into kullanicilar (kullaniciid, ad, soyad, eposta, cinsiyet)
values (null,'$ad', '$soyad', '$eposta', '$cinsiyet')") ;
if (mysql_error()) { echo ("MySQL hatası oluştu. Hata: ");
echo mysql_error();
}
}
else
{
?>
<form action="form.php" method="post">
Ad:<input type="text" name="ad" size="16" maxlength="16"><br>
Soyad:<input type="text" name="soyad" size="16" maxlength="16"><br>
E-posta:<input type="text" name="eposta" size="16"maxlength="16">
<br>
Cinsiyet :e<input type="radio" name="cinsiyet" value="e">
k<input type="radio" name="cinsiyet" value="k">
<br><br>
<input type="submit" name="gonderim" value="Gönder">
</form>
<?
}
?>

şekline dönüşür. Çoğunlukla bir Web sitesinde veritabanı bağlantılarının tüm


PHP dosyalarında kullanılacağı varsayılır. PHP dosya sayısı artınca, MySQL
veritabanının kullanıcı adı şifresinin değiştirildiği durumda tüm PHP
dosyalarına teker teker girilerek kullanıcı adı ve şifre bilgilerinin değiştirilmesi
gerekebilir. Bu yüzden PHP'de veritabanı bağlantıları ve diğer tüm dosyalarda
ortak olabilecek komutların bir dosyada toplanması kullanışlı olabilir.
Yukarıdaki formda yer alan

@mysql_connect("localhost","root","sifre") or die("MySQL'e ulaşamadım...");


@mysql_select_db("baslangicdb") or die("Veritabanına ulaşamadım...");

satırları kitaportakkoy.php dosyası içine yazılarak değişiklik durumunda tek


dosyadan tüm şifre ve diğer bilgileri değiştirebilmek için forma

include("kitaportakkoy.php");
satırıyla dahil edilir, include komutu giderek kalabalıklaşan Web yazılımı
projelerinde PHP kodlarının kolay ve anlamlı parçalar halinde
yönetilebilmesinde oldukça önemli rol oynar. Basit forma biraz daha etkileşim
katmak için formu dolduran kullanıcıya, MySQL tarafından veri girişi
esnasında ona atanan otomatik sıra numarasını da yazabilmek mümkündür.
Bunun için koda

$kullaniciid = mysql_insert_id();
echo ("<br>Sizin veritabanındaki sıra numaranız :$kullaniciid") ;

satırları eklenerek en son

<?
if ($gonderim)
{
include ("kitaportakkoy.php") ;
echo ("Merhaba... Adınız : $ad, soyadınız da :$soyad Cinsiyet : $cinsiyet, E-
posta : $eposta");
mysql_query("insert into kullanicilar (kullaniciid, ad, soyad, eposta, cinsiyet)
values (null,'$ad', '$soyad', '$eposta', '$cinsiyet')") ;
if (mysql_error())
{
echo ("MySQL hatası oluştu. Hata: ");
echo mysql_error() ;
}
$kullaniciid = mysql_insert_id() ;
echo ("<br>Sizin veritabanındaki sıra numaranız : $kullaniciid") ;
}
else
{
?>
<form action="form.php" method="post">
Ad:<input type="text" name="ad" size="16" maxlength="16"><br>
Soyad:<input type="text" name="soyad" size="16" maxlength="16"><br>
E-posta :<input type="text" name="eposta" size="16" maxlength="16">
<br>
Cinsiyet :e<input type="radio" name="cinsiyet" value="e">
k<input type="radio" name="cinsiyet" value="k">
<br><br>
<input type="submit" name="gonderim" value="Gönder"> </form>
<?
}
?>
haline getirilir. Veritabanı bağlantılarında bir sorun olması durumunda hata
mesajının değiştirilmesi için die komutu kullanılabilir. Daha profesyonel bir
görünüm için hata mesajını include() komutu yardımıyla bir dosyaya da
yönlendirebilmek mümkün. MySQL'e bağlantı komutları PHP'de aslında birer
değişkenle de eşleştirilebilir. Bağlantı kurulup kurulmadığını anlamak için, bu
değişkenlerin aldıkları değerlerin denetlenmesiyle hata mesajı ya da farklı
tepkiler üretebilmek mümkündür.

<?
$sunucu = @mysql_connect("localhost","root","sifre");
$veritabani = @mysql_select_db("baslangicdb");
if (($sunucu < 1) or ($veritabani < 1))
{
include ("sunucuhatasikoy.php") ;
exit;
}
?>

Yukarıdaki PHP kodu kitaportakkoy.php dosyası içerisine yerleştirildiğinde


hata oluşması durumunda PHP'yi sunucuhatasikoy.php dosyasını çağırmaya
yönlendirecektir. Bu dosya istenilen biçimde bir hata mesajını barındıracak
şekilde kullanıma bağlı olarak düzenlenebilir.

MySQL'de Farklı Yöntemler


MySQL ve PHP doğru kullanıldıklarında etkili Web sitelerinin en güçlü silahları
olabilirler. Şu ana kadar verilen bilgiler ışığında bile MySQL ile yeni tanışan
kullanıcıların zihinlerinde neler yapılabileceğinin pırıltıları belirebilir. En çok
arama motorlarında görülen ve üstelenen bilgilerin belli bir sayıdan
sonrasının gösterilmediği uygulamaları, basit SQL komutlarıyla ve MySQL'le
yapabilmek mümkündür. Örneğin içinde yüzlerce satır kayıt yer alan bir
tabloyu 20'şerli gruplar halinde alfabetik sıralı olarak farklı sayfalara bölerek
göstermek için SQL'de limit kalıbının kullanılması yeterli olacaktır.
İçinde 30 ya da daha fazla sayıda satır bulunan bir kullanıcılar tablosu için
daha önce hazırlanan form.php dosyası kullanılarak rasgele bilgi girişi yapılır.
Bu bilgileri 10'arlık gruplar halinde listeleyerek alfabetik sırada gösterecek
PHP kodunu hazırlamak için, SQL cümleciğinin

select * from kullanicilar order by ad limit 0, 10

şeklinde olması gerekmektedir. Bu SQL sorgusuyla MySQL'den çekilecek olan


bilgiler ad alanına göre alfabetik olarak sıralanacaktır. Bu sorguyu kullanarak
ekrana kullanicilar tablosundan kayıtları dökecek olan PHP dosyası şu şekilde
olacaktır:
<?
include("kitaportakkoy.php");
$isimler = mysql_query("select * from kullanicilar order by ad limit 0, 10");
if (mysql_error())
{
echo ("MySQL hatası oluştu. Hata: ");
echo mysql_error();
}
$sayi = mysql_numrows($isimler);
$i=0;
while ( $i < $sayi) :
$ad = mysql_result($isimler,$i,"ad");
$soyad = mysql_result($isimler,$i,"soyad");
echo ("Ad : $ad Soyad : $soyad<br>\n") ;
$i++;
endwhile;
?>

MySQL'de SQL sorgusundan dönen bilgileri satir satır çekebilmek için


mysql_result()'dan farklı iki komut daha vardır. Bu komutlar
mysql_fetch_array() ve mysql_fetch_row()'dur. Bu iki komut da
mysql_result()'a göre daha performanslı ve hızlıdır. Ancak kullanımı çok az
farkla zordur. Bu komutların kullanımında SQL'den dönen bilginin satır
numarası ve alınacak olan bilginin tablodaki hangi alana ait olduğunun
belirtilmesine gerek yoktur. Dönen bilgi tümüyle bir satırdır ve bilgi bir dizi
(array) değişkeninde tutulur. Yani Yukarıdaki sorguda bir satırda dönen
kullaniciid, ad, soyad, e-posta ve cinsiyet bilgilerinin tümü bir dizi
değişkenine depolanır. Bu dizi değişkenden her bir alana ait kullaniciid, ad,
soyad, e-posta ve cinsiyet bilgilerini çağırmak için alan adının sıra numarası
kullanılır. Bu sıra numarası sıfırdan başlamak durumundadır. Yani ad alanı
için

$tumsatir = mysql_fetch_row($isimler) ;

satırıyla bilgi çekildikten sonra


$tumsatir[1] ;

değişkeni kullanılır. Benzer şekilde kullaniciid, soyad, eposta ve cinsiyet


bilgileri için de

$tumsatir[0]; // kullaniciid $tumsatir[2]; // soyad $tumsatir[3]; // eposta


$tumsatir[4]; // cinsiyet

değişkenleri kullanılacaktır. Yukarıdaki PHP kodlarında //ve yanındaki bilgiler


açıklayıcı olmaları için yazılmıştır, PHP'nin çalışma-sına herhangi bir etkileri
yoktur. Dolayısıyla mysql_fetch_row() komutuyla tüm bir satırı çekmek,
mysql_result() komutuyla her bir satırda her bir alan için teker teker bilgi
çekmekten daha hızlı ve kolaydır.

<?
include("kitaportakkoy.php") ;
$isimler = mysql_query("select * from kullanicilar order by ad limit O, 10");
if (mysql_error())
{
echo ("MySQL hatası oluştu. Hata: ");
echo mysql_error();
}
while($tumsatir = mysql_fetch_row($isimler)) :
echo ("Ad : $tumsatir[l] Soyad :
$tumsatir[2]<br>\n") ;
endwhile;
?>

Az önce bilgi dökmek için kullanılan PHP komutları yerine yukarıdaki komutlar
hem daha az yer kaplar hem de daha hızlı çalışırlar. Normalde PHP
dosyasının geliştirme süreci bittikten sonra içerdiği

if (mysql_error())
{
echo ("MySQL hatası oluştu. Hata: ");
echo mysql_error();
}

satırının da kaldırılması PHP'nin çalışmasını hızlandıracaktır. Aksi takdirde, bu


PHP kodu, her çalıştırılmasında MySQL hatasının oluşup oluşmadığını
denetleyen if mantıksal denetleyicisini de yorumlayacaktır. Yukarıdaki kod
listele2.php adı verilerek kaydedilebilir. Bu dosyada PHP, MySQL'e kullanicilar
tablosunda alfabetik sıralamada 0'dan 10'a kadar olan kayıtları istediğim
belirtmektedir. Yapılması amaçlanan PHP dosyasının tüm kayıtları 10'arlı
gruplar halinde çekerek ekrana basmasıdır. Bunun için PHP dosyasındaki SQL
cümleciğinde limit kalıbının içine bir değişken yerleştirmek gerekmektedir.

$isimler = mysql_query("select * from kullanicilar order by ad limit $k, 10");

SQL cümleciğine yerleştirilen $k değişkeni, MySQL'e k. sıradaki kayıttan


itibaren 10 tane kaydı çekmesini söylemektedir. Eğer $k değişkeni 20 olursa
20-30. kayıtlar, 25 olursa 25-35. kayıtlar listelenecektir. Sıra $k değişkeninin
kullanıcılardan bir şekilde alınmasına geldi. Kullanıcılar, ekranda sadece 10
satırım gördükleri isim listesinde bir sonraki 10 satıra göz atabilmek için bir
bağa tıklayacaklar ve bu sayede PHP bir sonraki 10 satırlık bilgiyi
listeleyecektir. Bunun için PHP'nin adres satırından değişken alabilme
özelliğinden faydalanılacak.

<?
include ("kitaportakkoy.php") ;
$isimler = mysql_query("select * from kullanicilar order by ad limit $k, 10");
if (mysql_error())
{
echo ("MySQL hatası oluştu. Hata: ");
echo mysql_error() ;
}
while($tumsatir = mysql_fetch_row($isimler)) :
echo ("Ad : $tumsatir[l] Soyad : $tumsatir[2]<br>\n") ;
endwhile;
$k = $k + 10;
echo ("<a href=\"listele2.php?k=$k\">Sonraki 10 kayıt</a>") ;
?>

Yukarıdaki kod listele2.php adıyla kaydedilerek çalıştırıldığında bir hata


mesajı verecektir. Bu hata mesajı gözden kaçabilecek önemli bir noktadan
kaynaklanmaktadır. Verilen hata mesajı şudur:

Warning: Supplied argument is not a valid MySQL result resource in


listele2.php on line 9

Bu, MySQL gönderilen SQL sorgusunu anlamadığından ve çalıştıramadığından


dolayı ekrana yazılmaktadır. Bu PHP dosyasıyla yapılması istenen, bir $k
değişken değeriyle gelen sayının belirttiği başlangıç noktasından itibaren 10
tane kaydı veritabanından çekmektir. Çalıştırılan PHP dosyasında henüz $k
değişkenine herhangi bir değer atanmadığı için, aslında MySQL'e gönderilen
sorgu tam olarak

select * from kullanicilar order by ad limit , 10

şeklindedir. SQL'de limit kalıbında iki tane sayı değerinin virgülle ayrılarak
verilmesi gerektiğinden, bu SQL sorgusu geçersizdir. PHP dosyası, eğer $k
değişkenine bir değer atanarak çalıştırılırsa SQL sorgusu doğru olacaktır.
Bunu denemek için tarayıcıya

http://localhost/listele2.php?k=0

yazılması yeterli olacaktır. Bu satir listele2.php dosyasında $k değişkeninin


değerinin 0 olarak işlem görmesin! sağlar. Dolayısıyla sorgu

select * from kullanicilar order by ad limit 0, 10

şekline dönüşeceğinden geçerlidir. PHP'de $k değişkenine herhangi bir değer


atanmamışsa $k'ya 0 değerinin atanması için

if (!$k) $k = 0;

satiri eklenebilir. Bu satır $k değişkeninin değer almadığı durumda, yani (!$k)


olduğa durumda, $k değişkeninin değerini 0 yapar. Bu satırın, PHP'de
MySQL'e sorgu göndermeden önceki herhangi bir satıra konmasıyla hata
çözülmüş olur. Eğer $k değişkeninin aldığı herhangi bir değer varsa, PHP if
döngüsüne girmez.

<?
include ("kitaportakkoy.php");
if (!$k) ($k = 0;}
$isimler = mysql_query("select * from kullanicilar order by ad limit $k, 10");
if (mysql error())
{
echo ("MySQL hatası oluştu. Hata; ");
echo mysql_error() ;
}
while($tumsatir = mysql_fetch row($isimler)) :
echo ("Ad : $tumsatir[1] Soyad :$tumsatir[2]<br>\n") ;
endwhile;
$k = $k + 10;
echo ("<a href=\"listele2.php?k=$k\">Sonraki 10 kayıt</a>");
?>

PHP'nin kullanıcıdan gelen istek doğrultusunda bir sonraki 10 kaydı


gösterebilmesi için,

echo ("<a href=\"listele2.php?k=$k\">Sonraki 10 kayıt</a>") ;

satırıyla kullanıcıdan Sonraki 10 kayıt adında bir bağa tıklaması


istenmektedir. Bu bağa tıklandığında listele2 .php dosyasına $k değişkeninin
değerinin 10 artırılmış hali gönderilir. Bu sayede tekrar çağırılan PHP
dosyasında, artık $k değeri 10 olacaktır ve 10 — 20 arasındaki kayıtlar
ekrana dökecektir.

Performans için MySOL'e Kalıcı Bağlantı


MySQL, Web yazılımcılarının ihtiyaç duydukları birçok yeteneği bünyesinde
barındırmaktadır. Web uygulamalarında veritabanına gönderilen sorgular,
genelde veritabanı tarafından çabuk cevaplanabilen az sayıda kayıt döndüren
sorgulardır. web yazılım dillerinde veritabanına sorgu gönderilirken veritabanı
uygulamasına bağlanılır ve yazılımın çalışması bitince veritabanı bağlantısı
otomatik olarak kapatılır. Her gün yüz binlerce sayfa oluşturan Web
sunucularında, eğer Web sunucusu sayfaları veritabanı üzerinden sunuyorsa,
bu bağlanma ve sonunda bağlantının kapatılması işlemleri büyük performans
kayıplarına yol açar. Veritabanıyla yazılım arasında kurulan bağlantının
yazılım bittikten sonra kapatılmadan kalması ve daha sonra çağırılan
uygulamalar tarafından kullanılabilmesi, büyük performans artışı sağlar.
MySQL'le PHP, persistent connection (kalıcı bağlantı) adı verilen yöntemle
PHP uygulamalarının MySQL bağlantılarım hep açık tutarak kullanabilecekleri
bir modelde kullanılabilir. MySQL'in PHP'yle bu şekilde kullanılabilmesi için,
kullanılacak Apache Web sunucusunun da buna göre düzenlenmiş olması
gerekir. Kurulum bölümünde anlatılan PHP Modül kurulumu tercih edildiyse, '
Apache ve PHP, MySQL kalıcı bağlantısı için gerekli olan tek bir uygulama gibi
çalışacaklardır. PHP uygulamalarında kalıcı bağlantı için yapılması gereken
tek değişiklik veritabanına bağlantı komutu olan mysql_connect() satırındaki
değişikliktir.

mysql_connect("localhost","root","sifre");

satırı yerine

mysql_pconnect("localhost","root","sifre");

yazılarak, PHP uygulamasına daha performanslı olan kalıcı bağlantı yöntemim


kullanması gerektiği bildirilir. PHP'nin MySQL'le kurabileceği en fazla kalıcı
bağlantı sayışı ve bazı diğer özellikler, kurulum bölümünde anlatılan php.ini
dosyası ayarlamalarıyla yapılmaktadır. PHP'nin MySQL'le kalıcı bağlantı
yöntemiyle çalışıp çalışmadığı

phpinfo() ;

komutu yardımıyla tarayıcıda görülen bilgiler arasında MySQL başlığı altından


izlenebilir. Bu bilgiler arasında o anda aktif olan kalıcı bağlantı sayışı da yer
almaktadır.

PHP'de kullanılabilecek MySQL Komutları


PHP'nin 4 versiyonunda, MySQL'le iletişim için kullanılabilecek olan tüm
komutlar ve kısa açıklamaları aşağıda yer alıyor.
mysql_affected_rows
Bir önceki işlemde etkilenen satar sayısı.

mysql_close
Belirtilen MySQL bağlantısını kapatır.

mysql_connect
Sunucuya veritabanı bağlantısı açar.

mysql_create_db
MySQL'de veritabanı açar.

mysql_data_seek
Sonuç satırında belirtilen sıraya geçer.

mysql_db_query
MySQL'e sorgu gönderir.

mysql_drop_db
Veritabanın sunucudan siler.

mysql_errno
Bir önceki işlemdeki MySQL hata numarasını verir.

mysql_error
Bir önceki işlemdeki MySQL hata mesajını verir.

mysql_fetch_array
Sonuçları dizi değişkeni olarak alır.

mysql_fetch_field
Sonuç tablosundaki alan adım nesne olarak alır.

mysql_fetch_lengths
Sonuç tablosundaki dizi değişkenin uzunluğunu alır.

mysql_fetch_object
Sonuç satırım nesne olarak alır.

mysql_fetch_row
Sonuç tablosundan dizi değişkeni alır.

mysql_field_name
Sonuç tablosundaki sonucun tablodaki alan adım verir.

mysql_field_seek
Sonuç tablosunda sıra indeksini belirtilen yere götürür.

mysql_field_table
Alan adı verilen sonucun tablo adını verir.

mysql_field_type
Sonuçtaki alanın hangi tip olduğunu belirtir.

mysql_field_flags
Sonuçtaki alanın hangi tür ekstra parametrelerle tanımlandığım belirtir.

mysql_field_len
Sonuçtaki alanın veritabanındaki uzunluğunu verir.

mysql_free_result
Sonuçlar için atanan hafızayı boşaltır.

mysql_insert_id
Bir önceki veri yerleştirmede oluşan otomatik veri değerini verir.

mysql_list_fields
Sonuçtaki tüm tablo alanlarım listeler.

mysql_list_dbs
Sunucudaki tüm veritabanlarını listeler.

mysql_list_tables
Veritabanındaki tüm tabloları listeler.

mysql_num_fields
Sonuçtaki alan sayısını verir.

mysql_num_rows
Sonuçtaki satır sayısını verir.

mysql_pconnect
Sunucuya kalıcı bir bağlantı tanımlar.

mysql_query
Veritabanına sorgu gönderir.
mysql_result
Sorgudan dönen sonuçları alır.

mysql_select_db
Sunucudan veritabanı seçer.

mysql_tablename
Verilen alanın ait olduğu tablonun adını verir.

You might also like