PHP ve MySQL

advertisement
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='[email protected]' 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
Download