You are on page 1of 7

MySQLe Giri

PHP ve MySQL
Burada sadece MySQL program ile veritaban
oluturmakla kalmayalm, bir anlamda SQL
Ders 6 diline de ok ksa bir giri yapalm.
SQL, (Structured Query Language, Yapsal
Sorgu Dili) veritaban endstrisinin standart
dilidir.
1 2

MySQL veritabanna eriim


Kullanmakta olduumuz sunucuda bulunan veritabanna erimek iin shh konsolunu
kullanacaz.
Buradaki konsol penceresine
HTML konusunda farkl firmalarn sadece kendi Browserlarnn tand > mysql u kullanc p
trden etiketler gelitirmeleri gibi, SQL alannda da farkl firmalarn ekleri ve Komutu yardmyla sunucuya erieceiz. Buradaki kullanc ifresi size verilecek
dilde yaptklar deiiklikler vardr. ifrenizi deitirmek iin
mysql> set password=password("ifre");
MySQL, teknik tabiriyle sunucuda deamon olarak alr ve arzu eden
programa, bildirecei (ve eriim hakk bulunan) veritaban dosyasndan veri
ekerek, sunar.
Bir veritaban dosyasnda yer alan tablolarda, stunlar ve satrlar vardr:
bunlarn kesitikleri yerlere biz verilerimizi yazarz.
Bir SQL veritaban dosyasnda her bir kutunun ne tr veri kabul edecei
nceden belirlenir; dolaysyla tr say olan verinin yazlaca kutuya,
alfanmerik deer yazlmaz.
MySQL, saysal verilerin trn INT, belirli bir snra kadar deien sayda
karakterden oluacak verilerin trn VARCHAR komutuyla belirler.

3 4

MySQL veri trleri


Veritaban seimi
MySQL'de bir ok veri tr oluturulabilir. Ancak Web programlar
asndan nemli olan bir ka ve zellikleri yle sralanabilir:
Veritabannda tablo oluturmak veya kullanmak iin ncelikle kullanacanz INT Tamsay deerler alr: -2147483648'den 2147483647 kadar
veritabann semelisiniz.
Hali hazrdaki veri tabanlarn grmek iin
deien diziye "signed (iaretli), 0'dan 4294967295'e kadar
deienine "unsigned" (iaretsiz) denir.
show databases;
Veritabann semek iinde VARCHAR(n) n saysn gememek artyla deien boyutta
use veritaban_ismi; karakter olabilir.
Komutlar kullanlr. CHAR(n) Kesinlikle n says kadar karakter olabilir.
status komut ile veritaban durumu hakknda bilgi edinebiliriz. TEXT En fazla 65535(2^16-1) karakter alabilen metin alan.
Buradaki her altrlabilir ifade ; , \g veya \G ifadelerinden birisiyle
sonlandrlmaldr. Baz tek bana alabilen komutlarn sonlandrlmas MEDIUMTEXT En fazla 16777215(2^24-1) karakter alabilen
gerekmemektedir. metin alan.
Veri taban ierisindeki tablolar grmek iin DATE 1000-01-01'den 9999-12-31'e kadar deiebilen tarih alan.
show tables;
komutu kullanlr.
TIMESTAMP 1 Ocak 1970'den 18 Ocak 2038'e kadar olan ve
Yl+Ay+Gn+Saat+Dakika+Saniye biimindeki zaman bilgisi.

5 6

1
Tablo oluturma Tablo detaylar
CREATE TABLE uyeler ( adi VARCHAR(30),
soyadi VARCHAR(30), mysql> CREATE TABLE ziyaretciDefteri (autoID int(10) unsigned not null
uye_no INT ) ; -> auto_increament primary key, name varchar(64), email varchar(64),
Bu komutla, "uyeler" isimli stunlu bir tablo oluturulur: birinci ve ikinci -> comment text, date_auto int unsigned);
stunlarda en fazla 30, karakterlik deien boyutta alfanmerik deerler yer alrken,
nc stunda sadece tam say olan deerler bulunabilir.
Oluturulmu tablo bilgileri
mysql> describe ziyaretciDefteri;
describe tablo_ismi +-----------+------------------+------+-----+---------+----------------+
ile grntlenir. | Field | Type | Null | Key | Default | Extra |
Tablo oluturulurken bir tane PRIMARY KEY, birincil anahtar tanmlanr. +-----------+------------------+------+-----+---------+----------------+
PRIMARY KEY | autoID | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(64) | YES | | NULL | |
Baz deerlerin otomatik olarak atanmas istenebilir, bunun iin | email | varchar(64) | YES | | NULL | |
AUTO_INCREMENT | comment | text | YES | | NULL | |
zellikleri tablo oluturulurken atanr. | date_auto | int(10) unsigned | YES | | NULL | |
Tabloya veri girii srasnda bo braklan yerlere varsaylan deerlerin atanmas +-----------+------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
istenebilir. Bu durumda DEFAULT anahtar kelimesi kullanlr.

7 8

Tablo detaylar Tablo detaylar


mysql> create table adresler ( no int(5) unsigned not null auto_increment,
mysql> CREATE TABLE person ( personID int NOT NULL AUTO_INCREMENT, -> ad varchar(16) not null default '', soyad varchar(16) default null,
-> adres text, sehir varchar(25) not null default '',
-> PRIMARY KEY(personID), FirstName varchar(15) not null,
-> yas int(3) unsigned default null, primary key(no));
-> LastName varchar(15), Age int default null);

mysql> describe adresler;


mysql> describe person; +-------+-----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
+-------+-----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra | | no | int(5) unsigned | NO | PRI | NULL | auto_increment |
+-----------+-------------+------+-----+---------+----------------+ | ad | varchar(16) | NO | | | |
| personID | int(11) | NO | PRI | NULL | auto_increment | | soyad | varchar(16) | YES | | NULL | |
| FirstName | varchar(15) | YES | | NULL | | | adres | text | YES | | NULL | |
| sehir | varchar(25) | NO | | | |
| LastName | varchar(15) | YES | | NULL | |
| yas | int(3) unsigned | YES | | NULL | |
| Age | int(11) | YES | | NULL | | +-------+-----------------+------+-----+---------+----------------+
+-----------+-------------+------+-----+---------+----------------+ 6 rows in set (0.00 sec)
4 rows in set (0.03 sec)

9 10

Tabloya veri girii Tablodan veri alma


Bu komutla oluturulan tabloya INSERT INTO komutuyla veri MySQL veritabanndan bilgi edinmek iin SELECT komutunu
girebilirsiniz: kullanrz:
INSERT INTO uyeler (adi, soyadi, uye_no) SELECT * FROM uyeler;
VALUES ('Mehmet', 'Ylmaz','1234');
Bu, MySQL'e, uyeler adl tablodaki btn deerlerin okunmasn
Bir tablonun oluturulmas ile iine veri yerletirilmesi komutlar ayr ayr
zamanlarda, ayr ilemler olarak yaplabilecei gibi, toplu bir metin halinde, bildirir. Buradaki "*" iareti, "btn stunlardaki btn deerler"
otomatik olarak da yaplabilir. anlamna gelir.
Yukarda oluturduumuz tablonun sadece "adi" ve "soyadi"
UPDATE kullanicilar SET stunlarndaki bilgileri almak isteseydik, bu komutu yle
eposta='yeni_ad@adres.com' WHERE no='1'; yazacaktk:
SELECT adi, soyadi FROM uyeler;

11 12

2
MySQL Komutlar
ORDER BY
SELECT alan FROM tablo WHERE alan ART deer
SELECT * FROM Adresler WHERE adres LIKE "%ik%" SELECT column_name(s) FROM table_name
SELECT * FROM Adresler WHERE adi BETWEEN A AND D ORDER BY column_name DESC;
Operatr art Buradaki DESC azalan ekilde anlamna
= Eittir gelmektedir.
<> Eit deil Bu anahtar kelime kullanlmazsa artan srada bir
> Byktr
sralama gerekletirilmektedir.
< Kktr
SELECT column_name(s) FROM table_name
>= Byk yada eittir
ORDER BY column_name1, column_name2;
<= Kk yada eittir
(NOT) BETWEEN .. AND .. Belirli deerler arasnda
LIKE Belirli bir karakter dizisi aranr.
13 14

MySQL Komutlar MySQL Komutlar


Bir veritabanndaki bilgilerin yenileriyle deitirilmesini, yani veritaban dosyasnn Byle birincil anahtar bulunan, iyi dnlm bir veritabanndan seim
gncelletirilmesini UPDATE komutu salar. yapmak da kolay olur. rnein:
Veritaban dosyalarn gncelletirme zorunluluu bulunmas ise bize veritaban SELECT adi, soyadi FROM uyeler WHERE uye_no>=123;
tasarmnn ok nemli olduunu gsterir. rnein:
deyimi ile tablomuzda bulunan kaytlardan sadece ye numaras 123'den
UPDATE uyeler SET adi = "Elif"; byk olanlar seebiliriz.
Bu komut, veritabanndaki btn satrlarda, birinci stundaki deerleri Elif" olarak
deitirmekle sonulanrd.
DELETE FROM uyeler WHERE uye_no = 1234;
Genellikle MySQL'e hangi satrda (veritaban tekniindeki terimle sylersek,
hangi kaytlarda) deiiklik yaplacan daha ayrntl sylememiz gerekir. Veritabannda sadece bir kaytta ye numaras 1234 olaca iin bu komutla
sadece bir satr silinecektir.
Veritabann olutururken, her kaydn dier kaytlarda olmayan (unique) bir stun
(alan) bulunmaldr, ki MySQL'e yaplacak deiikliin tam yerini syleyelim. Bu komutu, diyelim ki yelik kaydn yenilememi kiilerin tmn silmek iin de
rnein kullanabiliriz. Veritabanmzda yelik kaydnn yenilendme tarihini gsteren bir
alan bulunduunu varsayalm:
UPDATE uyeler SET adi="Elif" WHERE uye_no= 1234;
DELETE FROM uyeler WHERE yenileme_tarihi<2000-01-31;
MySQL bu komutu alnca sadece ye numaras 1234 olan kiinin (yani uye_no
alanndaki deer 1234 olan kaydn) "adi" alanndaki deeri silecek ve yerine Bu komutla, yeliini yenileme tarihi 31 Ocak 2000'den eski olan btn
verdiimiz yeni deeri yazacaktr. yelerimizin kaydn veritabanndan silmi oluruz.

15 16

MySQL Fonksiyonlar MySQL Fonksiyonlar


Komut Aklama
Komut Aklama POW(X,Y) Xin Yinci kuvveti
ABS(X) Xin mutlak deeri PI() Pi says
SIGN(X) Xin iaret fonksiyonu deeri LEAST(X,Y,Z) Dizinin en kk deeri
MOD(X,Y) Xin Y ile blmnde kalan GREATEST(X,Y,Z) Dizinin en byk deeri
CEILING(X) Xi aaya doru yuvarlar. DEGREES(X) X radyan dereceye evirir.
FLOOR(X) Xi yukarya doru yuvarlar. RADIANS(X) X dereceyi radyana evirir.
ROUND(X) Xi en yakn tamsayya yuvarlar. RAND(X) Xi rasgele retir.
LN(X) Xin loal logaritmas. ACOS(X) Xin arccosinsn hesaplar
LOG2(X) Xin 2 tabanna gre logaritmas. ASIN(X) Xin arcsinsn hesaplar
LOG10(X) Xin 10 tabanna gre logaritmas.
17 18

3
MySQL Fonksiyonlar
MySQL Fonksiyonlar
Komut Aklama
MIN(stun) Stundaki en kk deeri seer.
Komut Aklama MAX(stun) Stundaki verilerin en byn seer.
ATAN(X) Xin tanjantn hesaplar SUM(stun) Stundaki deerleri toplar
ATAN(X,Y) Y/X in tanjantn hesaplar AVG(stun) Stundaki deerlerin ortalamasn hesaplar
COS(X) Xin cosinsn hesaplar COUNT(stun) Stundaki veri saysn verir
SIN(X) Xin sinsn hesaplar STDDEV(stun) Stundaki verilerin standart sapmasn verir
COT(X) Xin cotanjantn hesaplar VARIANCE(stun) Stundaki verilerin varyansn verir
TAN(X) Xin tanjantn hesaplar
SELECT COUNT(no_1) AS sayi from tablo;
Select 2+2; SELECT AVG(no_1) AS ortlama from tablo;
Select cos(sutun_1) As ortalama From tablo; SELECT STDDEV (no_1) AS std from tablo;

19 20

Tablo Dzenleme MySQL Komutlar


Yukarda grdmz komutlar komut istemci satrndan tek tek
verebileceimiz gibi, bir dzyaz dosyasnda toplayp, MySQL programna da
ALTER TABLE sayilar ADD COLUMN no_4 smallint; otomatik olarak yaptrabiliriz.
Aadaki metni herhangi bir text editr de yaznz ve veri.dump ismiyle
ALTER TABLE sayilar ADD id smallint AFTER sayac; kaydediniz.
ALTER TABLE sayilar ADD id smallint AFTER sayac, CREATE TABLE calisanlar ( id INT NOT NULL AUTO_INCREMENT,
ADD no AFTER isim; PRIMARY KEY (id), adi VARCHAR(20), soyadi VARCHAR(20), adres
VARCHAR(60), pozisyon VARCHAR(60)); INSERT INTO calisanlar VALUES
ALTER TABLE sayilar DROP COLUMN no; (1, 'Elif', 'Ylmaz', 'PCLife Dergisi, Istanbul', 'Yazar'); INSERT INTO calisanlar
ALTER TABLE sayilar RENAME TO istatistik; VALUES (2, 'Mehmet', 'Akar', 'Ylmaz Kultur Merkezi, Bursa' , 'Yonetmen');
ALTER TABLE sayilar CHANGE no no_5 VARCHAR(40); Bu metnin sadece satr olmasna, rnein Notpad'de Dzen mensnde
Szck Kaydr (wordrap) maddesinin iaretsiz olmasna dikkat edin.
Drop Table sayilar; mysqladmin -u ibrahim create veri -p
Create Temporary Table gecici_tablo(id int noy MySQL veri adl veritabannn olutuunu bildirecektir. imdi ii bo bir veri
null, isim varchar(35) not null, tel int(12)); dosyamz oldu.
Yazdmz dump dosyasndaki bilgileri veritaban dosyasna iletmek iini
MySQL yapacaktr. Bunu, u komutla yapabiliriz:
mysql u ibrahim veri < veri.dump p
21 22

PHP-MySQL likisi Veritabanna balanma


PHP programlarmzda veritabanndan yararlanabilmek iin programn nce
Web sunucusu araclyla veritaban dosyas ile balant kurmas gerekir. Veri sunucusu ile veri yolu balants kurulursa, bu deiken deer tutar
MySQL asndan ise bu balant, veri sunucusunda yeni bir oturum almas hale gelir; balant kurulamazsa bu deiken bo kalr.
anlamna gelir. ki program arasndaki ilikiyi PHP'nin mysql_connect() mysql_connect() fonksiyonunun baarl olup olmadn bu
fonksiyonu yapar. Bu fonksiyonun alabilecei parametre vardr: deikenin durumunu snayarak anlayabiliriz. rnein:
$veri_yolu=mysql_connect("localhost","ibrahim","parola"); $veri_yolu = mysql_connect("localhost", "ibrahim");
Burada "localhost" yerine MySQL programnn paras olarak alt if (!$veri_yolu) die ("MySQL ile balant kurulamyor!);
sunucunun ad yazlr. ibrahim" bu MySQL sunucusunda alacak oturumun Burada veri sunucusunun bulunduu Web sunucusunun adnn
kimin adna alacan belirler. "parola" kelimesinin yerine de MySQL'i "localhost" olduuna ve oturumun "ibrahim" yetkileriyle aldna
kurarken belirlediimiz bir kullanc parolas varsa, onu yazarz. dikkat edin. Herkes kendine ait bilgileri kullanacak.
Bu komutta yer alan $veri_yolu deikeni, alacak veri yolunun, PHP ile kinci satrdaki if deyimi, $veri_yolu deikeninin deer ierip
MySQL veritaban sunucusu arasndaki ban tantc iareti olacaktr. Bu iermediine bakyor ve deikende bir deer yoksa, balant kurma giriini
balant kurulduktan sonra, atmz veri yolundan gelecek bilgiler ve durdurarak, ziyaretiye hata mesaj gnderiyor.
veritabanna gidecek bilgiler bu deiken araclyla gerekleecektir.

23 24

4
Veritaban seme Veritabannda sorgulama
Balant baaryla kurulduktan sonra PHP program, bu yoldan, veritaban
sunucusuna, hangi veritaban dosyasndan yararlanmak istediini bildirmelidir. Veritabannda sorgulama yapmak iin mysql_query() fonksiyonu kullanlr:
Buna veritaban dosyas seme ilemi denir ve mysql_select_db() fonksiyonu
ile yaplr: $sorgu="SELECT * FROM person";
mysql_select_db( "veritabann_ad", $veri_yolu ) $result = mysql_query($sorgu, $veri_yolu );
or die ("Veritaban alamyor!".mysql_error() ); Gelen verileri $result deikeninden bir dizi deikene aktarmak iin
mysql_result() fonksiyonu kullanlr,
Bu fonksiyonun baaryla icra edilip edilmedii fonksiyondan dnen deerin
true/doru veya false/yanl olmasndan anlarz. mysql_num_rows($result) fonksiyonuyla da sorgu sonucunda ka satrlk
Bu deer false ise bu deyimin die() blm icra edilecek ve Browser penceresine deer geri dndn reniriz :
veritabannn alamad mesajyla birlikte MySQL'in hata mesaj da gnderilecektir. for ($i=0; $i< mysql_num_rows($result) ; $i++) {
PHP'nin MySQL veritabann seememesi ou zaman kullanc yetkilerinin Internet $adi= mysql_result($result, $i, "adi");
ziyaretilerini kapsayacak ekilde dzenlenmemi olmasndan kaynaklanr. $telefon= mysql_result($result, $i, "telefon");
Bu durum gerek Web sunucusunda ortaya karsa, Web sunucusu ynetimine
bavurmak gerekir. echo "<tr><td>".$adi."</td><td>".$telefon.
imdi bu anlattklarmz bir araya getiren kolay bir PHP programyla biraz nce "</td></tr> <br>";
oluturduumuz "veri" adl veritabanndan bir birinci kiiye ait verileri "okutarak, HTML }
sayfamzda kullanalm.

25 26

Veritabannda sorgulama Veritabannda sorgulama


Gelen verileri $result deikeninden bir dizi deikene aktarmak Fonksiyon Aklama
iin mysql_fetch_array() fonksiyonu kullanlr:
mysql_fetch_array() Tablo stun adlarn sra
$row = mysql_fetch_array($result);
numarasna gre okur.
$row ierisindeki veriler
while($row = mysql_fetch_array($result)) { mysql_fetch_row() stteki komutla ayn grevi
echo $row['FirstName']." ".$row['LastName']; stlenir.
echo "<br />"; mysql_fetch_assoc() Tablo stun adlarn belirterek
} verileri listeler.
koduyla alnabilir. mysql_fetch_object() Tablo veya veritaban adlarn
listeler.
mysql_result() Tablo verilerini teker teker
listeler

27 28

Veritabannda sorgulama Veritbanna veri ekleme


<?php
$row = mysql_fetch_row($result); require("./config/db_config.php");
Sonular satr satr alnmaktadr ve deerler saysal indisler $connection=@mysql_connect($db_host, $db_user, $db_password)
or die("error connecting");
kullanlarak elde edilmektedir. $row[0], $row[1] ve $row[2] mysql_select_db($db_name, $connection)
satrdaki deerleri bandan itibaren geri dndrmektedir. or die("veritaban secilemedi");
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 davranmaktadr ve her bir paraya nesnenin $views++;
bir alanna eriildii gibi eriilir $row->id, $row->adi, vb.
$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 grld.";
}
?>

29 30

5
http Balklar
Web sayfamz http protokoln kullanarak iletiyoruz. Html dosyasnn zerinde http balk cmleleri iletilmesi iin
http protokolnde web sunucusundan gelen cevab oluturan iki ana header() fonksiyonu kullanlr.
para bulunur: balk(header) ve gvde (body). header(Alan: Deer);
Web sayfasn taraycsnda aan bir ziyareti http balklarn Bu yapda Alan: baln grevini temsil eden komut, Deer de
grmez, http gvdesi ise taraycda grnen ksmdr. komutun grevini yaparken kullanaca deeri ifade eder.
http balklar, taraycnn ve web sunucusunun almasna yardm Burada dikkat edilmesi gereken baz noktalar vardr:
eden nemli bilgileri tutarlar. http balklar bir kez gnderilir ve ardndan gelen bo bir satr ile
http balklar php scriptleri yardmyla oluturulabilir ve bu balklar http nin gvdesinden ayrlr.
kullanarak: Bu gndermeden sonra web sayfasnn ileriki ksmlarnda http
1. Ziyaretimizin otomatik olarak baka bir sayfaya ynlendirebilir bal eklenemez.
2. Ziyaretilerimize cookie ler gnderebilir Yani ksaca http bal gvde ksmna geilmeden nce tamamen
3. Taraycnn web sayfasn cachelemesini engelleyebiliriz. yollanmaldr.

31 32

http bal hatas http bal - geerli


Hatal http bal <?php

<HTML> header ("Cache-Control: no-cache, must-revalidate");


<HEAD>
<TITLE>Bu sayfa tarayc tarafndan cachelenmemeli!</TITLE>
</HEAD>
?>
<BODY> <HTML>
<?php <HEAD>
<TITLE>Bu sayfa tarayc tarafndan
header ("Cache-Control: no-cache, must-revalidate"); cachelenmemeli!</TITLE>
</HEAD>
?> <BODY>
Herkese selamlar. Bu bir web sayfas. Herkese selamlar. Bu bir web sayfas.
</BODY> </BODY>
</HTML>
</HTML>

33 34

http balklar setcookie()


Otomatik olarak baka bir sayfaya ynlendirme yapmak iin: Web sayfamzn ziyaretilerine cookie brakabilmek iin kullanlr:
header("Location: http://www.deneme.com");
setcookie (ad [, deer [, son_kullanma_tarihi
Dile gre seim yapmak iin
[, dizin [, domain [, gvenli]]]]]);
<?php ad gndereceimiz cookie nin ad ve girilmesi zorunludur. Sadece bu
header("Cache-Control: no-cache, must-revalidate"); argman kullanlrsa, daha nceden gnderildiyse mevcut olan silinecektir.
deer gndermek istediimiz cookie nin deeridir.
if ( strstr($_SERVER["HTTP_ACCEPT_LANGUAGE"] , "tr") ){ son_kullanma_tarihi (expire) cookie nin mrn belirleyen
header("Location: turkce.html"); argmandr. time()+3600
exit();
dizin gnderilen cookie nin web sitesinin hangi dizinlerinde geerli
}
olacan gstermektedir. Bu argman bo ise php sayfasnn o anda
if ( strstr($_SERVER["HTTP_ACCEPT_LANGUAGE"] , "en") {
bulunduu dizin dikkate alnr.
header("Location: english.html"); domain cookie nin geerliliini srdrecei web sitesinin adresidir. Bu
exit(); deer belirtilmediinde web sitemizin adresi olacak ekilde n tanmldr.
} gvenli, bu argman 1 deerini alrsa cookie https balants ile
iletilecektir. n tanml olarak 0 deerine sahiptir.
/* Dil ne Trke ne de ngilizce ise grntlenecek sayfa */ $_COOKIE["ad"] ile nceden gnderilmi olan cookie ierisindeki deer
header("Location: turkce.html"); geri alnr.
?> 35 36

6
Cookie rnek http dorulamas
<?php
Baz sayfalarn ifre korumasyla
if ($_COOKIE["sayac"] !=""){
$yeni_sayac = $_COOKIE["sayac"] + 1 ; eriimleri istediimiz kiilere ak
$gecerli_sure = time() + 7*24*60*60 ; hale getirilmektedir.
/* Bir hafta geerli olacak */ PHP scriptlerinde http
setcookie("sayac", $yeni_sayac, $gecerli_sure);
dorulamas PHP yorumlaycs
echo "Merhaba, sayfamza $_COOKIE[sayac] kez girdiniz. bir APACHE modl olarak
Yine bekleriz.";} alrken kullanlabilir. (PHP web
else{ sunucusundan ayrk bir uygulama
$gecerli_sure = time() + 7*24*60*60 ;
/* Bir hafta geerli olacak */
olarak, yani CGI uygulamas
olarak alabildii gibi web
setcookie("sayac",1, $gecerli_sure); sunucusu ile btnleik olarak
echo "Bu sayfamza ilk giriiniz! Teekkr ederiz.";} modl eklinde de alr.)
?>
37 38

http dorulamas
http dorulamas PHP scripti, gerekli http balklarn gnderdii taktirde http dorulama ilemini
taklit edebilir.
HTTP dorulamasnn hangi admlarda gerekletirildiini inceleyelim: PHP, kullancnn ekranda grntlenecek olan kullanc ad/ifre penceresine
girilecek deerleri srasyla $_SERVER sper globalindeki PHP_AUTH_USER ve
1. Web sitemizi ziyaret eden kii o sayfay web sunucumuzdan ister. PHP_AUTH_PW anahtarlarnda saklar.
2. HTTP dorulamas uygulamalarnda web sunucu istenen dosyann Bu deiken ve anahtarlar kullanarak biz de PHP scriptlerimiz ierisinden http
korumal bor alanda olup olmadn kontrol eder. dorulamas ilemlerini yrtebiliriz.
3. stenilen bir dosya korumal alana giriyorsa 401 yetkisiz kullanc
mesajn http balnda iletir. if (isset($_SERVER["PHP_AUTH_USER"]) ){
header("WWW-Authenticate: Basic realm=\"$bolge_adi\"");
4. Tarayc bu mesaj alr ve dosyaya eriim iin kullanc ad ve
header("HTTP/1.0 401 Unauthorized");
ifresinin girilmesi gerektiini anlar ve kullancya ilgili kullanc echo "Bu sayfaya eriebilmeniz iin yetkili bir kullanc
ad/ifre penceresini gsterir. olmanz gerekir.";
5. Kullanc ad ve ifresi bu pencereye girilir. Bu bilgi tekrar web exit();}
sunucusuna gnderilir. else{
6. Geerli kullanc ad ve ifresi alndnda istenilen sayfa kullancya if ( ($_SERVER["PHP_AUTH_USER"] != $kullanici_adi) ||
gnderilir. ($_SERVER["PHP_AUTH_PW"] != $sifre) ){
header("WWW-Authenticate: Basic realm=\"$bolge_adi\"");
7. Eer kullanc ad ve ifre geerli deilse tekrar giri sayfas, geerli
header("HTTP/1.0 401 Unauthorized");
veriler girilinceye kadar grntlenir. echo "Bu sayfaya eriebilmeniz iin yetkili bir kullanc
olmanz gerekir.";
exit();}
39 } gizlisayfa.php 40

PHP ile Dinamik Grafik Rasgele Resim Gsterme


<?php
<?php /* Rasgele bir grafik dosyasn
/* Grafik dosyasnn taraycya yanstlmas */ gsterecek olan php scripti */
header(Content-type: image/gif); $dosya[ ]=logo.gif;
readfile(logo.gif); $dosya[ ]=mysql.gif;
?> $dosya[ ]=apache.gif;
Header() fonksiyonu taraycya gndereceimiz dosyann bir gif dosyas $dosya[ ]=eposta.gif;
olduunu anlatmaktadr.
Readfile() fonksiyonuyla gif dosyasn bir binary dosyas olarak okuyor ve ayn $dosya[ ]=sirket.gif;
zamanda okuduu bilgileri taraycya yanstyoruz. srand((double) microtime()*1000000);
<html> $deger = rand(0, count($dosya-1));
<head><title>PHP ile Grafik Grntlenmesi<title><head> header(Content-type: image/gif);
<body> readfile($dosya[$deger]);
PHP Logosu: <br><br>
?>
<img src=logo.php alt=PHP>
</body> Kodu yardmyla her alta bu nceki sayfadaki img
</html> taks iersinden arldnda farkl resimler
grntleyecektir.
41 42

You might also like