Sayfalar

PHP ve Veritabanı Bağlantıları - 7



MySQL Hata Mesajlari ve Anlamlari

Bir onceki konuda yaratilan ornek PHP betigindeki, MySQL kullanici adini, anlamsiz bir kelime ile degistirin.Karsinizda bir suru hata mesaji goreceksiniz.(Eger php.ini dosyasindan hata raporlama fonksiyonunu,bu hatalari gozardi edecek yapilandirmadiysaniz...)

    Warning: MySQL Connection Failed: Access denied for user: 'sacma_isim@localhost'
    (Using password:YES) in /home/turkphp/htdocs/vt_baglan.php on line 3

    Warning:Supplied argumnet is not a valid MySQL-Link resource in /home/turkphp/htdocs/vt_baglan.php on line 5

    Warning:Supplied argumnet is not a valid MySQL-Link resource in /home/turkphp/htdocs/vt_baglan.php on line 6

    Warning:Supplied argumnet is not a valid MySQL-Link resource in /home/turkphp/htdocs/vt_baglan.php on line 8

Neden bu uyari mesajlarini aliyoruz? Sebep cok basittir - Yaratilan program hata mesajlarini ele alabilecek kadar zekice tasarlanmamistir.Hatalar veritabani uzerinde olusmakta fakat PHP tarafindan rapor edilmektedir.PHP neler oldugunu anlayamamakta fakat yaznlica bir hata ile karsilasildigini algilayabilmektedir.

PHP icerisinde hazir bulunan bazi fonksiyonlar sadece bu is icin yaratilmislardir.Boylece veriatabani uzerindeki hata mesajlari, veritabani sunucusunun kendi hata ele alicilarindan alinip, duzugun bir sekilde ekrana yazilabilmektedir.Eger MySQL sunucusu islemi yaparken bir hata dondururse bir text mesaji ve hata kodu uretir.Bu text mesajini ve hata kodunu alabilmemiz icin yaratilan Hazir PHP Fonksiyonlari asagida listelenmistir.

# mysql_errno ()
# 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.

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..