MySQL’e Giriş PHP ve MySQL Burada sadece MySQL programı ile veritabanı oluşturmakla kalmayalım, bir anlamda SQL diline de çok kısa bir giriş yapalım. SQL, (Structured Query Language, Yapısal Sorgu Dili) veritabanı endüstrisinin standart dilidir. Ders 6 1 2 MySQL veritabanına erişim HTML konusunda farklı firmaların sadece kendi Browserlarının tanıdığı türden etiketler geliştirmeleri gibi, SQL alanında da farklı firmaların ekleri ve dilde yaptıkları değişiklikler vardır. MySQL, teknik tabiriyle sunucuda deamon olarak çalışır ve arzu eden programa, bildireceği (ve erişim hakkı bulunan) veritabanı dosyasından veri çekerek, sunar. Bir veritabanı dosyasında yer alan tablolarda, sütunlar ve satırlar vardır: bunların kesiştikleri yerlere biz verilerimizi yazarız. Bir SQL veritabanı dosyasında her bir kutunun ne tür veri kabul edeceği önceden belirlenir; dolayısıyla türü sayı olan verinin yazılacağı kutuya, alfanümerik değer yazılmaz. MySQL, sayısal verilerin türünü INT, belirli bir sınıra kadar değişen sayıda karakterden oluşacak verilerin türünü VARCHAR komutuyla belirler. Kullanmakta olduğumuz sunucuda bulunan veritabanına erişmek için shh konsolunu kullanacağız. Buradaki konsol penceresine > mysql –u kullanıcı –p Komutu yardımıyla sunucuya erişeceğiz. Buradaki kullanıcı şifresi size verilecek Şifrenizi değiştirmek için mysql> set password=password("şifre"); 3 4 MySQL veri türleri Veritabanı seçimi Veritabanında tablo oluşturmak veya kullanmak için öncelikle kullanacağınız veritabanını seçmelisiniz. Hali hazırdaki veri tabanlarını görmek için show databases; Veritabanını seçmek içinde use veritabanı_ismi; Komutları kullanılır. status komut ile veritabanı durumu hakkında bilgi edinebiliriz. Buradaki her çalıştırılabilir ifade ; , \g veya \G ifadelerinden birisiyle sonlandırılmalıdır. Bazı tek başına çalışabilen komutların sonlandırılması gerekmemektedir. Veri tabanı içerisindeki tabloları görmek için show tables; komutu kullanılır. 5 MySQL'de bir çok veri türü oluşturulabilir. Ancak Web programları açısından önemli olan bir kaçı ve özellikleri şöyle sıralanabilir: INT Tamsayı değerler alır: -2147483648'den 2147483647 kadar değişen diziye "signed“ (işaretli), 0'dan 4294967295'e kadar değişenine "unsigned" (işaretsiz) denir. VARCHAR(n) n sayısını geçmemek şartıyla değişen boyutta karakter olabilir. CHAR(n) Kesinlikle n sayısı kadar karakter olabilir. TEXT En fazla 65535(2^16-1) karakter alabilen metin alanı. MEDIUMTEXT En fazla 16777215(2^24-1) karakter alabilen metin alanı. DATE 1000-01-01'den 9999-12-31'e kadar değişebilen tarih alanı. TIMESTAMP 1 Ocak 1970'den 18 Ocak 2038'e kadar olan ve Yıl+Ay+Gün+Saat+Dakika+Saniye biçimindeki zaman bilgisi. 6 1 Tablo oluşturma Tablo detayları CREATE TABLE uyeler ( adi VARCHAR(30), soyadi VARCHAR(30), uye_no INT ) ; Bu komutla, "uyeler" isimli üç sütunlu bir tablo oluşturulur: birinci ve ikinci mysql> CREATE TABLE ziyaretciDefteri (autoID int(10) unsigned not null -> auto_increament primary key, name varchar(64), email varchar(64), -> comment text, date_auto int unsigned); sütunlarda en fazla 30, karakterlik değişen boyutta alfanümerik değerler yer alırken, üçüncü sütunda sadece tam sayı olan değerler bulunabilir. Oluşturulmuş tablo bilgileri ile görüntülenir. Tablo oluşturulurken bir tane PRIMARY KEY, birincil anahtar tanımlanır. Bazı değerlerin otomatik olarak atanması istenebilir, bunun için özellikleri tablo oluşturulurken atanır. Tabloya veri girişi sırasında boş bırakılan yerlere varsayılan değerlerin atanması istenebilir. Bu durumda DEFAULT anahtar kelimesi kullanılır. mysql> describe ziyaretciDefteri; +-----------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+------------------+------+-----+---------+----------------+ | autoID | int(10) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(64) | YES | | NULL | | | email | varchar(64) | YES | | NULL | | | comment | text | YES | | NULL | | | date_auto | int(10) unsigned | YES | | NULL | | +-----------+------------------+------+-----+---------+----------------+ 5 rows in set (0.00 sec) describe tablo_ismi PRIMARY KEY AUTO_INCREMENT 7 8 Tablo detayları Tablo detayları mysql> create table adresler ( no int(5) unsigned not null auto_increment, -> ad varchar(16) not null default '', soyad varchar(16) default null, -> adres text, sehir varchar(25) not null default '', -> yas int(3) unsigned default null, primary key(no)); mysql> CREATE TABLE person ( personID int NOT NULL AUTO_INCREMENT, -> PRIMARY KEY(personID), FirstName varchar(15) not null, -> LastName varchar(15), Age int default null); mysql> describe adresler; +-------+-----------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-----------------+------+-----+---------+----------------+ | no | int(5) unsigned | NO | PRI | NULL | auto_increment | | ad | varchar(16) | NO | | | | | soyad | varchar(16) | YES | | NULL | | | adres | text | YES | | NULL | | | sehir | varchar(25) | NO | | | | | yas | int(3) unsigned | YES | | NULL | | +-------+-----------------+------+-----+---------+----------------+ 6 rows in set (0.00 sec) mysql> describe person; +-----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+----------------+ | personID | int(11) | NO | PRI | NULL | auto_increment | | FirstName | varchar(15) | YES | | NULL | | | LastName | varchar(15) | YES | | NULL | | | Age | int(11) | YES | | NULL | | +-----------+-------------+------+-----+---------+----------------+ 4 rows in set (0.03 sec) 9 Tabloya veri girişi Bu komutla oluşturulan tabloya INSERT girebilirsiniz: 10 Tablodan veri alma INTO komutuyla veri INSERT INTO uyeler (adi, soyadi, uye_no) VALUES ('Mehmet', 'Yılmaz','1234'); MySQL veritabanından bilgi edinmek için SELECT komutunu kullanırız: SELECT * FROM uyeler; Bir tablonun oluşturulması ile içine veri yerleştirilmesi komutları ayrı ayrı zamanlarda, ayrı işlemler olarak yapılabileceği gibi, toplu bir metin halinde, otomatik olarak da yapılabilir. UPDATE kullanicilar SET eposta='yeni_ad@adres.com' WHERE no='1'; Bu, MySQL'e, uyeler adlı tablodaki bütün değerlerin okunmasını bildirir. Buradaki "*" işareti, "bütün sütunlardaki bütün değerler" anlamına gelir. Yukarıda oluşturduğumuz tablonun sadece "adi" ve "soyadi" sütunlarındaki bilgileri almak isteseydik, bu komutu şöyle yazacaktık: SELECT adi, soyadi FROM uyeler; 11 12 2 MySQL Komutları ORDER BY SELECT alan FROM tablo WHERE alan ŞART değer SELECT * FROM Adresler WHERE adres LIKE "%ik%" SELECT * FROM Adresler WHERE adi BETWEEN ‘A’ AND ‘D’ Operatör Şart = Eşittir <> Eşit değil > Büyüktür < Küçüktür >= Büyük yada eşittir <= Küçük yada eşittir (NOT) BETWEEN .. AND .. Belirli değerler arasında LIKE Belirli bir karakter dizisi aranır. SELECT column_name(s) FROM table_name ORDER BY column_name DESC; Buradaki DESC azalan şekilde anlamına gelmektedir. Bu anahtar kelime kullanılmazsa artan sırada bir sıralama gerçekleştirilmektedir. SELECT column_name(s) FROM table_name ORDER BY column_name1, column_name2; 13 14 MySQL Komutları MySQL Komutları Bir veritabanındaki bilgilerin yenileriyle değiştirilmesini, yani veritabanı dosyasının güncelleştirilmesini UPDATE komutu sağlar. Veritabanı dosyalarını güncelleştirme zorunluluğu bulunması ise bize veritabanı tasarımının çok önemli olduğunu gösterir. Örneğin: UPDATE uyeler SET adi = "Elif"; Bu komut, veritabanındaki bütün satırlarda, birinci sütundaki değerleri “Elif" olarak değiştirmekle sonuçlanırdı. Genellikle MySQL'e hangi satırda (veritabanı tekniğindeki terimle söylersek, hangi kayıtlarda) değişiklik yapılacağını daha ayrıntılı söylememiz gerekir. Veritabanını oluştururken, her kaydın diğer kayıtlarda olmayan (unique) bir sütun (alan) bulunmalıdır, ki MySQL'e yapılacak değişikliğin tam yerini söyleyelim. Örneğin SELECT adi, soyadi FROM uyeler WHERE uye_no>=123; deyimi ile tablomuzda bulunan kayıtlardan sadece üye numarası 123'den büyük olanları seçebiliriz. DELETE FROM uyeler WHERE uye_no = 1234; UPDATE uyeler SET adi="Elif" WHERE uye_no= 1234; MySQL bu komutu alınca sadece üye numarası 1234 olan kişinin (yani uye_no alanındaki değer 1234 olan kaydın) "adi" alanındaki değeri silecek ve yerine verdiğimiz yeni değeri yazacaktır. Böyle birincil anahtarı bulunan, iyi düşünülmüş bir veritabanından seçim yapmak da kolay olur. Örneğin: Veritabanında sadece bir kayıtta üye numarası 1234 olacağı için bu komutla sadece bir satır silinecektir. Bu komutu, diyelim ki üyelik kaydını yenilememiş kişilerin tümünü silmek için de kullanabiliriz. Veritabanımızda üyelik kaydının yenilendme tarihini gösteren bir alan bulunduğunu varsayalım: DELETE FROM uyeler WHERE yenileme_tarihi<2000-01-31; Bu komutla, üyeliğini yenileme tarihi 31 Ocak 2000'den eski olan bütün üyelerimizin kaydını veritabanından silmiş oluruz. 15 MySQL Fonksiyonları 16 MySQL Fonksiyonları Açıklama Komut POW(X,Y) Açıklama Komut ABS(X) X’in mutlak değeri PI() Pi sayısı SIGN(X) X’in işaret fonksiyonu değeri LEAST(X,Y,Z) MOD(X,Y) X’in Y ile bölümünde kalan CEILING(X) X’in Y’inci kuvveti X’i aşağıya doğru yuvarlar. Dizinin en küçük değeri GREATEST(X,Y,Z) Dizinin en büyük değeri DEGREES(X) X radyanı dereceye çevirir. FLOOR(X) X’i yukarıya doğru yuvarlar. RADIANS(X) X dereceyi radyana çevirir. ROUND(X) X’i en yakın tamsayıya yuvarlar. RAND(X) X’i rasgele üretir. LN(X) X’in loğal logaritması. ACOS(X) X’in arccosinüsünü hesaplar LOG2(X) X’in 2 tabanına göre logaritması. ASIN(X) X’in arcsinüsünü hesaplar LOG10(X) X’in 10 tabanına göre logaritması. 17 18 3 MySQL Fonksiyonları MySQL Fonksiyonları Komut ATAN(X) Açıklama X’in tanjantını hesaplar ATAN(X,Y) Y/X in tanjantını hesaplar COS(X) X’in cosinüsünü hesaplar SIN(X) X’in sinüsünü hesaplar COT(X) X’in cotanjantını hesaplar TAN(X) X’in tanjantını hesaplar Komut MIN(sütun) Açıklama MAX(sütun) Sütundaki verilerin en büyüğünü seçer. SUM(sütun) Sütundaki değerleri toplar Sütundaki en küçük değeri seçer. AVG(sütun) Sütundaki değerlerin ortalamasını hesaplar COUNT(sütun) Sütundaki veri sayısını verir STDDEV(sütun) Sütundaki verilerin standart sapmasını verir VARIANCE(sütun) Sütundaki verilerin varyansını verir Select 2+2; Select cos(sutun_1) As ortalama From tablo; SELECT COUNT(no_1) AS sayi from tablo; SELECT AVG(no_1) AS ortlama from tablo; SELECT STDDEV (no_1) AS std from tablo; 19 20 MySQL Komutları Tablo Düzenleme ALTER TABLE sayilar ADD COLUMN no_4 smallint; ALTER TABLE sayilar ADD id smallint AFTER sayac; ALTER TABLE sayilar ADD id smallint AFTER sayac, ADD no AFTER isim; ALTER TABLE sayilar DROP COLUMN no; ALTER TABLE sayilar RENAME TO istatistik; ALTER TABLE sayilar CHANGE no no_5 VARCHAR(40); Drop Table sayilar; Create Temporary Table gecici_tablo(id int noy null, isim varchar(35) not null, tel int(12)); Yukarıda gördüğümüz komutları komut istemci satırından tek tek verebileceğimiz gibi, bir düzyazı dosyasında toplayıp, MySQL programına da otomatik olarak yaptırabiliriz. Aşağıdaki metni herhangi bir text editör de yazınız ve veri.dump ismiyle kaydediniz. CREATE TABLE calisanlar ( id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (id), adi VARCHAR(20), soyadi VARCHAR(20), adres VARCHAR(60), pozisyon VARCHAR(60)); INSERT INTO calisanlar VALUES (1, 'Elif', 'Yılmaz', 'PCLife Dergisi, Istanbul', 'Yazar'); INSERT INTO calisanlar VALUES (2, 'Mehmet', 'Akar', 'Yılmaz Kultur Merkezi, Bursa' , 'Yonetmen'); Bu metnin sadece üç satır olmasına, örneğin Notpad'de Düzen menüsünde Sözcük Kaydır (wordrap) maddesinin işaretsiz olmasına dikkat edin. mysqladmin -u ibrahim create veri -p MySQL veri adlı veritabanının oluştuğunu bildirecektir. Şimdi içi boş bir veri dosyamız oldu. Yazdığımız dump dosyasındaki bilgileri veritabanı dosyasına işletmek işini MySQL yapacaktır. Bunu, şu komutla yapabiliriz: mysql –u ibrahim veri < veri.dump –p 21 PHP-MySQL İlişkisi 22 Veritabanına bağlanma PHP programlarımızda veritabanından yararlanabilmek için programın önce Web sunucusu aracılığıyla veritabanı dosyası ile bağlantı kurması gerekir. MySQL açısından ise bu bağlantı, veri sunucusunda yeni bir oturum açılması anlamına gelir. İki program arasındaki ilişkiyi PHP'nin mysql_connect() fonksiyonu yapar. Bu fonksiyonun alabileceği üç parametre vardır: $veri_yolu=mysql_connect("localhost","ibrahim","parola"); Burada "localhost" yerine MySQL programının parçası olarak çalıştığı sunucunun adı yazılır. “ibrahim" bu MySQL sunucusunda açılacak oturumun kimin adına açılacağını belirler. "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. 23 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("localhost", "ibrahim"); if (!$veri_yolu) die ("MySQL ile bağlantı kurulamıyor!); Burada veri sunucusunun bulunduğu Web sunucusunun adının "localhost" olduğuna ve oturumun "ibrahim" yetkileriyle açıldığına dikkat edin. Herkes kendine ait bilgileri kullanacak. İ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. 24 4 Veritabanı seçme Veritabanında sorgulama 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 şekilde 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ı bir araya 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. Veritabanında sorgulama yapmak için mysql_query() fonksiyonu kullanılır: $sorgu="SELECT * FROM person"; $result = mysql_query($sorgu, $veri_yolu ); Gelen verileri $result değişkeninden bir dizi değişkene aktarmak için mysql_result() fonksiyonu kullanılır, mysql_num_rows($result) fonksiyonuyla da sorgu sonucunda kaç satırlık değer geri döndüğünü öğreniriz : for ($i=0; $i< mysql_num_rows($result) ; $i++) { $adi= mysql_result($result, $i, "adi"); $telefon= mysql_result($result, $i, "telefon"); echo "<tr><td>".$adi."</td><td>".$telefon. "</td></tr> <br>"; } 25 Veritabanında sorgulama 26 Veritabanında sorgulama Gelen verileri $result değişkeninden bir dizi değişkene aktarmak için mysql_fetch_array() fonksiyonu kullanılır: $row = mysql_fetch_array($result); $row içerisindeki veriler while($row = mysql_fetch_array($result)) { echo $row['FirstName']." ".$row['LastName']; echo "<br />"; } koduyla alınabilir. Fonksiyon mysql_fetch_array() Açıklama Tablo sütun adlarını sıra numarasına göre okur. mysql_fetch_row() Üstteki komutla aynı görevi üstlenir. mysql_fetch_assoc() Tablo sütun adlarını belirterek verileri listeler. mysql_fetch_object() Tablo veya veritabanı adlarını listeler. mysql_result() Tablo verilerini teker teker listeler 27 Veritabanında sorgulama 28 Veritbanına veri ekleme <?php require("./config/db_config.php"); $connection=@mysql_connect($db_host, $db_user, $db_password) or die("error connecting"); mysql_select_db($db_name, $connection) or die("veritabanı secilemedi"); $row = mysql_fetch_row($result); Sonuçlar satır satır alınmaktadır ve değerler sayısal indisler kullanılarak elde edilmektedir. $row[0], $row[1] ve $row[2] satırdaki değerleri başından itibaren geri döndürmektedir. while($row = mysql_fetch_row($result)) { echo $row[0] . " " . $row[1]. "<br />"; } $query = "SELECT * FROM sayac"; $result = mysql_query($query, $connection) or die(mysql_error()); $views = mysql_result($result, 0, "num_view"); $row = mysql_fetch_object($result); $row bir nesneymiş gibi davranmaktadır ve her bir parçaya nesnenin bir alanına erişildiği gibi erişilir $row->id, $row->adi, vb. $views++; $query = "UPDATE sayac SET num_view = $views"; mysql_query($query, $connection) or die(mysql_error()); while($row = mysql_fetch_object($result)) { echo $row->id . " " . $row->adi . "<br />"; } echo "Bu sayfa $views defa görüldü."; ?> 29 30 5 http Başlıkları Web sayfamızı http protokolünü kullanarak iletiyoruz. http protokolünde web sunucusundan gelen cevabı oluşturan iki ana parça bulunur: başlık(header) ve gövde (body). Web sayfasını tarayıcısında açan bir ziyaretçi http başlıklarını görmez, http gövdesi ise tarayıcıda görünen kısımdır. http başlıkları, tarayıcının ve web sunucusunun çalışmasına yardım eden önemli bilgileri tutarlar. http başlıkları php scriptleri yardımıyla oluşturulabilir ve bu başlıkları kullanarak: 1. 2. 3. Ziyaretçimizin otomatik olarak başka bir sayfaya yönlendirebilir Ziyaretçilerimize cookie ler gönderebilir Tarayıcının web sayfasını cache’lemesini engelleyebiliriz. Html dosyasının üzerinde http başlık cümleleri iletilmesi için header() fonksiyonu kullanılır. header(“Alan: Değer”); Bu yapıda Alan: başlığın görevini temsil eden komut, Değer de komutun görevini yaparken kullanacağı değeri ifade eder. Burada dikkat edilmesi gereken bazı noktalar vardır: http başlıkları bir kez gönderilir ve ardından gelen boş bir satır ile http nin gövdesinden ayrılır. Bu göndermeden sonra web sayfasının ileriki kısımlarında http başlığı eklenemez. Yani kısaca http başlığı gövde kısmına geçilmeden önce tamamen yollanmalıdır. 31 http başlığı hatası 32 http başlığı - geçerli <?php Hatalı http başlığı <HTML> <HEAD> <TITLE>Bu sayfa tarayıcı tarafından cachelenmemeli!</TITLE> </HEAD> <BODY> <?php header ("Cache-Control: no-cache, must-revalidate"); ?> <HTML> <HEAD> <TITLE>Bu sayfa tarayıcı tarafından cachelenmemeli!</TITLE> </HEAD> <BODY> Herkese selamlar. Bu bir web sayfası. </BODY> </HTML> header ("Cache-Control: no-cache, must-revalidate"); ?> Herkese selamlar. Bu bir web sayfası. </BODY> </HTML> 33 setcookie() http başlıkları 34 Otomatik olarak başka bir sayfaya yönlendirme yapmak için: header("Location: http://www.deneme.com"); Dile göre seçim yapmak için <?php header("Cache-Control: no-cache, must-revalidate"); if ( strstr($_SERVER["HTTP_ACCEPT_LANGUAGE"] , "tr") ){ header("Location: turkce.html"); exit(); } if ( strstr($_SERVER["HTTP_ACCEPT_LANGUAGE"] , "en") { header("Location: english.html"); exit(); } /* Dil ne Türkçe ne de İngilizce ise görüntülenecek sayfa */ header("Location: turkce.html"); ?> 35 Web sayfamızın ziyaretçilerine cookie bırakabilmek için kullanılır: setcookie (ad [, değer [, son_kullanma_tarihi [, dizin [, domain [, güvenli]]]]]); ad göndereceğimiz cookie nin adı ve girilmesi zorunludur. Sadece bu argüman kullanılırsa, daha önceden gönderildiyse mevcut olan silinecektir. değer göndermek istediğimiz cookie nin değeridir. son_kullanma_tarihi (expire) cookie nin ömrünü belirleyen argümandır. time()+3600 dizin gönderilen cookie nin web sitesinin hangi dizinlerinde geçerli olacağını göstermektedir. Bu argüman boş ise php sayfasının o anda bulunduğu dizin dikkate alınır. domain cookie nin geçerliliğini sürdüreceği web sitesinin adresidir. Bu değer belirtilmediğinde web sitemizin adresi olacak şekilde ön tanımlıdır. güvenli, bu argüman 1 değerini alırsa cookie https bağlantısı ile iletilecektir. Ön tanımlı olarak 0 değerine sahiptir. $_COOKIE["ad"] ile önceden gönderilmiş olan cookie içerisindeki değer geri alınır. 36 6 Cookie örnek http doğrulaması <?php if ($_COOKIE["sayac"] !=""){ $yeni_sayac = $_COOKIE["sayac"] + 1 ; $gecerli_sure = time() + 7*24*60*60 ; /* Bir hafta geçerli olacak */ setcookie("sayac", $yeni_sayac, $gecerli_sure); echo "Merhaba, sayfamıza $_COOKIE[sayac] kez girdiniz. Yine bekleriz.";} else{ $gecerli_sure = time() + 7*24*60*60 ; /* Bir hafta geçerli olacak */ setcookie("sayac",1, $gecerli_sure); echo "Bu sayfamıza ilk girişiniz! Teşekkür ederiz.";} Bazı sayfaların şifre korumasıyla erişimleri istediğimiz kişilere açık hale getirilmektedir. PHP scriptlerinde http doğrulaması PHP yorumlayıcısı bir APACHE modülü olarak çalışırken kullanılabilir. (PHP web sunucusundan ayrık bir uygulama olarak, yani CGI uygulaması olarak çalışabildiği gibi web sunucusu ile bütünleşik olarak modül şeklinde de çalışır.) ?> 37 38 http doğrulaması http doğrulaması HTTP doğrulamasının hangi adımlarda gerçekleştirildiğini inceleyelim: 1. Web sitemizi ziyaret eden kişi o sayfayı web sunucumuzdan ister. 2. HTTP doğrulaması uygulamalarında web sunucu istenen dosyanın korumalı bor alanda olup olmadığını kontrol eder. 3. İstenilen bir dosya korumalı alana giriyorsa 401 yetkisiz kullanıcı mesajını http başlığında iletir. 4. Tarayıcı bu mesajı alır ve dosyaya erişim için kullanıcı adı ve şifresinin girilmesi gerektiğini anlar ve kullanıcıya ilgili kullanıcı adı/şifre penceresini gösterir. 5. Kullanıcı adı ve şifresi bu pencereye girilir. Bu bilgi tekrar web sunucusuna gönderilir. 6. Geçerli kullanıcı adı ve şifresi alındığında istenilen sayfa kullanıcıya gönderilir. 7. Eğer kullanıcı adı ve şifre geçerli değilse tekrar giriş sayfası, geçerli veriler girilinceye kadar görüntülenir. PHP scripti, gerekli http başlıklarını gönderdiği taktirde http doğrulama işlemini taklit edebilir. PHP, kullanıcının ekranda görüntülenecek olan kullanıcı adı/şifre penceresine girilecek değerleri sırasıyla $_SERVER süper globalindeki PHP_AUTH_USER ve PHP_AUTH_PW anahtarlarında saklar. Bu değişken ve anahtarları kullanarak biz de PHP scriptlerimiz içerisinden http doğrulaması işlemlerini yürütebiliriz. if (isset($_SERVER["PHP_AUTH_USER"]) ){ header("WWW-Authenticate: Basic realm=\"$bolge_adi\""); header("HTTP/1.0 401 Unauthorized"); echo "Bu sayfaya erişebilmeniz için yetkili bir kullanıcı olmanız gerekir."; exit();} else{ if ( ($_SERVER["PHP_AUTH_USER"] != $kullanici_adi) || ($_SERVER["PHP_AUTH_PW"] != $sifre) ){ header("WWW-Authenticate: Basic realm=\"$bolge_adi\""); header("HTTP/1.0 401 Unauthorized"); echo "Bu sayfaya erişebilmeniz için yetkili bir kullanıcı olmanız gerekir."; exit();} } gizlisayfa.php 39 Rasgele Resim Gösterme PHP ile Dinamik Grafik 40 <?php /* Grafik dosyasının tarayıcıya yansıtılması */ header(“Content-type: image/gif”); readfile(“logo.gif”); ?> Header() fonksiyonu tarayıcıya göndereceğimiz dosyanın bir gif dosyası olduğunu anlatmaktadır. Readfile() fonksiyonuyla gif dosyasını bir binary dosyası olarak okuyor ve aynı zamanda okuduğu bilgileri tarayıcıya yansıtıyoruz. <html> <head><title>PHP ile Grafik Görüntülenmesi<title><head> <body> PHP Logosu: <br><br> <img src=“logo.php” alt=“PHP”> </body> </html> 41 <?php /* Rasgele bir grafik dosyasını gösterecek olan php scripti */ $dosya[ ]=“logo.gif”; $dosya[ ]=“mysql.gif”; $dosya[ ]=“apache.gif”; $dosya[ ]=“eposta.gif”; $dosya[ ]=“sirket.gif”; srand((double) microtime()*1000000); $deger = rand(0, count($dosya-1)); header(“Content-type: image/gif”); readfile($dosya[$deger]); ?> Kodu yardımıyla her açılışta bu önceki sayfadaki img takısı içersinden çağrıldığında farklı resimler görüntüleyecektir. 42 7