mysql_error ()
mysql_errno () fonksiyonu olusan hatanin kodunu (numarasini)
mysql_error () fonksiyonu ise o hata ile ilsikili text mesajini
dondurur.Her iki fonksiyonda argument olarak,veriatabani
sunucusuna acilan baglantiyi referans olarak alirlar : (Eger
baglanti yoksa hata mesajida olmayacaktir dogal olarak :)
$MYSQL_HATA_NO = mysql_errno ($baglantim);
$MYSQL_HATA_ACIKLAMA = mysql_error ($baglantim);
Bu iki fonksiyonda sunucuya baglanti yaptiginizi kabul ederler.Eger
sunucuya yapilmis bir baglanti yoksa veya baglanti apma
islemi sirasinda bir hata olusrusa bu iki fonksiyon bu islemlerde
olusan hatayi dogal olarak rapor edemezler.Bu nedenle baglanti
sirasinda asagidaki gibi bir kod kullanilarak en guzel sekilde
hatalari ele almak mumkundur :
if (!mysql_connect ("localhost", "kullanici_adi", "phppass"))
die ("Baglanti Kurulamadi!")
eger yaratilan bu kod icin hata mesajlarinin ekranda gorunmesini
istemiyorsaniz onlari fonksiyonu kullanmadan once ekleyeceginiz
bir "@" isareti ile engelleyebilirsiniz :
if (!@mysql_connect ("localhost", "kullanici_adi", "phppass"))
die ("Baglanti Kurulamadi!")
Bu konuya bir baska yaklasim ise error_reporting () hazir
fonksiyonu ile hangi uyari mesajlarinin ekranda gorunecegine
sizin karar vermenizdir.Zira eger hatalari siz ele aliyor
ve ekranda Ingilizce mesajlar gorunmesini engellemek istiyorsaniz
:
error_reporting(0);
seklindeki bir kod parcasi ile hic bir hata/uyari mesajinin
kullaniciya gosterilmemesini saglayabilirsiniz.
NOT : error_reporting () fonksiyonunda argument olarak girilen
deger yukseldikce hata/uyari mesajlarinin ekranda goruntulenmesi
ve PHP'nin hassaiyeti artar.Bu secenekler yanlizca debug
islemlerinde yararlidir.Son kullanici bu tip hata mesajlarindan
urkebilir.
Simdi MySQL sunucusuna baglanabilmek ve gerektiginde hatalari
ele alabilmek icin bir kutuphane rutini hazirlayalim.Bu
genel amacli kitaplik daha sonraki konularda MySQL veritabani
sunucusuna baglanirkende bize kolaylik saglayacak.Bu nedenle
onu db_genel.inc isimli bir dosyada saklayacagim.
<?php
//
//db_genel.inc
//
$dbhost = 'localhost';
$dbkuladi = 'phpuser';
$dbkulsifre = 'phppass';
$default_veritabani = 'mysql';
$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";
}
?>
Simdi bu kutuphaneyi kullananarak veritabani sunucusuna
baglanan ve olasi hata mesajlarini kendisi ele alan kucuk
bir betik hazirlayalim :
<?php
//
//db_baglan.php
//
include "db_genel.inc";
error_reporting(0);
$link_id = db_baglan ();
if (!$link_id) die (sql_hatasi ());
else echo "$dbhost MySQL sunucusuna basarili seilde baglanildi";
?>
Yukarida goruldugu gibi artik olusan hatalar belirli bir
sekilde betik tarafindan kontrol altina alinmistir.Simdi
birkac girdiyi degistirerek betigi tekrar deneyelim :
Ornegin kullanici adi veya sifresyi degistirdiginizde soyle
bir hata mesaji alirsiniz:
0: Baglanti hatasi olustu.Sunucu adi : localhost.
Eger ongorulen veritabani adi bos ise ($default_veritabani)
:
1046: No database selected
Eger olmayan bir veitabanini kullanmak isterseniz (Veritabani
adi olarak ornegin 'olmayan_veritabani' veridiginizi dusunelim)
:
1049: Unknown database 'olmayan_veritabani'
Simdi yarattigimiz bu kutuphaneyi biraz daha gelistirelim
ve ornegin bu hazirladigimiz kullanici yapimi "db_baglan
()" fonksiyonuna bir argument ekleyelim.Boylece fonksiyonu
her zaman kutuphanenin icinde yer alan belirli bir veritabanina
baglanmaktan ziyade,bizim belirledigimiz bir veritabani
ismine baglanmasini saglayalim.Simdi kutuphaneyi aynen alip
yanlizca 4 satirlik bir kod paracasi daha ekleyecegim.Boylece
fonksiyonu bizim diradan belirledigimiz bir veritababnina
baglanacak sekilde yapilandirabilcegiz.
Ozellikle boyle basitten zora dogru ilerleyerek konuyu anlatiyorumki
insanlar daha iyi anlayabilsin diye...Eger yukaridaki konuyu
iyi kavradiysaniz simdi yaptgimiz gelistirmeleri daha cok
begeneceksiniz.
<?php
//
//db_genel.inc
//
$dbhost = 'localhost';
$dbkuladi = 'phpuser';
$dbkulsifre = 'phppass';
$default_veritabani = 'mysql';
$MYSQL_ERRNO = '';
$MYSQL_ERROR = '';
function db_baglan($db_ismi='') {
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 if (!empty($db_ismi) && !mysql_select_db($db_ismi))
{
$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";
}
?>
Simdi hazirladigimiz bu el yapimi fonksiyonu asagidaki
gibi cagirabiliriz :
$link_id = db_baglan ("ornek_veritabani");
Boylece hem veritabanina baglanmis hemde calismak istedigimiz
veritabanini secmis olduk...
Eger herhangi bir argument girmez iseniz default_veritabani'na
baglanilacaktir.
Ornek Dosyalar
http://www.turk-php.com/ornekler/mysql/db_baglan.php
http://www.turk-php.com/ornekler/mysql/db_baglan.phps
http://www.turk-php.com/ornekler/mysql/db_baglan_gelismis.php
http://www.turk-php.com/ornekler/mysql/db_baglan_gelismis.phps
http://www.turk-php.com/ornekler/mysql/db_genel.inc
http://www.turk-php.com/ornekler/mysql/db_genel.inc.phps
http://www.turk-php.com/ornekler/mysql/db_genel_gelismis.inc
http://www.turk-php.com/ornekler/mysql/db_genel_gelismis.inc.phps
Bu ornekleri sizin konuyu daha iyi anlayabilmeniz icin
hazirlayip sunucuma yerlestirdim.Kullanici adi ve sifreler
.phps uzantili dosyalarda ornek degerler verilerek
kullanilmistir.Asil kullanici adi ve sifreler .inc
uzantili dosyalara konulup uygulamalara include ()
komutu ile eklenmistir.
Bu nedenle .inc uzantili dosyalari gormeniz engellenmistir..
Serkan Hadi Ceylani
serkan@turk-php.com