PHP ile MySQL kullanmak
Önceki PHP ve MySQL ile Web Programlama Sonraki
PHP ile MySQL kullanmak
Buraya kadar PHP ve MySQL’e giriş yaptım. Buradan sonra artık web üzerinde akrobasi yapmaya başlayabiliriz ;).
Aslında veritabanlarının çok çeşitli kullanımları olsa da ben genelde çerez yollama, sayaç, ziyaretçi defteri, parolalı giriş ve kullanıcı kaydı gibi konular üzerinde duracağım. Buradan sonra artık yeni işlev kullansam bile çok nadir olarak kullandığım yeni işlevin kullanım şeklini açıklayacağım (Bu belgeyi buraya kadar okumuş ve kendi çabaları ile bir şeyler yapmış birisi için buna ihtiyaç olacağını da sanmıyorum zaten ;)). Bu bölüm genelde yazacağım örnekler ve bu örneklerin açıklamaları halinde olacaktır.
İlk önce MySQL bölümünde kullandığım “kullanicilar” adlı tablodan PHP ile veri alma, veri silme ve veri yükleme işlemlerini gerçekleştirelim. Aşağıda “kullanicilar” tablosunu bir hatırlatma olsun diye tekrar verdim.
+----+--------------+---------+------------------------+-------+
| no | Ad           | Soyad   |  eposta                | bolum |
+----+--------------+---------+------------------------+-------+
|  1 | Fehmi Noyan  | ISI     | fni18444@gantep.edu.tr | eee   |
|  2 | Mehmet       | Korkmaz | kormkaz@linux.org.tr   | pe    |
|  3 | Adem         | Sarnici | a_sarnici@yahoo.com    | pe    |
|  4 | Seckin Fatih | Solgun  | sf_solgun@freebsd.org  | me    |
+----+--------------+---------+------------------------+-------+
Önce PHP ile veritabanına bağlanma ve veri alma işlemlerini ele alalım. PHP ile MySQL’e bağlanmak için mysql_connect() işlevi kullanılır.
<?
#################
#   mysql.php   #
#################

/* mysql’e bağlanma islemi */
@mysql_connect(“localhost”, ”kullanici”, ”parola”)
  or die (“Veritabanına bağlanırken bir hata oluştu!”);

/* mysql’de kendi veritabanimizi secim islemi */
@mysql_select_db(“base”)
  or die(“Veritanında bir hata oluştu!”);

$sira = 0;
while ($sira < 4)
{
  /* mysql’e sorgu gönderiliyor ve bu sorgudan gelen degerler bir degiskene atanıyor.
  $sorgu = mysql_query(“select * from kullanicilar”);
  $ad = mysql_result($sorgu, $sira, ’Ad’);
  echo “$ad <br>”;
  $sira++;
}
?>
Yukarıdaki PHP dosyası bizim kendi sunucumuz üzerindeki MySQL sunucusuna kullanici kullanıcı adı ve parola parolası ile bağlanıyor. Komutların başındaki @ işareti komutun işletilmesinde bir hata oluşursa ekrana hata mesajının basılmaması içindir. Onun yerine kendi belirlediğimiz hata mesajını or die kalıbı ile verebiliyoruz. Bağlanma işleminden sonra mysql_select_db (mysql’deki use base gibi) işlevi ile kendi veritabanımıza geçiyoruz.
Buradan sonra sira bir adlı bir değişkene 0(sıfır) değerini atadım. Bunun amacı MySQL’de işlem yapılan satırların sıfırdan itibaren bir satır sayısı almalarıdır. (Ben örneğimde while döngüsünde koşulu $sira < 4 şeklinde tanımladım ama normalde bir tabloda kaç satır olduğunu bilmeniz mümkün olmayabilir. Ben satır sayısını bildiğim için böyle bir yol seçtim.)
Döngü içerisinde $sorgu adlı değişkene mysql_query() işlevi ile SQL’den alınan bilgiler atanıyor. Daha sonra mysql_result() işlevi ile bu bilgilerden istek doğrultusundan ayıklama yapılıyor. mysql_result() işlevinin işleyiş tarzını bir düzleme benzetirsek:
  1. $sorgu adındaki bilgilerin olduğu düzleme git.
  2. $sira ile belirtilen satırdan
  3. Ad sütunundaki bilgiyi al.
şeklinde bir yorum yapılabilir. mysql_query() sorgusu ile alnan sonuçlar mysql_result() ile ayıklanır. $ad değişkenine atanan değerler alt alta ekrana basılıyor. Daha sonra $sira değişkeni bir arttırılıyor (aksi taktirde sonsuz bir döngü içine girilir!) ve döngüden çıkılıyor.
Şimdi de kafamızda hayali bir senaryo oluşturup bu senaryoya göre bir HTML dosyası ve bu dosyadan veri alan bir PHP dosyası yapalım. Kullanıcı kaydı tutan bir web formu ve bu formdan bilgi alacak PHP dosyasını oluşturalım. Ama daha önce bu bilgilerin kaydedileceği SQL tablosunu oluşturalım.
$ mysql –h localhost –u kullanici –p
Enter Password:

mysql> use base;

Database changed
mysql> create table kayit
    -> (no int auto_increment, kullaniciadi varchar(15),
    -> sifre(25), eposta(25), primary key(no));

mysql> quit
Yukarıda komut satırından mysql’e bağlanıp kayit isimli bir tablo oluşturdum. Şimdi sıra HTML form dosyamızda.
<!-- kayit.html -->
<html>
<body bgcolor="#FFFFFF" text="#000000">
<form action="kayit.php" method="post">
<b>Kullanıcı Adınız:</b><input type="text" name="u_name" size="20"><br>
<b>Parolanız:</b><input type="password" name="pass" size="20"><br>
<b>e-posta adresiniz:</b><input type="text" name="mail" size="20"><br>
<input type="submit" value="  Kayıt  ">
</form>
</body>
</html>
<?
/*  kayit.php */

@mysql_connect("localhost", "kullanici", "parola")
    or die("Veritabani ile baglanti kurulamadi!");
@mysql_select_db("base")
    or die("Veritabaninda bir hata olustu!");

@mysql_query("insert into kayit values(‘’,’$u_name’,’$pass’,’$mail’)");
echo "<center><b>Bilgileriniz varitabanina kaydedildi.</b></center>";
require("./kayit.html");
?>
Yukarıdaki PHP dosyası form ile gelen bilgileri veritabanındaki kayit adlı tabloya kaydediyor.
Kayıt işleminden sonra ekrana işlemin başarı ile gerçekleştirildiğine dair bir mesaj geliyor ve formu içeren HTML dosyası tekrar ekrana basılıyor.
MySQL’de tablo yenileme (update) ve veri silme (delete) komutları da mysql_query() işlevi ile kullanılır. Yani normal olarak SQL sorgusu gönderiliyor.
Burada sonra artık örnek uygulamalara geçiyorum.
Yeni bölüme başlamadan önce size phpinfo() işlevinden biraz söz etmek istiyorum. Yapmanız gereken tek şey bir PHP dosyası için <? phpinfo(); ?> yazıp kaydetmek. Üzerinde çalıştığınız sunucunun birçok özelliğini ve PHP ile birlikte kullanabileceğiniz birçok faydalı değişkeni bu işlev altında bulabilirsiniz.
Ziyaretçi Defteri Örneği
Çoğu web sitesinde gördüğümüz ziyaretçi defterlerini PHP yardımı ile kendi sitenizde de kullanabilirsiniz. Gerçi internet üzerinde bu işi yapan hazır betikler bulmak pek zor değil fakat bu basit uygulamaları daha ileri teknikler için bir ön adım olarak kullanmanız açısından faydalı olacaktır.
Bu iş için önce bir HTML dosyası ile kullanıcıdan bilgi alınmalı. Daha sonra bu bilgi bir PHP dosyası ile bir metin dosyasına yazılarak isteyen kullanıcılara görüntülenmeli.
<!-- Bu dosya defter.html adı ile kaydedilecek -->
<html>
<head>
<title>Ziyaretçi Defteri</title>
</head>
<body bgcolor="#ffffff" text="#000000">
<center>
<br>
<table bgcolor="#000000" border="0" cellpadding="1" cellspacing="0" width="450">
  <tr><td>
    <table border="0" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" width="450">
      <tr><td bgcolor="#006486">
        <b><center>Defteri Doldurun</b>
      </td></tr>
      <td>
        <form action="defter.php" method="post"><br>
           <b>Kimden :</b><input type="text" name="kimden" size=30><br><br>
          <center><textarea rows="15" cols="50" name="metin"></textarea>
      </td></tr>
      <tr><td>
        <center><br>
        <input type="submit" value="  Deftere ekle  "> 
        <input type="reset" value="  Yazdıklarımı sil  "><br><br>
      </td></tr>
    </table>
  </td></tr>
</table>
</body>
</html>
<?
/* Bu dosya defter.php adi ile kaydedilecek */

if ($dosya_ac = (fopen(“./defter.txt”,”a”)))
{
  $tarih = date("d.m.Y");
  $yeni_metin = "<br><table border='0' cellpadding='0' cellspacing='0' bgcolor='#eaeaea' width='600'>
  <tr><td><b>$kimden</b> tarafından <b>$tarih</b> tarihinde yazılmış.<br><br></td></tr>\n
  <tr><td>$metin</td></tr></table><br>”;
  fwrite($dosya_ac, $yeni_metin);
  fclose($dosya_ac);
  echo “Sayın $kimden defterimizi doldurduğunuz için teşekkürler.<br>”;
  require(“./defter.txt”);
}
 else
{
 echo “<center><br><b>Dosya açmada bir hata oluştu!</b></center>”;
}
?>
Yukarıdaki iki dosyayı yazdıktan sonra belirtilen isimler ile kaydedin. Tabii bu dosyalar basitten hazırlanmış haldeler. Görünümü güzelleştirmek ve geliştirmek size kalmış.
Sanırım ilk HTML dosyasında ne yaptığımı anlatmaya gerek yok. Bir form ile kimden ve metin adlı iki tane değişkeni belirtilen PHP dosyasına post yöntemi ile yolluyorum. Belki PHP dosyasında biraz karışıklık yaşamışsınızdır. Burada yabancı olduğunuz sadece date() işlevi var. PHP’de tarih almak için kullanılan date() işlevi, istenen bilgi türü küçük harf olursa (benim dosyamdaki d ve m gibi ) bilgi rakamla, büyük harf olursa (benim dosyamdaki Y gibi) bilgi tam olarak yazılır (tabi ki İngilizce).
Ziyaretçiden gelen bilgiler defter.txt adlı bir dosyada tutuluyor (dosyaya herkes için yazma yetkisi verilmelidir!) ve benim PHP koşulumun sonunda bu dosya ekrana yazdırılıyor (require ile). $metin değişkenini bir tablo içinde yazmamın tek sebebi ziyaretçiye görünecek dosyanın daha hoş olması içindir. require() işlevi ile ekrana yazdrdığımız dosya bir txt dosyası olsa bile içindeki HTML kodları istemci tarafından yorumlanacaktır. Eğer sayfanızdan ayrı bir bağ verip önceden yazılanların görüntülenmesini istiyorsanız, o zaman bir metin değil de HTML dosyası kullanmanız gerekecektir.
Sayaç Örneği
Sayaç yapmanın birçok yolu vardır. Ben en basitinden bir uyguluma olarak, dosyalara değer yazıp bu değerler üzerinde işlem yapan bir sayaç uygulaması örneği verdim.
<?
/* Bu dosya sayac.php adi ile kaydedilecek */

# $REMOTE_ADDR degiskeni sunucu hafizasinda tutulan gecici degiskenlerdendir.
$r_ip = $REMOTE_ADDR;

$ip_dosya_ac = fopen(“./ip.txt”, ”r”);
$dosyadaki_ip = fgets($ip_dosya_ac,1024);
if ($r_ip != $dosyadaki_ip)
{
  $sayac_dosyasi_ac = fopen(“./sayac.txt”, ”r”);
  $eski_deger = fgets($sayac_dosyasi_ac,1024);
  fclose($sayac_dosyasi_ac);

  $sayac_dosyasi_yaz = fopen(“./sayac.txt”,”w”);
  $yeni_deger = ++$eski_deger;
  fwrite($sayac_dosyasi_yaz, $yeni_deger);
  fclose($sayac_dosyasi_yaz);

  $ip_dosyasi_ac = fopen(“./ip.txt”,”w”);
  fwrite($ip_dosyasi_ac, $r_ip);
  fclose($ip_dosyasi_ac);

  echo “Sitemiz bugüne kadar <b>$yeni_deger</b> kere ziyaret edilmiştir.”;
} else {
  $sayac_dosyasi_ac = fopen(“./sayac.txt”, ”r”);
  $eski_deger = fgets($sayac_dosyasi_ac,1024);
  fclose($sayac_dosyasi_ac);
  echo “Sitemiz bugüne kadar <b>$eski_deger</b> kere ziyaret edilmiştir.”;
}
?>
Yukarıdaki dosyayı oluşturduktan sonra aynı dizine sayac.txt ve ip.txt diye iki dosya oluşturun. Yalnız sayac.txt dosyasının içine başlangıç değeri olarak 0(sıfır) yazmalısınız.
Yukarıdaki PHP programı önce ip.txt dosyasını açıp içindeki IP numarası ile ziyaretçinin IP numarasını karşılaştırıyor. Eğer iki numara aynı değilse sayaç dosyası açılıyor ve dosyada eski ziyaretçi sayısı ($eski_deger) okunuyor. Daha sonra bu okunan eski değer bir arttırılıp yani bir değişkene ($yeni_değer) atanıyor. Daha sonra IP değerinin tutulduğu dosya açılıp ziyaretçinin IP numarası bu dosyaya yazılıyor. En son olarak da ziyaretçiye sitenin bugüne kadar kaç defa ziyaret edildiğini gösteren bir mesaj ekrana yazılıyor.
Çerez Örneği
Çerezler HTTP ile kullanıcının bilgisayarına gönderdiğimiz bilgi paketleridir. Bu bilgiler düz yazı dosyası halinde kullanıcıya ulaşır ve kullanılan istemcinin tipine göre herhangi bir dizinde belirlenen süre kadar saklı tutulur. Çerezlere gönderen bilgisayar dışında başka bir bilgisayar tarafından ulaşılamaz. Windows sistemlerde MS-Internet Explorer, sunucu tarafında yollanan çerezleri C:\WINDOWS\Cookies dizini altında saklar. Linux altında, kullanılan istemci tarafından kullanıcının kendi ev dizininde oluşturulun gizli bir dizinde saklanır.
Örneğimde bir web sitesine parola ile giriş yapmış bir kullanıcının bilgisayarına yollanan çerezin kullanımı var. Tabii bu örnek için kullandığım veritabanı bilgilerinin varolduğunu varsayıyorum.
<!-- Bu dosya index.html adı ile kaydedilecek -->
<html>
<head>
<title>Şifrenizi girin</title>
</head>
<body bgcolor="#ffffff" text="#000000">
<br><br>
<center>
<form action="login.php" method="post">
  <b>Kullanıcı adınız</b><input type="text" name="uid" size="20"><br>
  <b>Parolanız</b><input type="password" name="passwd" size="20"><br><br>
  <input type="submit" value="  Giriş  ">
</form>
</body>
</html>
<?
/* bu dosya login.php adi ile kaydedilecek */

if (isset($uid) && isset($passwd)) {
  # Veritabanina baglaniliyor
  @mysql_connect(“localhost”, ”kullanici”, ”parola”)
      or die(“Veritabani ile baglanti kurulamadi!”);
  @mysql_select_db(“base”)
      or die(“Veritabaninda bir hata olustu!”);

  $sorgu = mysql_query(“select  * from kayit”);
  $db_passwd = mysql_result($sorgu, $uid, ’parola’);
  if ($db_passwd == $passwd) {
    setcookie(“identify”,”OK”, time() + 3600);
    echo “Cerez yollandi.”;
  } else {
    echo “<center><b>Kullanici adi ve sifrenizi kontrol edin!</b></center>”;
    require(“./index.html”);
  }
} else {
  echo “<center><b>Bir kullanici adi ve sifre girmelisiniz!</b></center>”;
  require(“./index.html”);
}
?>
Bu PHP dosyası eğer formdan $passwd ve $uid değişkenleri gelirse if döngüsüne giriyor. Döngü içerisinde MySQL’e bağlanılıp kayit adlı tablodan kullanıcı adı $uid olan satırdaki parola alınıp bir değişkene ($db_passwd) atanıyor. Eğer iki şifre aynı ise setcookie() işlevi ile kullanıcıya çerez yollanıyor. Yollanan çerezin adı identify ve bu çerezin değeri OK. Karşı tarafın bilgisayarında kalma süresi ise 1 saat (3600 saniye). Çerez yollandıktan sonra ekrana “Cerez yollandi.” diye bir mesaj yazılıyor.
Çerez ile yollanan bir değişkenin değerini $deger adlı bir değişkene atmak için
   $deger = $HTTP_COOKIE_VARS["cerez_adi"];
satırı kullanılır. Ancak çerezleri kullanırken dikkat etmeniz gereken önemli bir nokta var! Çerezi yolladığınız PHP dosyası ile aynı çerezin değerini çağıramıyorsunuz. Bu işlemi başka bir dosya üzerinde yapmak zorundasınız.
Renk Tablosu Örneği
Bu örneğimde HTML ile kullanabileceğiniz renklerin onaltılık tabandaki karşılıklarını veren bir PHP betiği var. Betik 512 tane rengin onaltılık kod karşılığını vermektedir. Aynı betik üzerinde sadece bir küçük değişiklik yaparak tam olarak 4096 tane rengin onaltılık karşılığını almak mümkündür. Bunu için, kodun başında yorum işareti ile verilen $d dizisini (16 elemanlı) yorum olmaktan çıkarıp normal (8 elemanlı) olan diziyi yorum satırı haline getirmek yeterlidir.
Fakat 4096 renk arasından kullanacağınız rengi seçmek gerçekten çok güçtür ve renk tonlamalarındaki geçişler çok yumuşak olduğu için çoğu renk birbirinin aynı gibi görünecektir.
<!-- Bu dosyayı renk.php adı ile kaydedin -->
<html><head><title>HTML Renk Kodları</title></head>
<body bgcolor="#e8e8e8" text="#000000">
<center>
<h1>HTML Renk Kodları</h1>
<table border="0" width="540" cellpadding="0" cellspacing="2">

<?
//$d = array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");
$d = array("0","2","4","6","8","a","c","e");
$d_c = count($d);
// Kırmızı
$r_i = 0;
while($r_i < $d_c) {
  $r = $d[$r_i] . $d[$r_i];
  // Yeşil
  $g_i = 0;
  while($g_i < $d_c) {
    $g = $d[$g_i] . $d[$g_i];
    // Mavi
    $b_i = 0;
    echo "<tr>";
    while($b_i < $d_c) {
      $b = $d[$b_i] . $d[$b_i];

      // HTML Kodu ile tablonun satirlari olusturuluyor
      $renk = "#" . $r . $g . $b;
      echo "\n<td style='background:$renk; color:white'><b>$renk</b></td>";
      $b_i++;
    }
    echo "\n</tr>";
    $g_i++;
  }
  $r_i++;
}
?>
</table></center></body></html>
Önceki Üst Ana Başlık Sonraki
MySQL’e Giriş Başlangıç Ek A. Faydalı Kaynaklar
Bir Linux Kitaplığı Sayfası