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:
$sorgu adındaki bilgilerin olduğu düzleme git.
$sira ile belirtilen satırdan
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.
Ç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ç 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.
Ç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.
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>