17 Nisan 2014 Perşembe

PHP ve MySQL İlişkisi



Böylece, MySQL ile bir veritabanı dosyası oluşturma işlemi bitmiş oldu. bir PHP programı yazarak bu veritabanındaki kayıtları okutabiliriz. Bunu yapmadan önce yine hızlı şekilde PHP-MySQL ilişkisinini sağlayan fonksiyonlara gözatalım.

PHP programlarımızda veritabanından yararlanabilmek için programın önce Web sunucusu aracılığıyla veritabanı dosyası ile bağlantı kurması gerekir. Başka bir deyişle, PHP programının veri ile arasında bir yol açması gerekir. MySQL açısından ise bu bağlantı, veri sunucusunda yeni bir oturum açılması anlamına gelir. İki program arasındaki bu ilişkiyi PHP'nin mysql_connect() fonksiyonu yapar. Bu fonksiyonun alabileceği üç parametre vardır:

$veri_yolu = mysql_connect ("localhost" , "root" , "parola" );


Burada "localhost" yerine MySQL programının parçası olarak çalıştığı sunucunun adı yazılır. "root" bu MySQL sunucusunda açılacak oturumun kimin adına açılacağını belirter. "root" kelimesi, sunucunun yönetici olarak oturum açılacağı anlamına gelir: "parola" kelimesinin yerine de MySQL'i kurarken belirlediğimiz bir kullanıcı parolası varsa, onu yazarız. Bu komutta yer alan $veri_yolu değişkeni, açılacak veri yolunun, PHP ile MySQL veritabanı sunucusu arasındaki bağın tanıtıcı işareti olacaktır. Bu bağlantı kurulduktan sonra, açtığımız veri yolundan gelecek bilgiler ve veritabanına gidecek bilgiler bu değişken aracılığıyla gerçekleşecektir. Veri sunucusu ile veri yolu bağlantısı kurulursa, bu değişken değer tutar hale gelir; bağlantı kurulamazsa bu değişken boş kalır. mysql_connect() fonksiyonunun başarılı olup olmadığını bu değişkenin durumunu sınayarak anlayabiliriz. Örneğin:

$veri_yolu =mysql_connect("kara-murat", "root");
if ( ! $veri_yolu) die ("MySQL ile veri bağlantısı kurulamıyor!);

Burada veri sunucusunun bulunduğu Web sunucusunun adının "kara-murat" olduğuna, ve ooturumun "root" yetkileriyle açıldığına dikkat edin. İkinci satırdaki if deyimi, $veri_yolu değişkeninin değer içerip içermediğine bakıyor ve değişkende bir değer yoksa, bağlantı kurma girişini durdurarak, ziyaretçiye hata mesajı gönderiyor.

Bağlantı başarıyla kurulduktan sonra PHP programı, bu yoldan, veritabanı sunucusuna, hangi veritabanı dosyasından yararlanmak istediğini bildirmelidir. Buna veritabanı dosyası seçme işlemi denir ve mysql_select_db() fonksiyonu ile yapılır:

mysql_select_db( "veritabanın_adı" , $veri_yolu ) or die ("Veritabanı açılamıyor!".mysql_error() );

Bu fonksiyonun başarıyla icra edilip edilmediği fonksiyondan dönen değerin true/doğru veya false/yanlış olmasından anlarız. Bu değer false ise bu deyimin die() bölümü icra edilecek ve Browser penceresine veritabanının açılamadığı mesajıyla birlikte MySQL'in hata mesajı da gönderilecektir. PHP'nin MySQL veritabanını seçememesi çoğu zaman kullanıcı yetkilerinin Internet ziyaretçilerini kapsayacak şekimde düzenlenmemiş olmasından kaynaklanır. Bu durum gerçek Web sunucusunda ortaya çıkarsa, Web sunucusu yönetimine başvurmak gerekir.

Şimdi bu anlattıklarımızı biraraya getiren kolay bir PHP programıyla biraz önce oluşturduğumuz "veri" adlı veritabanından bir birinci kişiye ait verileri "okutarak, HTML sayfamızda kullanalım. Aşağıdaki programı, veri_01.php adıyla kaydedelim:

<?php
$veri_yolu = mysql_connect("kara-murat", "root");
if ( ! $veri_yolu ) die ("MySQL ile veri bağlantısı kurulamıyor!");
mysql_select_db("veri" , $veri_yolu)
            or die ("Veritabanına ulaşılamıyor!" . mysql_error() );
$sonuc = mysql_query("SELECT * FROM calisanlar",$veri_yolu);
            printf("Adı: %s<br>\n", mysql_result($sonuc,0,"adi"));
            printf("Soyadı: %s<br>\n", mysql_result($sonuc,0,"soyadi"));
            printf("Adresi: %s<br>\n", mysql_result($sonuc,0,"adres"));
            printf("Görevi: %s<br>\n", mysql_result($sonuc,0,"pozisyon"));
?>
Ücretsiz Hosting
Burada, mysql_connect() fonksiyonu ile "kara-murat" isimli sunucuda root adına MySQL sunucu ile bağ kurduktan sonra mysql_select_db() fonksiyonu ile bu bağı kullanarak veri isimli veritabanından veri çekeceğimizi bildiriyoruz. Daha sonra mysql_query() fonksiyonu ile bu veritabanındaki “calisanlar” isimli tablodan “herşeyi” seçiyoruz ve seçilenleri $sonuc dizi-değişkeninde topluyoruz. $sonuc değişkenin değerlerini görüntülemek için PHP'nin özel bir fonksiyonu olan mysql_result() fonksiyonu kullanıyoruz. Burada metin biçimlendirmekte yararlandığımız printf() fonksiyonunu daha önce tanımıştık.

mysql_query() fonksiyonu, PHP'nin SQL dilini kullahnarak veritabanı işlemleri yapmasını sağlayan başlıca aracıdır. Yukarıda kısaca değindiğimiz bütün SQL komutlarıyla yazacağımız bütün "query" deyimlerini bu fonksiyon ile icra ettireceğiz. mysql_result() ise SQL değil, Data Manipulation Language (DML) denen başka bir veri-biçimlendirme dilinin inceliklerinden yararlanmamızı sağlar. Burada $sonuç değişkeninde veritabanı kayıt biçiminde tutulan verileri PHP'nin ve dolayısıyla HTML'in anlayacağı biçime çeviren bu fonksiyondur.

Şimdi bu programı biraz geliştirilim ve daha önce kendi kendine bilgi veren Form örneğimizi buraya uygulayalım; ancak bu kez, ziyaretçimizin vereceği bilgileri veritabanına ekleyelim; ve kendi adının veritabanına eklendiğini sayfadaki tabloyu güncelleyerek bildirelim. Önce şu programı, veri_02.php adıyla kaydedelim:

<?php
// Form doldurulduktan sonra program buradan başlıyor
if ( isset ( $HTTP_POST_VARS )) {
$veri_yolu = mysql_connect("server", "root");
if ( ! $veri_yolu ) die ("MySQL ile veri bağlantısı kurulamıyor!");
mysql_select_db("veri" , $veri_yolu) or die ("Veritabanına ulaşılamıyor!" . mysql_error() );
$ekle = mysql_query("INSERT INTO calisanlar ( adi , soyadi , adres , pozisyon ) VALUES ('$adi', '$soyadi', '$adres', '$pozisyon' )", $veri_yolu );
echo ("
            <HTML>
            <HEAD>
            <TITLE>PHP'de Veritabanı</TITLE>
            <meta http-equiv='content-type' content='text/html; charset=ISO-8859-9'>
            <meta http-equiv='Content-Type' content='text/html; charset=windows-1254'>
            ");
$sonuc = mysql_query("SELECT * FROM calisanlar", $veri_yolu);
echo ("
            <TABLE>
            <TR>
                        <TD><B>Uzmanın Adı</B></TD>
                        <TD><B>Çalıştığı Yer</B></TD>
                        <TD><B>Görevi</B></TD>
                        </TR>
            \n");
while ($satir = mysql_fetch_row($sonuc)) {
            printf("<TR><TD>%s %s</TD><TD>%s</TD></TD><TD>%s</TD></TR>\n", $satir[1], $satir[2], $satir[3], $satir[4]);
            }
echo ("
            </TABLE>\n
            <p><B>Teşekkür ederiz.</B></P>
            <A HREF='index.php'>Ana sayfaya dönmek için tıklayınız</A>
            ");
}
// program ilk kez açılıyorsa buradan başlayacak
else {
echo ("
            <HTML>
            <HEAD>
            <TITLE>PHP'de Veritabanı</TITLE>
            <meta http-equiv='content-type' content='text/html; charset=ISO-8859-9'>
            <meta http-equiv='Content-Type' content='text/html; charset=windows-1254'>
            </HEAD>
            <BODY>
            <p><B>Mevcut Üyelerimiz</B></P>
            ");
$veri_yolu = mysql_connect("server", "root");
mysql_select_db("veri", $veri_yolu);
$sonuc = mysql_query("SELECT * FROM calisanlar", $veri_yolu);
echo ("<TABLE>
            <TR>
                        <TD><B>Uzmanın Adı</B></TD>
                        <TD><B>Çalıştığı Yer</B></TD>
                        <TD><B>Görevi</B></TD>
            </TR>
            \n");
while ($satir = mysql_fetch_row($sonuc)) {
            printf("<TR><TD>%s %s</TD><TD>%s</TD></TD><TD>%s</TD></TR>\n", $satir[1], $satir[2], $satir[3], $satir[4]);
            }
echo ("
            </TABLE>\n
            <p></p>
            <p><B>Siz de aramıza katılmak ister misiniz?</B></P>
            <FORM ACTION='$PHP_SELF' METHOD='POST'>
            <TABLE>
            <TR><TD>Adınız: </TD><TD><INPUT TYPE='TEXT' NAME='adi'></TD></TR>
            <TR><TD>Soyadınız: </TD><TD><INPUT TYPE='TEXT' NAME='soyadi'></TD></TR>
            <TR><TD>İş Yeriniz: </TD><TD><INPUT TYPE='TEXT' NAME='adres'></TD></TR>
            <TR><TDALIGN='left'>Göreviniz: </TD><TD><INPUT TYPE='TEXT' NAME='pozisyon'></TD></TR>
            <TR><TD ALIGN='center'><INPUT TYPE='SUBMIT' VALUE='Defteri imzala!'></TD><TD ALIGN='center'><INPUT TYPE='RESET' VALUE='Tümünü sil!'></TD></TR>
            </TABLE>
            </FORM>
            </BODY>
            </HTML>
            ");
}
?>

Program, ilk kez çalıştığında, çalışmaya ikinci yarısındaki else() deyiminden itibaren icra ediliyor;  ziyaretçilerimize mevcut üyelerimizin listesini veriyor ve üye olmak isteyip istemediğini soruyor. Arzu edenin üye olabilmesi için gerekli Form'u da sunuyoruz.

Programın her iki bölümünde de veri okuyan ve bunu görüntüleyen, yani programın canalıcı noktası, mysql_fetch_row() fonksiyonudur. PHP'nin DML araçlarından olan bu fonksiyonun marifeti, bir veritabanından elde edilen sonucu satır-satır okumasıdır. Nitekim, burada bu fonksiyondan dönen değeri $satir adını verdiğimiz dizi-değişkene yazıyoruz ve sonra printf() bu dizinin elemanlarını sırayla Browser penceresine gönderiyor. (Burada olduğu gibi $satır değişkenin içinde kaç kaç sütun olduğunu bildiğimiz durumlarda printf() fonksiyonunu döngüsüz kullanmak mümkündür. Ancak veritabanının sütun sayısını bilmiyorsak bunu sözgelimi count($satir) yoluyla öğrenip, bu bilgiyle bir for döngüsü kurmak yerinde olur.

Programın iki bölümü arasındaki tek fark, $HTTP_POST_VARS dizi-değişkeninin bir değer tutması halinde (yani ziyaretçi sayfayı açtığında karşısına çıkan Form'u doldurduğu ve gönderdiği zaman) çalışan birinci bölümünde, mysql_query() fonksiyonunun bu kez veritabanı dosyasına ziyaretçinin verdiği bilgileri işlemek üzere farklı bir SQL deyimi içermesidir. Nasıl yazıldığını daha önce ele aldığımız bu fonksiyon "calisanlar" tablosundaki dört alana elimizdeki dört değişkenin değerlerini SQL'in INSERT komutuyla ekliyor.

PHP'nin MySQL ile yapabileceğimiz veritabaynı yönetimi için 20'ye yakın fonksiyonu vardır; MySQL de bu fonksiyonlar yardımıyla çok sayıda iş yapabilir. Bu konuda ayrıntılı bilgiyi MySQL ve PHP'nin Internet sitelerin yanı sıra, http://hagen.let.rug.nl/~s0367672/pm_lin_e.htm adresinde bulabilirsiniz.
Bu konuya son verirken, Form örneğindenden farklı olarak yukarıdaki veritabanı örneğinde ziyaretçinin gireceği bilgilerle ilgili güvenlik önlemleri alınmadığına dikkatinizi çekerim.

Tırnak İşareti Sorunu
PHP4.0'ü tasarlayanlar, özellikle zararlı kodları gizlemekte kötüniyetli kişilerin yararlandığı tek ve çift tırnak işaretlerinin sisteme zarar vermesini önlemek amacıyla, ziyaretçi girdilerindeki tırnak işaretlerinin otomatik olarak Escape karakteri ile zararsız hale getirilmesini sağlamış bulunuyorlar. Buna göre bir ziyaretçi bir forma söz gelimi "PHP'nin yararları" yazacak olursa bu "PHP\'nin Yararları" haline dönecektir. Kimi zaman çirkin görünse de bu, bir sitenin güvenliği için önemli bir kazançtır.

Bu sistemin işleyebilymesi için sunucu yönetiminin PHP kurulumu sırasında php.ini dosyasında gereken düzenlemeyi yapmış olması gerekir. Bunun yapılmadığı durumlarda, programcı olarak siz, PHP'nin değişkenlerin değerlerinde gerektiğinde  tersbölü işareti uygulamasını, bu değişkeni addslashes() fonksiyonu ile birlikte kullanarak çözümleyebilirsiniz. Örnek:

$yeni_degisken = addslashes($eski_degisken)

Ücretsiz Hosting

MySQL Yönetimi
Tüm SQL işlemleri için Php kullanılabileceği gibi veritabanı sunucusunda veritabanı, tablo oluşturmak, değiştirmek ya da diğer işlemler için farklı arayüzler kullanmak zaman kazandırıcı olabilir. Php kullanılarak geliştirilen PhpMyAdmin sayesinde web sunucu aracılığıyla tüm MySQL özelliklerini yönetebilmek mümkündür. Hem Unix hem de Windows ortamları için PhpMyAdmin tavsiye edilir. Windows'da da MySQL'i yönetmek için myAdmin adındaki yazılım da oldukça kullanışlıdır. MySQL'e ve Php'ye yeni başlayan kullanıcılar için veritabanını tanımak amacıyla ayrı bir yazılım kullanmaları tavsiye edilebilir.

Php'de kullanılabilecek MySQL Komutları :

mysql_affected_rows :                       Bir önceki işlemde etkilenen satır 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 :                    Sunucudan veritabanı 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ını obje olarak alır
mysql_fetch_lengths :                       Sonuç tablosundaki dizi değişkenin uzunluğunu alır
mysql_fetch_object :             Sonuç satırını obje olarak alır
mysql_fetch_row :                 Sonuç tablosundan dizi değişkeni olur
mysql_field_name :                Sonuç tablsundaki sonucun tablodaki alan adını verir
mysql_field_seek :                Sonuç tablosunda sıra indisini 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ığını 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ını 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 tablo adını verir

Ücretsiz Hosting

0 yorum:

Yorum Gönder