PHP
�ns�z................................................................................................................................................................... 4
PHP Deste�i veren sitelerle ilgili not:............................................................................................................. 5
PHP'ye Giri�........................................................................................................................................................ 6
PHP ve Veritaban�............................................................................................................................................. 8
PHP ve Web Sunucusu.................................................................................................................................... 9
Unix/Linux Sistemleri......................................................................................................................................... 9
Linux'ta program derlediniz mi?...................................................................................................................... 9
G�venli socket ve Internet Eri�imi Katman�.................................................................................................. 12
Windows-PWS ve IIS......................................................................................................................................... 14
IIS 4.0 ve 5.0.......................................................................................................................................................... 14
Browser Yetenek Dosyas�: Browscap.ini...................................................................................................... 14
PWS 4.0................................................................................................................................................................. 15
Windows'da Apache!......................................................................................................................................... 16
Windows'da MySQL........................................................................................................................................... 16
PHP'nin Yap� Ta�lar�......................................................................................................................................... 21
PHP program�n� durdurmak........................................................................................................................... 21
De�i�kenler........................................................................................................................................................ 21
Veri T�rleri.......................................................................................................................................................... 23
T�r De�i�tirme.................................................................................................................................................... 23
Fonksiyon............................................................................................................................................................ 23
Escape................................................................................................................................................................. 25
D�rt yararl� fonksiyon....................................................................................................................................... 29
��lemciler (Operat�rler)................................................................................................................................... 30
Bir Artt�rmak veya Azaltmak i�in....................................................................................................................... 32
Sabit De�erler.................................................................................................................................................... 34
Tarih ve saat Verisi........................................................................................................................................... 35
PHP'de Program Denetimi.............................................................................................................................. 37
if Deyimi............................................................................................................................................................... 37
switch deyimi..................................................................................................................................................... 38
switch i�in k�sa yol............................................................................................................................................. 39
D�ng�ler.............................................................................................................................................................. 40
while d�ng�s�.................................................................................................................................................... 40
do..while............................................................................................................................................................... 41
for d�ng�s�......................................................................................................................................................... 42
foreach................................................................................................................................................................ 42
D�ng�y� sona erdirmek i�in: break............................................................................................................... 42
D�ng�y� s�rd�rmek i�in: continue................................................................................................................. 43
Fonksiyonlar....................................................................................................................................................... 44
Fonksiyon Tan�mlama ve �a��rma................................................................................................................ 44
Fonksiyona varsay�lan de�er verebiliriz...................................................................................................... 48
De�i�kenlerin kapsam�: global ve static..................................................................................................... 50
Dizi-De�i�kenler, Nesneler............................................................................................................................. 53
Dizi De�i�kenler................................................................................................................................................. 53
Dizi De�i�ken Olu�tural�m............................................................................................................................... 53
Dizi de�i�kenleri kullanal�m............................................................................................................................ 56
Dizi De�i�kenlerin D�zenlenmesi.................................................................................................................. 59
Dizileri birle�tirme: array_merge().................................................................................................................. 59
Dizilere de�i�ken ekleme: array_push()....................................................................................................... 60
Dizinin ilk eleman�n� silme: array_shift()....................................................................................................... 60
Diziden kesit alma: array_slice()..................................................................................................................... 60
Dizileri s�ralama: sort() ve rsort()..................................................................................................................... 60
�li�kili dizileri s�ralama: asort() ve ksort()....................................................................................................... 61
Nesneler.............................................................................................................................................................. 61
Bir Nesne Olu�tural�m...................................................................................................................................... 61
PHP ��ba��nda.................................................................................................................................................... 64
Formlar ............................................................................................................................................................... 64
Form'dan GET Metoduyla Gelen Bilgiler....................................................................................................... 65
URL Kodlar�......................................................................................................................................................... 68
Form'dan POST Metoduyla Gelen Bilgiler.................................................................................................... 71
Form ile i�lemciyi Birle�tirelim...................................................................................................................... 72
Dosya "��kartma"............................................................................................................................................. 74
Dosya ��lemleri.................................................................................................................................................. 75
Harici Dosya (include)...................................................................................................................................... 76
include mu, require m�?................................................................................................................................... 77
Dosyalar hakk�nda bilgi................................................................................................................................... 78
Dosya var m�? file_exits()................................................................................................................................. 78
Dosya m�, dizin mi? is_file() ve is_dir().......................................................................................................... 78
Dosya okunabilir mi? is_readable()............................................................................................................... 78
Dosya yaz�labilir mi? is_writable().................................................................................................................. 78
Dosya �al��t�r�labilir mi? is_executable()...................................................................................................... 78
Dosya boyutu: filesize()..................................................................................................................................... 79
Dosyaya son eri�im tarihi: fileadate(), filemtime() ve filectime()............................................................... 79
Dosyalar olu�turma ve silme......................................................................................................................... 79
Dosya a�ma........................................................................................................................................................ 80
Bir Fonksiyonu durdurmak i�in: �l!............................................................................................................... 80
Dosya okuma: fgets(), fread() ve fgetc()...................................................................................................... 81
fseek() ile �l�� belirleme................................................................................................................................. 83
Dosyaya yazma ve ek yapma: fwrite() ve fputs()....................................................................................... 84
Kullan�mdaki dosyay� kilitleyin!...................................................................................................................... 85
Dizinlerle ��lemler............................................................................................................................................. 85
Dizin i�eri�ini listeleme: opendir() ve readdir()............................................................................................ 85
Dizin olu�turma: mkdir()................................................................................................................................... 86
Dizin silme: rmdir()............................................................................................................................................ 86
Bir Dosya ��lemi �rne�i: Konuk Defteri....................................................................................................... 86
Metin D�zenleme ve D�zenli �fadeler........................................................................................................... 90
Temel Alfan�merik Fonksiyonlar�................................................................................................................. 90
substr()................................................................................................................................................................. 90
trim()..................................................................................................................................................................... 91
chr()....................................................................................................................................................................... 91
ord()...................................................................................................................................................................... 91
strlen().................................................................................................................................................................. 91
printf() ve sprintf()............................................................................................................................................... 91
number_format()................................................................................................................................................ 92
Tarih ve Saat D�zenleme................................................................................................................................ 93
D�zenli �fadeler.................................................................................................................................................. 94
E�le�tirme deyimleri ve i�aretler.................................................................................................................. 94
D�zenli �fadelerde �zel Karakterler............................................................................................................. 95
Karakter Gruplar�.............................................................................................................................................. 95
D�zenli �fade Fonksiyonlar�............................................................................................................................. 97
ereg() ve eregi().................................................................................................................................................. 98
ereg_replace() ve eregi_replace().................................................................................................................. 98
split()..................................................................................................................................................................... 99
sql_regcase()..................................................................................................................................................... 100
PHP ile Veritaban�............................................................................................................................................. 101
MySQL Veritaban�............................................................................................................................................. 101
mySQL veri t�rleri............................................................................................................................................. 102
PHP-MySQL �li�kisi........................................................................................................................................... 104
PHP'de G�venlik................................................................................................................................................ 109
Parola ve SSL..................................................................................................................................................... 109
T�rnak ��areti Sorunu....................................................................................................................................... 110
PHP Kaynaklar�.................................................................................................................................................. 110
�ns�z
Rasmus Lerdorf, tarihin ilk d�nemlerinde yani Internet'in hen�z yay�ld��� 1990'lar�n ortalar�na do�ru i� ar�yordu; hayat �yk�s�n� bir ki�isel sayfada yay�nlamak ve ba�vuraca�� yerlere bu sayfan�n adresini verebilece�ini d���nd�. Fakat o d�nemde �zellikle �niversitelerin Unix a�lar�nda kurulan Web Sunucularda ki�isel sayfa yapmak kolay de�ildi. Rasmus, kendisi i�in haz�rlad��� yaz�l�m�n Web'e a�ina olmayanlar staraf�ndan da kolayca kullanabilece�ini d���nd�. Bu yaz�l�m�n b�y�k�e bir b�l�m� Perl dilinden al�nm��t�. Ad�na Personal Home Page (Ki�isel Ana Sayfa) dedi�i bu program�n �ok tutulmas� �zerine Rasmus Lerdorf, Internet Sitesi kuran herkesin birinci g�n de�ilse bile ikinci g�n fark�na vard��� ihtiyac�, yani bir form yoluyla ziyaret�iden gelen bilgileri i�lemeyi sa�layan ekleri yazd� ve program�n ad� PHP/FI (Form Interpreter/Form Yorumlay�c�) oldu. Kimileri program�n bu s�r�m�ne PHP2 ad�n� takt�; ve bu ad, program�n �ok de�i�mesine ve geli�mesine ra�men uzun s�re de�i�meden kald�.
Rasmus Lerdorf, 1995'in ortalar�nda, Zeev Suraski, Stig Bakken, Shane Caraveo ve Jim Winstead ile bir grup kurdu ve PHP'yi Perl'den �d�n� alma rutinlerle i� yapan bir paket olmaktan ��kart�p, Nesne-Y�nelimli (Object-Oriented) bir programlama dili haline getirdi. Bu grup, bug�n PHP4 ad� verilen bu dili geli�tirmekte ve yeni i�levsellikler kazanmas� i�in s�rekli �al��maktad�r. PHP, Linux gibi, A��k Sistem kurallar�na tabidir; isteyen programda istedi�i de�i�ikli�i yapabilir; ancak bu de�i�iklikten para kazanamaz ve yapt��� de�i�iklikleri isteyen herkese a��klamak zorundad�r.
Linux'un �n�m�zdeki y�llarda en �ok kullan�lan i�letim sistemi olaca�� yolundaki bilgiler ku�kusuz en �ok Linus Torvalds'� �a��rtt�. Linux'un bu ba�ar�s�ndaki en �nemli anahtar nokta olan a��k kaynak geli�tiriliyor ve d�nyan�n heryerinden yaz�l�m geli�tiricilerin deste�ini al�yor olmas�. Ayn� ba�ar�y� Web yaz�l�m geli�tirme dili PHP de g�steriyor. PHP bundan iki y�l �ncesine kadar ad� duyulmam�� basit bir dildi. Ancak �imdi gerek performans gerek destek a��s�ndan di�er Web yaz�l�m geli�tirme dilleri ile kolayca yar���yor; hatta bunlar� fazlas�yla ge�iyor. Hemen her t�rl� i�letim sistemiyle �al���yor olmas� da cabas�. PHP, her t�rl� veritaban�yla sorunsuz �al���yor olmas�yla ve Zend derleyicisiyle daha da yayg�nl�k ve g�� kazanacak. PHP ve a��k kaynak olarak geli�tirilmeye ba�lanan MySQL'in birlikte kullan�ld�klar�nda yakalad�klar� etkinlik binlerce Dolar verilerek al�nan veritaban� ve uygulama dilleriyle yar��man�n �tesinde farklara sahip.
T�rkiye'de PHP olduk�a yeni kullan�lmaya ba�land�. D�nyadaki PHP kullan�c�lar�n�n tercih ettikleri PHP edit�r� PHPed'i bir T�rk'�n geli�tirmi� olmas�, hepimize hakl� bir gurur veriyor. Ayr�ca http://www.php.org.tr adresindeki olu�um �ok k�sa s�rede T�rkiye'de PHP'nin lay�k oldu�u yeri alaca��n� g�steriyor.
Bu kitap���� PHP'nin 4'nc� s�r�m�ne g�re yazd�k. Burada verdi�imiz �rnekleri uygulad���n�zda beklenen sonucu alamazsan�z, �nce sizin sisteminizde kurulu PHP'nin s�r�m�n� kontrol etmelisiniz. Bu kitap��ktaki �rnek kodlar� PC Life dergisinin Internet sitesinde, http://www.pclife.com.tr/........../php_kodlar.zip adresinde bulabilirsiniz. Ayr�ca bu kitap��ktaki kodlar�n t�m�n�n ger�ek bir Web sunucuda nas�l i�ledi�ini g�rmek i�in http://www.mycgiserver.com/~ocal/ adresine bakabilirsiniz.
Bununla birlikte bir programlama dilinin incelikleri, ancak kodlar�n�z� kendiniz yazarsan�z ��renilebilir. �rnek kodlardan, ancak kendi yazd���n�z kodlar bekledi�iniz sonucu vermedi�i taktirde, kar��la�t�rma amac�yla yararlanmal�s�n�z. Sizi biraz da buna zorlamak i�in yer yer konular� bu kodlar�n yaz�ld��� varsay�m� ile ele alaca��m.
Bug�ne kadar PHP programlarr�na .php3 uzatmas�n� vermek adeta gelenek halini alm��t�; ancak PHP'nin 4'nc� s�r�m�yle birlikte, konfig�rasyon ve INF dosyalar�, yap�land�rma s�ras�nda i�letim sistemlerine ve Web sunucular�na varsay�lan de�er olarak sadece .php uzatmas�n� tan�mas�n� bildiriyorlar. PHP programlar�n�za bundan ba�ka uzatmalar verecekseniz, Linux'ta Apache konfig�rasyon dosyas�n�, Windows'da ise Registry kay�tlar�n� de�i�tirmeniz gerekir.
�ki b�l�m olarak sunaca��m�z PHP kitap����n�n birinci b�l�m�n�n yaz�lmas�nda yurdumuzda PHP kullan�c�lar�n� e�itme ve destekleme hareketinin �nc�leri Say�n Kayra Otaner, Serdar Soydemir ve �zg�r Akan, de�erli yard�mlar�n� esirgemediler. �kinci kitap��kta yer alacak uygulamalar�n t�m�n� bu grup geli�tirdi ve A��k Kaynak hareketinin ger�ek temsilcileri olduklar�n� g�stererek, serbest�e kullan�lmak �zere okuyucular�m�za sundular. Kendilerine sonsuz te�ekk�rlerimizi sunar�z. Bununla birlikte bu kitap��kta varolan hatalar�n t�m� bana aittir.
PHP Deste�i veren sitelerle ilgili not:
Bu kitap��kta bir ka� sayfa ilerledikten sonra, yapmak isteyece�iniz ilk i�lerden birinin �cretli veya �cretsiz PHP deste�i veren bir Wes sitesi evsahibi (Hosting) firmas� aramak olaca��n� tahmin ediyorum. Bu ama�la aramalar�n�za http://www.pageresource.com/putweb/index.html adresinden ba�laman�z� sal�k veririm. E�er do�ruca b�yle bir evsahibi firmaya ula�mak isterseniz http://www.mycgiserver.com adresine gidebilirsiniz. Kitap����n sonunda �e�itli PHP kaynaklar�n�n bir listesini de bulabilirsiniz.
PHP'ye Giri�
C/C++, Pascal, hatta Visual Basic bilen ki�iler i�in PHP ��renmek hemen hemen bir ��leden sonray� ay�rmak suretiyle yap�labilecek bir i�tir. Bu dillere a�ina olmayanlar ise belki bir ka� ��leden sonralar�n� ay�rmak zorunda kalabilirler! PHP, bir Script dilidir; yani kodlar� d�z yaz� dosyalar� halinde kaydedilir ve kullan�laca�� ortamda bir yorumlay�c� taraf�ndan yorumlan�r. Bu, PHP ile yazaca��n�z programlar�, derlemek yani ortaya bir EXE veya �al��t�r�labilir ba�ka bir dosya ��kartmaya gerek olmad��� anlam�na gelir. Fakat PHP Script'lerinizi �al��t�rabilmek i�in bu dili bilen bir programa ihtiyac�n�z vard�r. Bu program�n tek ba��na (komut istemci penceresinde veya terminal ekran�nda) �al��mas� m�mk�n oldu�u gibi, Web Server taraf�ndan da �al��t�r�labilir olmas� gerekir. Ba�ka bir deyi�le Web Sunucu program�n�n PHP anlar hale getirilmesini sa�lamak zorunday�z.
PHP yorumcusu, bug�n Zend-�ekirde�i ad� verilen bir Scripting teknolojine dayal� olarak, Zeev Suraski ile Andi Gutmans taraf�ndan s�f�rdan, tamamen yeniden yaz�lm�� bulunuyor. Zend, t�pk� Windows Script Host ve mesela Visual Basic for Applications (VBA) gibi, i�letim sistemine kendisi ile uyumlu Script dilleriyle yaz�lm�� programlar� �al��t�rma imkan� kazand�ran bir teknolojidir (Zend konusunda ek bilgiyi Internet'te www.zend.com adresinde bulabilirsiniz.) Bug�n bu dilin resm� ad� "PHP: Hypertext Preprocessor" (Hiper-metin �n-i�lemcisi) olarak de�i�tirildi, ve �e�itli Web Server'lar�n PHP dili anlamas� i�in gerekli yorumlay�c�lar� yeniden �retlidi. 20 Ocak 200'de �srail'de PHP'nin ilk uluslararas� konferans� yap�ld� ve 4'nc� s�r�m�n�n betas� ortaya kondu.
Peki ama PHP nedir?
PHP ile art�k oturup her t�rl� i�levselli�i sahip programlar yazabilirsiniz; yani PHP ba�l� ba��na uygulama alanlar� bulabilecek d�zeye ula�m��t�r. Ba�ka bir deyi�le PHP ile oyun program�ndan tutun veritaban� y�netimine kadar hemen her t�rl� program� yazabilirsiniz. Bizi bu kitap��kta ilgilendiren taraf�yla PHP, Web Sunucu'ya bir tak�m i�ler yapt�rmak i�in program yazma dilidir. T�pk� CGI/Perl veya ASP ya da ColdFusion, Java (Javascript de�il!) gibi! PHP kodlar�, olu�turaca��m�z HTML sayfalar�nda HTML etiketlerinin aras�nda kendi �zel ayrac� i�inde yaz�l�r:
<html>
<?PHP
echo ("Merhaba D�nya!");
?>
</html>
�ster ki�isel bilgisayar�m�zda, ister ger�ek Internet ortam�nda olsun, bir Web Sunucu, ziyaret�inin (Internet istemci program�n�n, Browser'�n) talep etti�i dosya ad�n�n uzatmas� olarak ".PHP," ".PHP2," ".PHP3," veya ".PHP4" g�r�nce, kendine kendine, "Yine bana i� ��kt�!" diye d���n�r! ��nk� Web Server, uzatmas� ".htm" veya ".html" olan bir dosyay�, kendi sabit disklerinden birinde bulur ve zahmetsizce, ziyaret�inin bilgisayar�na g�nderir. Fakat, ".asp," .pl," ".cfm" gibi, ".PHP" uzatmas�, Web Sunucu'ya bu sayfay� oldu�u gibi, al�p ziyaret�inin Browser'�na g�ndermek yerine, �nce PHP yorumlay�c�y� �a��rarak, ona teslim etmesi gerekti�ini bildirir. PHP yorumlay�c�s� (yani Windows ortam�nda PHP.exe veya 4'nc� s�r�mle gelen PHP4isapi.dll, Unix ve t�revlerinde �al��t�r�labilir PHP dosyas�), kendisine teslim edilen bu belgede �nce "<?PHP" ve "?>" ayra�lar� aras�ndaki PHP kodlar�n� se�erek al�r ve gere�i ne ise onu yapar. Bu ayra�lar�n i�inde kalan kodlar, bizim yap�lmas�n� istedi�imiz i�lemin komutlar�d�r. HTML ile yetinmeyip, PHP kullanmam�z�n sebebi, bu komutlar�n HTML'in yapayaca�� �eyleri yapmas�d�r.
HTML'in yapamayaca�� �eylerin ba��nda, Web Sunucusu'nda yap�lacak i�ler vard�r. S�zgelimi HTML etiketlerini kullanarak, Web Sunucusu'ndaki bir veritaban� dosyas�n� a��p, i�indeki verileri okuyamay�z. HTML yoluyla Web Sunucusu'nun sabit disklerindeki d�z yaz� dosyalar�n� da okuyamay�z ve bu disklere dosya yazamay�z. HTML etiketleri ile Web ziyaret�imizden bilgi edinebilir ve bunlar� Sunucu'ya yollayabiliriz; ama o kadar! Bu bilgileri i�e yarar �ekle sokmak i�in bize Server'da �al��an bir program gerekir. Server'da �al��an program, EXE ve DLL veya JSP (Java Server Pages) gibi bir "ger�ek program"; veya Perl, ASP ve PHP gibi Script diliyle yaz�lm�� bir program olabilir. (Ger�ek programlar� yazanlar, tabi�, sizin Script diliyle yaz�lm�� programlara "program" demenize �ok k�zarlar! Ama bu Script pogramlar�n�n program olmas�n� hi� engellemez.)
Ne diyorduk? Web Sunucu, ".PHP" uzatmas�n� g�r�nce tela�a kap�l�r, bu dosyay� PHP yorumlay�c�s�na verir ve o da "<?PHP" ve "?>" ayra�lar� i�indeki kodlar� icra eder, demi�tik. Bu icraat�n sonunda ortaya ��kan �r�n e�er ziyaret�iye g�nderilecekse, HTML etiketleri i�inde g�nderilir; yani ziyaret�i asla PHP kodlar�n� g�remez. Kimi zaman PHP program�m�z�n �al��mas� sonucu ortaya ziyaret�iye g�nderilecek bir �r�n ��kmaz; elde edilen sonu� ya ba�ka bir programa (�rne�in elektronik ileti g�nderen bir Sendmail progam�na) hammadde olarak verilir, ya da Server'da sabit diske yaz�l�r. Fakat her durumda, Web ziyaret�imiz bizim PHP kodlar�m�z� g�remez; bu Web sayfalar�m�zda PHP kodu kullanmam�z halinde, sayfalar�m�z�n Browser taraf�ndan tan�nmas� veya tan�nmamas� gibi bir durumun ortaya ��kmamas� demektir. Ziyaret�i ne t�r Browser kullan�rsa kullans�n, kendisine Sunucu'dan daima saf HTML kodu gelece�i i�in, sayfalar�m�z� rahat�a g�rebilecektir. Tabi� bir nokta var: Sayfalar�m�zda herhangi bir Browser'�n ar�zal� yorumlad��� veya hi� yorumlayamad��� HTML etiketleri bulunabilir; ya da s�z gelimi ziyaret�iye giden HTML'in i�inde Browser'da �al��t�r�lacak olan ba�ka Script kodlar� bulunabilir; ve Browser bu kodlar� anlamayabilir. �rne�in, HTML sayfan�zda VBScript kodlar� kullanm�� iseniz, Netscape ile sitenize ba�lanm�� olan ki�iler bu kodun olu�turmas�n� istedi�iniz etkiyi g�remeyeceklerdir; ��nk� Netscape VBScript anlamaz! PHP ile yazaca��n�z Web programlar�n�n (eski deyimiyle "sayfalar�n") olu�turaca�� HTML belgesinin Browser t�rleri ve s�r�mleri ile uyarl�l���n� sa�lamak yine Web programc�s� olarak sizin sorumlulu�unuzdad�r.
�zetlersek, PHP bir CGI programlama dilidir; bu dille, Web Sunucusu ile Web ziyaret�isi aras�ndaki bulu�ma noktas� olan CGI'da bilgi al��veri�i yap�labilir; Sunucu'da bulunan ba�ka programlar �al��t�r�labilir ve b�ylece Web sayfalar�m�za HTML'in s�n�rlamalar�n�n �tesinde hareket ve ziyaret�i ile etkile�me olana�� kazand�r�labilir.
San�r�m iyi bir Web programc�s� olarak �u anda ekrana "Merhaba D�nya!" yazd�rmak i�in sab�rs�zlan�yorsunuz. Ama bunun i�in, PHP sayfan�z� ya PHP-uyumlu bir Web Sunucusu'ndaki Web sitenize y�klemek, ya da ki�isel bilgisayar�n�zdaki ki�i�el Web Sunucusu'na PHP ��retmek zorundas�n�z. Bu ikinci y�ntemi kuvvetle tavsiye ederim; ��nk� yazaca��n�z PHP programlar�n� ger�ek Internet Sunucusunda s�namak, bazen arzu edilmeyen durumlara yol a�abilir. Oysa ki�inin bu denemeleri, evinde ve i�yerinde kendi bilgisayar�nda yapmas�, �o�u zaman daha az ba�a�r�s� ve g�zya��na yol a�ar! En az�ndan, PHP hatalar�n�z� ve g�zya�lar�n�z� sizden ba�ka g�ren olmaz!
PHP ve Veritaban�
Ki�isel bilgisayar�n�zdaki ki�isel Web sunucusuna PHP ��retme i�lemine ge�meden �nce, hemen hemen PHP'nin ikiz karde�i say�lan MySQL'den ve onun rakibi PostgreSQL'den k�saca s�z edelim.
PHP'nin varl�k sebeplerinin ba��nda, ticar� Unix ve Microsoft Windows i�letim sistemlerinden ayr�, ticar� olmayan A��k Sistem ortamlar�nda �al��an bir Script dili ile bu dille kullan�labilecek yine A��k Sistem �r�n� bir veritaban� eri�im ve y�netim arac�na sahip olmak gelir. Perl, ger�i PHP'den �ok �nce A��k Sistem �r�n� olarak, isteyen Web Programc�s�'n�n �cretsiz edinece�i bir CGI programlama dili olarak Web'in ilk g�n�nden beri Web Programc�s�n�n emrinde idi. Ama Perl, metin dosyalar�ndan yaz� �ekmek ve bunlar� bi�imlendirerek rapor haline getirmek amac�yla geli�tirilen bir dil oldu�u i�in, �zellikle veritaban�na dayal� i�lemlerde programc�ya �ok g��l�k ��kart�yordu. ASP ise (ASP deste�i sa�layan ve �cretsiz Web sitesi veren firmalar�n giderek artmas�na ve veritaban� konusunda hem kolayl�k, hem de b�y�k bir etkinlik sa�lamas�na ra�men) �o�unlukla �cretli Web sitesi ald���m�z ticar� ama�l� evsahibi (Hosting) firmalar�n�n sa�lad��� bir teknoloji olarak g�r�ld�. PHP, tasar�mc�lar�n�n MySQL ve PostgreSQL teknolojilerini geli�tiren kurum ve firmalarla yapt��� yak�n i�birli�i sonucu ikinci s�r�m�nden itibaren veri-y�nlendirmeli Web uygulamas� alan�nda �nemli bir ara� olarak belirdi. Dolay�s�yla, PHP kurulumu dendi�i zaman, kendili�inden, MySQL kurulumu da kastedilmi� olur. �imdi PostgreSQL da ekleyebiliriz.
PHP, bir dildir; MySQL ve PostgreSQL ise bir demet s�r�c�d�r. PHP ile, Web Server'a sayfan�z� Internet ziyaret�isine g�ndermeden �nce bir tak�m komutlar� icra etmesini, bir tak�m veri dosyalar�n� a��p i�indeki bilgileri al�p bunlar� HTML kodlar�yla bezeyip, Browser'a bildi�imiz klasik HTML sayfas� olarak g�ndermesi talimat�n� veririz. MySQL ve PostgreSQL ise, Windows sistemlerinde Denetim Masas�'nda g�rd���n�z ODBC Veri Kayna�� Y�netmeni adl� ara� gibi, bir vertaban� sunucusu, yani Database Server pprogramlar�d�r. Yak�n zamana kadar bu iki veritaban� y�netim arac� aras�nda fazla bir �eki�me yoktu. Ancak �imdi �zellikle Linux kullan�c�lar� topluluklar�nda iki program aras�nda verimlilik testleri yap�l�yor; hangisinin daha iyi oldu�nuna ili�kin yo�un bir tart��ma s�r�yor. PHPBuilder.com uzmanlar�, yapt�klar� bir �ok denemede, MySQL'in daha h�zl� ve daha etkin �al��t�klar� sonucuna var�yorlar. (Bu konuda daha geni� bilgi edinmek i�in Internet'te www://PHPbuilder.com/columns/tim20000705.PHP3 adresine bakabilirsiniz.)
MySQL, bir kullan�c� lisans� 200 Dolar olan ticar� bir program iken 2000 y�l� ortalar�nda GPL (GNU General Public License/GNU Kamusal Lisans) uygulamas�na ge�mi� ve �cretsiz da�t�l�r hale gelmi� bulunuyor. Buna g�re MySQL'i bir ticar� uygulaman�n i�inde motor olarak kullanacaksan�z �reteci firmaya lisans �creti �demeniz gerekir; bunun d���ndaki uygulamalar i�in program� Internet'ten indirerek kullanabilirsiniz. PHP i�in MySQL'e gerek yoktur. PHP, bir NT veya Win9x tabanl� Web Server'da �al��t�r�l�yorsa, Microsoft'un ODBC s�r�c�leri ile �al��abilir; ve ODBC'nin okudu�u b�t�n veritabanlar�ndan veri �ekebilir. (ODBC'nin Unix-Linux s�r�m� de vard�r.) Ayr�ca PHP i�in Adabas, dBase, Empress, FilePro, Informix, InterBase, mSQL, Oracle, Solid, Sybase, Velocis ve bir �ok Unix veritaban� y�neticisi i�in geli�tirilmi� add-on (sonradan eklenen) mod�ller vard�r. PHP, bir �ok LDAP istemci program� i�in yaz�lm�� API'lere de sahiptir. PHP ile IMAP, SMTP gibi Internet elektronik mektup protokollerini kullanmak da m�mk�nd�r.
Biz bu kitap��kta �rneklerimizde ve uygulamalar�m�z�da MySQ'den yararlanaca��z. PHP-MySQL ikilisini ki�isel bilgisayar�m�za kurmak i�in �nce gerekli programlar� Internet'ten indirmemiz gerekir. Bunun i�in �u adreslerden yararlanabilirsiniz:
http://www.PHP.net/downloads.PHP
http://www.mysql.com/downloads/index.html
PHP ve Web Sunucusu
Bizim a��m�zdan PHP, bir Web sunucu program�d�r; kurulaca�� sistemdeki Web sunucusu ile uyumlu olmas� gerekir. 4'nc� s�r�m� itibariyle, PHP b�t�n Unix-t�revi sistemler (�rne�in Linux) ve Microsoft Windows sistemleri ile uyumludur. Birlikte �al��abilece�i Web sunucu programlar� aras�nda Apache, IIS, FHTTP, Omni HTTPd, Xitami ve Windows 95/98 i�in PWS (Personal Web Server) vard�r. Ger�ek Internet ortam�nda sunucu programlara PHP yetene�i kazand�rma i�lemi, Web Pnogramc�s� olarak bizi ilgilendirmez; bizim i�in Internet sitemize evsahipli�i yapan Hosting firmas�n�n PHP deste�i verip vermedi�ini bilmek yeter. Fakat tasar�mlar�m�z� s�nayabilmek i�in kendi bilgisayar�m�za bir ki�isel Web Server kurmak ve bu program� PHP-uyumlu hale getirmek gerekir. Burada sadece iki �rnek ele alaca��z: Linux i�in Apache sunucu program� ve MS-Windows i�in PWS. Bu iki programdan hangisi sizin sisteminize uygunsa onu kendi bilgisayar�n�za kuraca��n�z� varsayarak, �imdi PHP ve MySQL kurulumu ile u�ra�abiliriz.
Unix/Linux Sistemleri
Kurma i�lemine Unix ortam�ndan ba�layal�m. Burada Unix sistemi dedi�imiz zaman Unix'in tekrar bili�im haritas�nda yerini almas�n� sa�layan Linux'u kastediyorum. Bunun i�in �nce http://www.PHP.net/ adresini ziyaret etmemiz gerekiyor. E�er PHP uzman� olacaksan�z, buras� sizin ikinci eviniz olabilir. Downloads k�pr�s�n� t�klayarak a��lacak sayfada Unix/Linux i�in kaynak kodunu bilgisayar�n�za aktar�n. PHP'yi kuraca��n�z bilgisayarda bir Web sunucu program� yoksa, http://www.apache.org/dist/ adresinden apache_1.3.12.tar.gz (veya daha ileri) dosyas�n� da indirmeniz gerekir. Unix-Linux sistemleri i�in bilgisayar�n�zda "gcc C derleyici" bulunmas� gerekir. Linux sisteminizde �rne�in Red Hat Linux s�r�m 5.2 gibi eski bir gcc derleyici varsa, gcc s�r�m 2.8.1'i Internet'ten bulman�z gerekir.
//////KUTU///////////////////
Linux'ta program derlediniz mi?
Daha �nce hi� Linux program� derlemediyseniz, �nce baz� kavramlar� a��kl��a kavu�tural�m:
tar: (tape archiver) birden fazla dosyay� tek dosya haline getirir ve s�k��t�r�r. Teyplere yedekleme amac�yla geli�tirilmi�tir. tar dosyalar� s�k��t�r�lm��sa uzatmas� .gz, de�ilse .tar olur.
gcc: GNU'nun C derleyicisidir. �nsan taraf�ndan okunabilen kaynak kodlar�n� makina taraf�ndan okunabilen nesne (object) dosyalar�na d�n��t�r�r. C programlama diliyle yaz�lm�� kaynak kodlar� i�eren dosyalar�n uzant�n� .c olur. Nesne dosyalar�n�n ad�n�n uzant�s� genellikle .o olur. Derleyici ba�l�k (header, uzant�s� .h olan) dosyalar�n� bulamazsa derleme hatas� verir.
make: hen�z derlenmemi� kaynak dosyalar�n� derleyen yard�mc� bir programd�r. make, derleme talimatlar�n� Makefile adl� bir dosyadan al�r.
ld: GNU'nun ba�lay�c� (linker) program�d�r. Nesne dosyalar�n� ve kitapl�k denen dosyalar� birbirine ba�layarak ortaya �al��t�r�labilir bir program dosyas� ��kart�r. Genellikle Makefile'�n i�inde linker'�n �al��t�r�lmas� talimat� bulunur ve sizin bu program� kullanman�z gerekmez.
ldconfig : payla��lan kitapl�k dosyalar�n� (shared librari) arar. Bu dosyalardan birden fazla program taraf�ndan payla��l�r, ve dosya adlar�nda .so bulunur.
./configure : C derleyecisi ve header dosyalar�n�n nerede oldu�unu ara�t�r�r, ve vard��� sonuca g�re Makefiles dosyas�nda de�i�iklik yapar.
/////////////////KUTU
B�TT�///////////////
PHP, bir Unix/Linux sisteminde m�stakil yorumlay�c� veya Apache Web sunucusunun bir mod�l� olarak �al��mak �zere derlenebilir. PHP, m�stakil yorumlay�c� olarak kuruldu�unda, Web sunucusu, her ihtiya� halinde PHP yorumlay�c�s�n�n bir �rne�ini �al��t�r�r. Bu, bir s�re sonra Web sunucusunun bulundu�u i�letim sisteminin y�k�n�n artmas�na ve i�leyi�inde yava�lamaya yol a�abilir. Oysa PHP, sunucunun bir mod�l� olarak kuruldu�unda, bu sak�nca ortaya ��kmaz. (Bu �zelli�i ile PHP, klasik CGI/Perl'�n �al��ma tarz�ndan ayr�l�r, ASP'nin ve ColdFusion'�n �al��ma tarz�na yakla��r.) Bununla birlikte k�t� niyetle veya beceriksizce yaz�lm�� PHP programlar� mod�l olarak kurulmu� PHP'yi ��kertirlerse, Web sunucusunu da ��kertmi� olurlar; oysa m�stakil PHP yorumlay�c� ��kerse, Web sunucusuna bir �ey olmaz.
Burada yapaca��m�z kurulum i�lemi s�ras�nda Linux kurulu olan bilgisayar�m�za Apache Web sunucu program�n�, bu sunucunun kullanaca�� g�venli Socket katman�n� sa�layacak Mod_SSL program�n�, bu program�n gerektirdi�i OpenSSL arac�n�, MySQL veritaban� sunucusunu ve PHP Scripting dilini kurmu� olaca��z.
PHP'yi Linux ortam�nda Apache Web sunucusuna mod�l olarak kurmak i�in s�ras�yla �u i�lemleri yapmam�z gerekir (Sisteminizde gzip veya gunzip ile gcc and GNU make kurulu oldu�unu varsay�yorum):
1. Sisteminizi root olarak ba�lat�n ve s�k��t�r�lm�� olarak alaca��n�z PHP ve Apache dosyalar�n� geni� yer olan ge�ici bir dizinde a��n, ve o dizine gidin. S�zgelimi, Apache'nin tar-zip olarak s�k��t�r�lm�� kaynak dosyalar�n�n tmp adl� dizinde oldu�unu varsayal�m:
# cd /tmp
# gunzip �c apache_1.3.12.tar.gz | tar xf �
Burada, indirdi�iniz Apache s�r�m� farkl� ise onun ad�n� yazacaks�n�z. �imdi Apache'yi a�t���n�z klas�re gidin ve buradaki configure dosyas�n� �al��t�r�n:
# cd apache_1.3.12
# ./configure --prefix=/usr/local/apache
Buradaki �rnekte Apache'yi /usr/local/apache dizinine koydu�umuza dikkat edin. Bu dizini, bir �ok kurulumun varsay�m olarak arayaca�� dizin oldu�u i�in tercih ediyoruz. Ama isterseniz siz Apache'yi ba�ka dizine de kurabilirsiniz.
2. S�ra MySQL veritaban� sunucusunda. Linux'ta root oturumunda iken s�k��t�r�lm�� dosyalar� indirdi�iniz ge�ici dizine ge�in ve dosyalar� a��n; sonra olu�turulan dizine giderek, configure komutu ile veritaban� s�r�c�s�n� yap�land�r�n:
# cd /tmp
# gunzip -dc mysql-3.22.32.tar.gz | tar xvf -
# cd mysql-3.22.32
# configure --prefix=/usr/local/mysql
�imdi make komutu ile binary dosyalar�n� olu�turarak, ve sisteme y�kleyelim:
# make
# make install
MySQL'in kullan�m izinlerini belirlememiz gerekir. A�a��daki komutlar� yazarken "parola" kelimesi yerine vermek istedi�iniz parola kelimesini yazman�z gerekir:
# scripts/mysql_install_db
# cd /usr/local/mysql/bin
# ./safe_mysqld &
# ./mysqladmin -u root password 'parola'
Kurulum i�leminin ba�ar�l� olup olmad���n� s�namak i�in, kurulum s�ras�nda olu�turlan �rnek veritaban� dosyalar�n� bulunup bulunmad���n� soru�turabilir ve kendimiz yeni bir veritaban� olu�turabiliriz. Bunun i�in �u komutu yazal�m:
# BINDIR/mysqlshow -p
# mysql -u root -p
Sistem "Enter password:" kar��l���n� verdi�inde, yukar�da kullan�m izinlerini belirlerken yazd���n�z parolay� yaz�n; MySQL sunucusu �al��acak ve size kullan�c� izinlerinin bulundu�u "mysql" ve s�nama amac�yla olu�turulan "test" adl� iki veritaban�n�n bulundu�unu bildirecektir. �imdi kendi veritaban�m�z� olu�tural�m. MySQL sunucu komut istemcisi sat�r�na �unu yaz�n (Bilgisayar�n verece�i kar��l�klardan ay�rt etmek i�in kendi yazd�klar�m�z� koyu renkle g�steriyoruz):
mysql> create database deneme;
Sunucu "Query OK, 1 row affected (0.00 sec)" �eklinde kar��l�k verecektir. �imdi bu veritaban�n� se�erek i�inde deneme adl� ve i�inde "no" ve "isim" adl� iki alan bulunan bir tablo olu�tural�m (MySQL komutlar� b�y�k harf-k���k harf ayr�m� yapmaz; komutlardan sonra noktal� virg�l konur). Burada koyu renkle g�sterilen sat�rlar ve i�aretler bize aittir:
mysql> use deneme;
Database changed
mysql> CREATE TABLE books (
-> no int(3) not null auto_increment,
-> isim char(50) not null,
-> unique(no),
-> primary key(no)
-> );
Query OK, 0 rows affected (0.00 sec)
Bakal�m tablomuz ba�ar�l� �ekilde olu�mu� mu?
mysql> show tables;
mysql> describe deneme;
Field Type Null Key Default Extra
no int(3) PRI 0 auto_increment
isim char(50)
2 rows in set (0.00 sec)
�ok g�zel! Hem MySQL'i kurmu�, hem de ilk tablomuzu olu�turmu� bulunuyoruz. MySQL komutlar�n� daha ayr�nt�l� ��renebilmek i�in MySQL'in http://www.mysql.com adresindeki sitesini ziyaret edebilirsiniz. �imdilik MySQL'den ��kal�m ve kuruluma devam edelim.
3. S�ra geldi PHP'ye! PHP kaynak dosyas�n�n bulundu�u ge�ici dizine ge�in, ve dosyalar� a��n; sonra a��lan dosyalar�n bulundu�u dizine gidin:
# gunzip -c PHP-4.0.1pl2.tar.gz | tar xf -
# cd PHP-4.0.1pl2
�imdi configure dosyas�n� �al��t�raca��z; bu komutun bir �ok opsiyonu vard�r; bunlar�n t�m�n� g�rmek istiyorsan�z, "configure --help" komutunu verebilirsiniz. Biz sadece PHP'ye MySQL ve Apache opsiyonlar�n� eklemekle yetinece�iz:
# ./configure --with-mysql=/usr/local/mysql \
--with-xml \
--with-apache=../apache_1.3.12 \
--enable-track-vars
Olu�an binary dosyalar�n� program dosyas�na �evirerek, y�kleyelim:
# make
# make install
Olu�an ini dosyas�n� lib dizinine koplayal�m:
# cp PHP.ini-dist /usr/local/lib/PHP.ini
PHP.ini dosyas�ndaki bir �ok �zelli�i de�i�tirerek, PHP'nin �al��ma tarz�n� ayarlayabilirsiniz; �rne�in �u sat�r� ekleyerek, PHP'nin azam� �al��ma s�resini artt�rabilirsiniz:
max_execution_time = 60;
///////////////KUTU/////////////////////
G�venli socket ve Internet Eri�imi Katman�
Kuraca��n�z Web sunucusu ger�ek Internet'e a��lacaksa, sisteminize Mod_SSL yetene�ini kazand�rman�z gerekir. Bu sistemin rsaref-2.0 ad�nda bir eki vard�r; ancak Amerika d���nda kurulan Web Sunucularda rsaref-2.0 ekinin kurulmas� gerekmez. Apache sunucusunu sadece PHP dosyalar�n�z� s�namak amac�yla kendi bilgisayar�n�za kuruyorsan�z, Mod_SSL kurmak �art de�ildir.
Bu i�lemi yapmak zorunda iseniz, �nce http://www.openssl.org/ adresinden openssl-0.9.1c.tar.gz adl� dosyay�, http://www.modssl.org/ adresinden de mod_ssl-2.6.5-1.3.12.tar.gz dosyas�n� indirin. Sonra s�ras�yla �u i�lemleri yapabilirsiniz:
# gunzip -dc openssl-0.9.5c.tar.gz | tar xvf -
# cd openssl-0.9.x
#./config --prefix=/usr/local/ssl \
-L`pwd`/../rsaref-2.0/local/rsaref -fPIC
# make
# make test
# make install
# cd ..
�imdi Mod_SSL mod�l�n� Apache ile kullan�lacak �ekilde kural�m:
# gunzip -dc mod_ssl-2.6.4-1.3.12.tar.gz |tar xvf -
# cd
# ./configure --with-apache=../apache_1.3.12
# cd ..
# cd apache_1.3.12
# SSL_BASE=../openssl-0.9.x \
RSA_BASE=../rsaref-2.0/local \
./configure \
--enable-module=ssl \
--activate-module=src/modules/PHP4/libPHP4.a \
--enable-module=PHP4 \
--prefix=/usr/local/apache \
--enable-shared=ssl
[...ISS'ler buraya arzu ettikleri di�er opsiyonlar�
ekleyebilirler..]
# make
Bu noktada sistem binary dosyalar�n olu�turuldu�unu ve kurulumun gerekli g�venlik sertifikalar�n� istedi�ini bildirecektir. Sertifika olu�turma konusunda fazla bilgi i�in, http://www.modssl.org/docs/2.6/ssl_faq.html#ToC25 adresine bakabilirsiniz.) Diyelim ki sadece ISS'in yeri, firma ad� ve bir iki di�er bilgiden olu�an �zel bir sertifika olu�turmakla yetineceksiniz. Bunun i�in �u komutu girin ve sistemin soraca�� sorulara cevap verin:
# make certificate TYPE=custom
�imdi Apache'yi yeniden kurabiliriz:
# make install
Her�ey yolunda gittiyse, sistem "You now have successfully built and installed the Apache 1.3 HTTP server," �eklinde ba�layan uzun bir mesaj verecektir. Bu durumda Apache sunucusu �u komutla ba�lat�labilir:
/usr/local/apache/bin/apachectl start
Apache'yi g�venli ileti�im katman� deste�i ile ba�latmak istiyorsan�z �u komutu yaz�n:
/usr/local/apache/bin/apachectl startssl
//////////////////////KUTU BITTI/////////////////
Bu i�lemleri ba�ar�yla bitirmi� olsak bile sistemin �al��t���n� kontrol etmemiz gerekir. �nce Apache'nin �al��t���ndan emin olal�m. Bunun i�in �nce Apache'nin yap�land�r�lmas�na PHP'nun eklendi�inden emin olmam�z gerekir. Kurulumu buradaki gibi yapt� iseniz /usr/local/apache/conf dizininde bulunan httpd.conf dosyas�n� a��n; ve "addtype for PHP4" sat�rlar�n �n�ndeki yorum (#) i�aretlerini kald�r�n; yani bu sat�r yorum olmaktan ��k�p yap�land�rma komutu olsun:
#AddType application/x-httpd-PHP .PHP
#AddType application/x-httpd-PHP-source .PHPs
�eklindeki sat�rlar� �u �ekle getirin:
AddType application/x-httpd-PHP .PHP
AddType application/x-httpd-PHP-source .PHPs
�imdi Apache sunucusunu �al��t�rabilir ve PHP deste�inin bulunup bulunmad���n� s�nayabilirsiniz:
# cd /usr/local/apache/bin
# ./apachectl configtest
Syntax OK
# ./apachectl start
./apachectl start: httpd started
"httpd started" ifadesi bize Apache'nin �al��t���n� g�steriyor. �imdi Browser'�n�z� a��n ve HTTP sunucusu olarak Apache'nin adresini yaz�n. Bu, bilgisayar�n�z�n Domain ad�d�r; Apache'nin kurulu oldu�u bilgisayar�n IP numaras�n� da yazabilirsiniz.
�imdi, bir d�zyaz� dosyas�na �unlar� yaz�n:
<? PHPinfo(); ?>
Dosyay� PHP.PHP ad�yla Apache'nin Web sunucu i�in k�k dizin sayd��� klas�re kaydedin. Browser'�n�z�n URL adresi alan�na sunucu ad�yla birlikte dosyan�n ad�n� yaz�n.
<php00001.tif>
Ald���n�z sonu�, PHP'nin sistem ve sunucu hakk�nda ayr�nt�l� raporu ise, kendi kendinizi kutlayabilirsiniz: hem Apache sunucu, hem de PHP �al���yor!
Windows-PWS ve IIS
PHP'yi Windows 95/98/NT/2000 i�letim sistemlerinden biri ile �al��an bilgisayara kurmak i�in �nce http://www.PHP.org adresinden PHP-4.0.1pl2-Win32.zip veya daha ileri s�r�mdeki zip dosyas�n� almam�z gerekir. Bu dosyay� a��n ve i�indekileri s�zgelimi c:\PHP dizinine kopyalay�n. (Dizini olu�tururken "PHP," "PHP" veya "PHP" yazd���n�za dikkat edin!)
Daha �nce Wihdows sistemine PHP 3.x kurmu� olanlar PHP 4.0'�n kurulumumu biraz farkl� bulacaklard�r. Bu, daha �nce PHP ki�isel ve Internet ama�l� Web sunucuda (PWS veya IIS) m�stakil bir CGI program� olarak �al���rken �imdi buna ek olarak (t�pk� ASP gibi) DLL yoluyla, bir ISAPI mod�l� olarak �al��mas�n�n sa�lanm�� olmas�ndan kaynaklan�yor.
PHP'yi Windows 95 veya NT4.0 sisteminde kurulu bir PWS veya IIS i�in kuracaks�n�z, �nce baz� �nlemler alman�z gerekiyor. NT 4.0 sistemlerinde IIS 4.0'�n bulundu�u Option Pack'in kurulmas� �art. Windows 95 sistemlerinde ise �nce DCOM bile�enlerinin g�ncele�tirilmesi gerekiyor. Bu dosyay�, http://download.microsoft.com/msdownload/dcom/95/x86/en/dcom95.exe adresinden alabilirsiniz.
PHP'yi m�stakil �al��an CGI program� olarak kullanmay� d���nseniz bile daha �nceki s�r�mlerinden farkl� olarak baz� DLL dosyalar�n�n Windows dizininde sistem alt-dizinine kopyalanmas� gerekir. A�t���n�z Zip dosyas�ndan ��kan ve C:\PHP dizinine kopyalad���n�z dosyalar aras�nda bulunan MSVCRT.DLL ve PHP4TS.DLL adl� dosyalar� Windows 9x sistemlerinde WINDOWS dizininde SYSTEM, NT/2000'de ise WINNT dzininde SYSTEM32 dizinine kopya edin. (Windows, MSVCRT.DLL dosyas�n�n kullan�lmakta oldu�u bildirerek, kopyalamay� reddederse, kopyalamaya gerek yok demektir.)
IIS 4.0 ve 5.0
Windows NT/2000'e kurulu olan IIS 4.0 veya 5.0'e PHP deste�i kazand�rmak i�in, �nce yukar�daki gibi DLL dosyalar�n� gerekli yere kopyalay�n. A�t���n�z Zip dosyas�ndan ��km�� olan PHP.ini-dist isimli d�z yaz� dosyas�n� Notepad ile a��n ve "extension_dir=" sat�r�n� bularak, kar��s�ndaki "./" yaz�s�n� silip yerine PHP dosyalar�n� kopyalad���n�z dizinin ad�n� (�rne�in C:\PHP) yaz�n. PHP dizinin ad�n� do�ru yazd���n�z� kontrol etmekte daima yarar vard�r! Sonra ";browscap =" sat�r�n� bulun ve �n�ndeki noktal� virg�l� kald�rarak kar��s�ndaki "extra/browscap.ini" kelimelerini c:\Winnt\browscap.ini olarak de�i�tirin. Bu dosyay�, PHP.ini ad�yla Winnt dizinine kaydedin. (Windows dizininin Winnt ad�n� ta��d���n� varsay�yorum. Sizin Windows dizininiz ba�ka ise, gerekli d�zeltmeyi yapman�z gerekir.)
////////////////KUTU///////////////
Browser Yetenek Dosyas�: Browscap.ini
Windows sistemine kurulu bir Web Sunucu program�na (PWS, IIS veya Apache Win32) PHP yetene�i kazand�rabilmek i�in PHP'nin talep sahibi Browser'�n yeteneklerini bir dosyadan okumas� gerekir. Bu dosyan�n ad� browscap.ini dir.
Internet'te http://asptracker.com/browscap.zip dosyas�n� alarak a��n ve ��kacak "browscap.txt" dosyas�n�n ad�n� "browscap.ini" olarak de�i�tirerek Windows/Winnt klas�r�ne kopyalay�n.
//////////////////KUTU
B�TT�/////////////
Internet Services Manager'� a��n; bu ara�, NT 4.0'te Start men�s�nde Programs/Option Pack'te, 2000'de ise Control Panel/Administrative Tools'dad�r. A��lacak pencerede muhtemelen Default Web Server ad�n� ta��yan Web sunucusunun ad�n� sa� t�klay�n:
<php00002.tif>
A��lan listede Properties maddesini; a��lan kutuda Home Directory sekmesini se�in; Configuration d��mesini t�klay�n ve yeni bir Application Mappings sat�r� eklemek �zere, Executable kutusuna PHP4isapi.dll dosyas�n�n tam yolunu ve ad�n� (�rne�in C:\PHP\ PHP4isapi.dll); Extension kutusuna ise .PHP yaz�n (IIS 4.0'te Method exclusions kutusunu bo� b�rak�n) ve Script engine kutusuna i�aret koyun.
<php00003.tif>
ISAPI Filters sekmesini se�in. Add d��mesini t�klayarak yeni bir ISAPI filtresi kayd� yap�n. A��lacak kutuda filtre ad� olarak PHP, yol olarak da PHP4isapi.dll dosyas�n�n bulundu�u dizinin yolunu (�rne�in C:\PHP\ PHP4isapi.dll) yaz�n.
<php00004.tif>
IIS'i tamamen durdurun; ama bunun i�in sadece Internet Services Manager'daki Stop d��mesini t�klamak yetmez; komut istemci (MSDOS Prompt) penceresinde net stop iisadmin yaz�n. Windows, bu servisin ba�l� oldu�u di�er baz� hizmetlerin de durdurulaca��n� bildirince "Y" yaz�n ve Enter'a bas�n. �imdi IIS'i tekrar ba�latmak i�in ayn� pencerede net start w3svc yaz�n. Art�k IIS'iniz PHP anlar hale gelmi� olmal�. Bunu, hemen s�nayal�m. Notepad veya bir ba�ka d�zyaz� program�yla �unlar� yaz�n:
<? PHPinfo(); ?>
Dosyay� PHP.PHP ad�yla IIS'in k�k dizin sayd��� klas�re kaydedin. Browser'�n�z�n URL adresi alan�na sunucu ad�yla birlikte dosyan�n ad�n� yaz�n.
<php00005.tif>
Bravo! ��te yeni bir dil ��renmi� Web sunucuya sahip oldunuz.
PWS 4.0
Windows'un 95/98/SE/Me t�rlerine ki�isel Web sunucu program� olarak Personal Web Server (PWS 4.0) kurulmal�d�r. PHP Zip dosyas�ndan ��kacak DLL'leri Windows dizininde System klas�r�ne kopyalad�ktan sonra, Zip dosyas�ndan ��km�� olan PHP.ini-dist isimli d�zyaz� dosyas�n� Notepad ile a��n ve "extension_dir=" sat�r�n� bularak, kar��s�ndaki "./" yaz�s�n� silip yerine PHP dosyalar�n� kopyalad���n�z dizinin ad�n� (�rne�in C:\PHP) yaz�n. PHP dizinin ad�n� do�ru yazd���n�z� kontrol edin! Sonra ";browscap =" sat�r�n� bulun ve �n�ndeki noktal� virg�l� kald�rarak kar��s�ndaki "extra/browscap.ini" kelimelerini c:\Windows\browscap.ini olarak de�i�tirin. Bu dosyay�, PHP.ini ad�yla Windows dizinine kaydedin. Daha �nceki sayfalarda g�rece�iniz �ekilde Browscap.ini dosyas�n�n dosyas�n� Windows dizinine kopyalam�� olman�z gerekir. (Windows dizininin Windows ad�n� ta��d���n� varsay�yorum. Sizin Windows dizininiz ba�ka ise, gerekli d�zeltmeyi yapabilirsiniz.)
�imdi, a�t���n�z PHP Zip dosyas�n�n i�inden ��kan PWS-PHP4.reg adl� dosyay� bir d�zyaz� program�yla, �rne�in Notepad ile a��n. ".PHP"="[PUT PATH HERE]\\PHP4isapi.dll" yaz�l� sat�r� PHP dosyalar�n� koydu�unuz dizine g�re, �rne�in ��yle de�i�tirin:
".PHP" = "C:\\PHP\\PHP4isapi.dll"
Burada �ok dikkat etmeniz gereken nokta, ters-b�l� i�aretlerinin ba�ka yerlerde normal olarak yazd���m�z gibi bir adet de�il, iki adet olmas�d�r. Dosyay� kaydettikten sonra, iki kere t�klay�n ve Windows'un Registry'de de�i�iklik yapmay� isteyip, istemedi�inize ili�kin sorusuna Evet yan�t�n� verin. Tamaam! Sizin de PHP bilen bir PWS'iniz oldu. Ama bunu bir s�nayal�m. Ve bunu bir Merhaba D�nya program� ile yapal�m ki, gelenek bozulmas�n!
D�zyaz� program�n�zla �u metni merhaba.PHP ad�yla PWS'in Web i�in k�k dizin sayd��� (muhtemelen C:\Inetpub\wwwroot) klas�re kaydedin:
<html>
<?PHP
echo ("Merhaba D�nya!");
?>
</html>
Sonra Personal Web Manager kutusunda, Ana ba�l�kl� b�l�mde, Yay�mlama k�sm�ndaki "http://" diye ba�layan ve ki�isel Web sunucunuzun ad� ile devam eden k�pr�y� t�klay�n. Varsay�lan Browser'�n�z, ki�isel Web sunucunuzun ana sayfas�n� a�acakt�r. Browser'�n URL adres b�l�m�ne, merhaba.PHP yaz�n ve klavyede Enter tu�una bas�n. E�er ger�ekten PWS'iniz, PHP ��renmi�se, size ve d�nyaya merhaba diyecektir.
<php00006.tif>
///////////////////////KUTU///////////
Windows'da Apache!
NT sisteminizde ISS de�il de Apache for Win 32 Web Server program�n� �al��t�r�yorsan�z, s�r�m�ne g�re httpd.conf veya srm.conf dosyas�na �u ekleri yapman�z gerekir:
ScriptAlias /PHP3/"c:/path-to-PHP-dir/"
AddType
application/x-httpd-PHP3 .PHP3
Action
application/x-httpd-PHP3"/PHP3/PHP.exe"
////////////////////////KUTU
B�TT�//////////
Windows'da MySQL
PHP, Windows ortam�nda, Windows'un ODBC s�r�c�lerini kullanarak, s�r�c�s� bulunan b�t�n veritabanlar�na ula�abilir. Ancak Windows ortam�nda geli�tirseniz bile, Web sitenizi, Unix tabanl� ve ODBC-uyumlu olmayan bir sunucuya g�nderebilirsiniz. Bu durumda sayfalar�n�zda kullanaca��n�z verileri muhtemelen MySQL arac�l���yla veritaban�ndan �ekeceksiniz demektir. Bu y�zden Windows sisteminize MySQL kurmak ve veritabanlar�n� bu ara�la geli�tirmeniz yerinde olur. Unix/Linux ortam�nda �cretsiz olmakla birlikte MySQL, Windows i�in bedeli payla��ml� (shareware) olarak edinilebilir. Benioku dosyas�nda belirtildi�ine g�re, program� e�itim amac�yla ve 30 g�n� a�mamak kayd�yla kullan�yorsan�z, �cret �denmesi gerekmiyor. Di�er durumlarda TCX firmas�n�n Internet'te http://www.tcx.se adresindeki sitesindeki formlar� doldurarak lisans al�nmas� gerekiyor. Bu program�, MySQL'in http://www.mysql.com/downloads/ adresinden edinebilirsiniz. Bu adresteki mysql-shareware-3.22.34-win.zip dosyas�n� alarak, bir ge�ici dizinde a��n. (Sisteminiz ger�ek Internet sunucusu olarak ticar� ama�l� hizmet sa�layacaksa �u dosyay� alman�z gerekir: http://www.mysql.com/Downloads/MySQL-3.23/mysql-3.23.21-win-src.zip) Shareware s�r�m�n� i�eren dosyay� a�t���n�zda ortaya ��kacak setup.exe program� MySQL'i kuracakt�r.
MySQL Server'�n Windows'da da t�pk� Linux'ta oldu�u gibi �al��t�r�lmas� ve durdurulmas� gerekir. MySQL'in payla��m s�r�m�n� kullanmak i�in Windows sistemlerinde mysqld-shareware.exe program�n� �al��t�rman�z gerekir. DOS komut istemcisini a��n ve "C:/mysql/bin" dizinine giderek, s�ras�yla �u komutlar� verin:
mysqld-shareware
mysqlshow
mysqlshow -u root mysql
mysqladmin version status
proc
�imdi MySQL server �al���yor ve biraz sonra PHP yoluyla ki�isel Web Server'�n�za hizmet vermeye haz�r demektir. Bu komutlar� icra etti�iniz s�rada bir hata mesaj� ile kara��la��rsan�z, MySQL'in kurulu�unda hata yapm�� olabilirsiniz. DOS ekrar�nda test ve MySQLl veri tabanlar�n�n varl���n� ve hizmete girdi�ini g�steren mesajlar g�r�rseniz, MySQL g�zelce �al���yor demektir. Bunu bir de Browser ile ve PHP yoluyla s�nayal�m:
Yukar�da IIS'e PHP deste�i kazand�rma �al��malar� s�ras�nda olu�turmad� iseniz, d�z yaz� program�n�zda �u tek sat�r� yaz�n; php.php ad�yla, ki�isel Web'inizin k�k dizinine kaydedin:
<? PHPinfo(); ?>
Browser'�n�z� a��n; URL hanesine �rne�in http://localhost/PHP.PHP3 yaz�n. A��lacak sayfada iki �eye dikkat edin: MySQL ve ODBC b�l�mleri var m�? MySQL b�l�m� varsa; kendinizi yeniden kutlay�n! ODBC b�l�m� yoksa, muhtemelen sisteminizde Microsoft'un Open Database Connectivity (A��k Veriban� Ba�lant�s�) s�r�c�leri kurulu de�il demektir. (Windows'da Denetim Masas�'nda ODBC simgesini g�rm�yorsan�z, MS'un sitesinden gerekli kur program�n� indirmeniz gerekebilir. Linux'ta ise MyODBC program� ile bu imkan� kazanabilirsiniz.)
<php00007.tif>
Bir kere daha tekrar etmek gerekirse, PHP ile veritaban�na dayanan sayfalar yapmak i�in mutlaka ve sadece MySQL s�r�c�lerini kullanmak gerekmez. Bunun yerine MS'un ODBC s�r�c�lerini kullanabilirsiniz. Ancak Web sitenize evsahipli�i yapan firman�n size ODBC deste�i verip vermedi�ini ��renmeniz gerekir. Asl�nda ayn� �ekilde, evsahibi firman�n MySQL deste�i verip vermedi�ini de ��renmek zorundas�n�z. (PHP ile MS-ODBC s�r�c�lerini kullanabilmek i�in Andrew Stopford'un ASPToday sitesindeki http://www.asptoday.com/articles/20000202.htm yaz�s�nda geni� bilgi bulabilirsiniz.)
Ge�mi� olsun. Bana sorarsan�z, PHP ile dolu yeni bir hayata ba�lamak i�in en �nemli ad�m� att�n�z. Bundan sonras�, sadece PHP dilini ��renmekten ibaret. Dilin �retecilerinden Zeev Suraski, bu y�l�n ba��nda �srail'de yap�lan ilk uluslararas� PHP Konferans�'nda "PHP ��renmek zor mu?" diye soran bir bilgisayar merakl�s�na �u cevab� veriyordu: "Bir haftadan fazla zaman ay�rman�z gerekiyorsa, sizin i�in zor demektir!"
PHP
Dili
PHP bir Script dilidir; PHP ile yazd���n�z "programlar" birer d�zyaz� dosyas�d�r. Dil �gelerini ayr�nt�l� olarak ele almadan �nce bir iki yaz�m kural�ndan s�z edelim.
PHP yorumlay�c�s�, bu "program�" �al��t�rabilmek i�in dosyan�n i�inde PHP komutlar�n� arar. PHP komutlar� birinci b�l�mde g�rd���m�z gibi iki �ekilde yaz�labilir:
1. <?PHP .... ?>
2. <? .... ?>
Bunlara PHP komut ayrac� denir; birinci t�r� uzun veya standart ayra� say�l�r; ikincisine ike "k�sa ayra�" denir. PHP yorumlay�c�s�n�n k�sa ayra� kullanmas�n� istemiyorsak, PHP.ini dosyas�ndaki, short_open_tag = On: sat�r�n� short_open_tag = Off; yapmak yeter. Bununla birlikte uzun vadede, PHP programlar�n�zda HTML yerine XML kullanmak istiyorsan�z, �imdiden elinizi uzun ayraca al��t�rman�z yerinde olur; ��nk� XML etiketleri "<?xml" �eklinde ba�lar ve "?>" �eklinde biter.
ASP ile �al��an Web programc�lar� "<?" ve ?>" yerine s�k s�k "<%" ve "%>" yazarlar! PHP dilini geli�terinler., �ok yayg�n olan bu hatan�n PHP programlar�n�n �al��mas�na engel olmas�n� �nlemek i�in bize bir kolayl�k sa�l�yorlar. E�er ASP ile �al��an ve daha sonra PHP'ye ge�en bir programc� iseniz, PHP.ini dosyas�n� a�arak, asp_tags = Off; sat�r�n� short_open_tag = On; yapabilirsiniz. �imdi art�k rahat�a ASP ayrac�n� PHP yazmak i�in kullanabilirsiniz!
PHP komutlar�n�z� daha uzun olmakla birlikte <SCRIPT> etiketiyle de kullanabilirsiniz. Yukar�daki �rnekte olu�turdu�umuz merhaba.PHP'yi a��n ve �u �ekilde de�i�tirerek, merhaba2.PHP ad�yla kaydedin:
<HTML>
<SCRIPT LANGUAGE="PHP">
print ("Merhaba D�nya!");
</SCRIPT>
</HTML>
Web sunucusunda bu program� a�arsan�z, ayn� sonucu ald���n�z� g�receksiniz. Burada bir yanl�� anlamaya yol a�mayal�m. Javascript veya VBScript gibi HTML kodlar�n�n i�ine g�md���m�z ve HTML sayfas�n�n i�inde, Web ziyaret�imizin bilgisayar�na g�nderilen ve orada (istemci-taraf�ndan) icra edilen ve yine ayn� �ekilde SCRIPT> etiketi i�ine koydu�umuz Script kodlar� ile burada <SCRIPT> etiketi ile ifad eetti�imiz PHP kodlar�n�n icra yerini kar��t�rmayal�m. PHP, nas�l bir ayra� ve etiket ile yazarsak yazal�m, daima sunucuda �al��t�r�lar ve ziyaret�iye asla PHP kodlar� g�sterillmez. merhaba2.PHP'nin �al��t��� Browser'da kayna�� g�r�nt�lersek, istemciye gelen kodlar�n saf-ve-temiz HTML oldu�unu g�rece�iz.
<php00008.tif>
PHP kodlar�m�z, olu�turulmas�n� istedi�imiz sayfan�n HTML kodlar� ile tabir yerinde ise i�i�e yaz�l�r. Bunun bir �rne�i olarak yukar�daki dosyay� ��yle de�i�tirerek, merhaba3.ad�yla kaydedin:
<HTML>
<HEAD>
<TITLE>PHP ile Merhaba</TITLE>
</HEAD>
<BODY>
<CENTER>
<B>
<H1>
<?PHP
print "Merhaba D�nya!";
?>
</H1>
</B>
</CENTER>
</BODY>
</HTML>
Sayfam�z�n g�r�nt�s�nde hi� bir de�i�iklik olmamakla birlikte, Browser'a giden HTML kodlar� �nemli �l��de de�i�mi� olacakt�r.
Ger�i burada hen�z ihtiyac�m�z yok; ��nk� bir bak��ta yazd���m�z kodun marifetini anlayabiliyoruz; ama cidd� PHP programc�l���na ba�lad���m�z zaman, hangi sat�rda neye niyet etti�imi anlamam�z daima m�mk�n olmayabilir. Biz kendi program�m�z� sat�r sat�r ezberlesek bile, i�birli�i yapt���m�z di�er Web programc�lar�n�n program�m�z� anlamalar�n� sa�lamam�z gerekir. Bunu, yorum sat�rlar� ile yapabiliriz. PHP ayra�lar� i�inde iki t�rl� yorum bulunabilir: �ok-sat�rl� yorumlar ve tek sat�rl� yorumlar. Birinci grubu, ba��na "/*" ve sonuna "*/* i�aretleri koyarak, ikinci grubu ise sadece ba��na *//* i�areti koyarak belirtiriz:
<HTML>
<!- - Bu sat�r HTML'in yorum sat�r�
Buraya istedi�imiz kadar yorum yazabiliriz..
Browser bu sat�rlar� dikkate almaz - - >
<HEAD>
<TITLE>PHP ile Merhaba</TITLE>
</HEAD>
<BODY>
<CENTER>
<B>
<H1>
<?PHP
/*
Bu sat�r da PHP'nin �ok-sat�rl� yorum b�l�m�..
Bunu da PHP yorumcusu asla dikkate almaz
Buraya istedi�imiz kadar yorum yazabiliriz.
*/
print "Merhaba D�nya!";
// Bu ise PHP'nin tek sat�rl� yorum b�l�m�
// Bu sat�rlar� da PHP yorumcusu dikkate almayacakt�r.
?>
</H1>
</B>
</CENTER>
</BODY>
</HTML>
PHP'rir bir di�er yorum i�areti ise # (Diyez) i�aretidir. Bu i�aretin ba��nda olrdu�u sat�r da PHP taraf�ndan dikkate al�nmaz:
<?PHP
# Bu sat�r PHP'nin �ok-sat�rl� yorum b�l�m�..
# Bunu da PHP yorumcusu asla dikkate almaz
# Buraya istedi�imiz kadar yorum yazabiliriz.
print "Merhaba D�nya!";
?>
Diyez ile yorum haline getirdi�imiz sat�rlar�n sonuna ba�ka i�aret koymaya gerek yoktur.
PHP'nin Yap� Ta�lar�
PHP, bir programlama dili olarak, de�i�kenler, de�i�kenlerin de�erleriyle bir i�lem yapmay� sa�layan i�lemciler, i�lemcilerle olu�turulan deyimler ve nihayet bunlar�n t�m�n� toplu olarak kullanmam�z� sa�layan i�levlere (fonksiyonlara) sahiptir. PHP, nesne-y�nelimli (object-oriented) bir dil oldu�u i�in, nesne olu�turma imkan�na ve bunlar�n kullan�lmas�n� sa�layan metodlara da sahiptir. B�t�n bu imkanlar� kullanarak, PHP ile bir veritaban�ndan veri alarak, bunlar� HTML etiketlerinin de�erleri olarak kullanabiliriz; Web sitemizi ziyaret eden ki�ilerden bilgi alabiliriz, bu bilgilerle i�lemler yapabiliriz. PHP'nin �e�itli komutlar�n�, deyimlerini ve fonksiyonlar�n� kullanarak, program�m�z�n �al��t��� Web sunucusunun bulundu�u bilgisayara da �e�itli dosya i�lemleri yapt�rabiliriz.
////////////////KUTU///////////
PHP program�n� durdurmak
�imdi belki PHP'yi durdurmay� hi� d���nm�yorsunuz; ama ilerde bir fonksiyonun verece�i sonucun b�t�n program�n durdurulmas�n� gerekti�i zamanlar olabilir. PHP'nin resm� el kitab�na bile ilk bask�s�nda konulmas� unutulmu� olan program� durdurma komutu, exit kelimesidir; hi� bir parametre almadan �al���r.
//////////////////KUTU
B�TT�///////////
Bu t�r karma��k uygulamalara ge�ebilmek i�in �nce, PHP dilinin unsurlar�n� biraz yak�ndan inceleyelim.
De�i�kenler
Programc�l�kta i�lemlerimizi de�i�kenlerle yapar�z. De�i�keni bir kap gibi d���nebilirsiniz. S�zgelimi "G�n," de�i�kenin ad� ise bu de�i�kenin de�eri Pazar, Pazartesi, Sal�, vd., olabilir. Her de�i�ken, t�r�ne g�re, ya bir ya da daha fazla de�er tutar. Ad�ndan da anla��laca�� gibi de�i�kenin de�eri de�i�ir! Bu de�i�ikli�i biz yapabiliriz; program�n kendisi yapabilir.
PHP'de de, bir �ok ba�ka bilgisayar programlama dilinde oldu�u gibi de�i�kenlerin i�ine bir de�er konmadan �nce tan�mlanmas� m�mk�nd�r; fakat gerekli de�ildir. De�i�kenleri ad�n�n �n�ne $ i�areti koyarak tan�mlar�z:
$adi;
$soyadi;
$123;
$sevdigiRenk;
De�i�kenler, harf, rakam veya alt �izgi (_) ile ba�layabilirler; bu karakterleri i�erebilirler; ama i�inde bo�luk veya di�er i�aretler bulunamaz. PHP de�i�kenleri her t�rl� de�i�ken tutabilirler: bir de�i�kenin ad�n�n yaz�l�� �ekli onun tutabilece�i de�erin niteli�ini belirlemez. Dolay�s�yla, "$adi" de�i�kenin de�eri "Re�it" da olabilir, "1255" de olabilir.
PHP'de genellikle de�i�kenleri de�erini atayarak belirleriz:
$adi = "Re�it";
$soyadi = "G�len";
$123 = 123;
$sevdigiRenk = "ye�il";
De�i�kenler, kullan�ld�klar� i�leme, ta��d�klar� de�eri verirler:
print $adi;
komutu, e�er de�eri "Re�it" ise "Browser penceresine "Re�it" kelimesini yazd�r�r.
PHP'de �zel bir de�i�kene de�i�ken ad� olarak kullan�lacak de�erleri de atayabiliriz:
$adi = "Re�it";
$degisken = "adi";
print $$degisken;
Burada Browser penceresine yine "Re�it" kelimesi yaz�lacakt�r; ��nk� PHP $degisken adl� de�i�kenin "adi" adl� de�i�keni tuttu�unu bilecek ve iki Dolar i�aretini g�r�nce, $degisken'in de�erini de�il, onun tuttu�u de�i�kenin de�erini yazacakt�r. Bu, size �u anda kar���k g�r�nebilir. Daha sonra d�ng�leri g�rd���m�zde bu tekni�i bir sat�rl�k kod ile y�zlerce de�eri yazd�rmakta kullanaca��z. Bu teknik ��yle de kullan�labilir:
$degisken = "adi";
$$degisken = "Re�it";
print "$adi";
print $$degisken;
print "${$degisken}";
print "${'adi'}";
Buradaki d�rt "print" komutu da Browser'a "Re�it" kelimesini yazd�racakt�r.
PHP'de bir de�i�kenin tuttu�u de�er, bir ba�ka de�i�kene atanabilir. Bu ya duragan, ya da dinamik olarak yap�l�r. Duragan y�ntemde:
$birinci_degisken = "Nurcan";
$ikinci_degisken = $birinci_degisken;
$birinci_degisken = "T�lay";
print $ikinci_degisken;
Buradaki "print" komutu Browser penceresine "Re�it" kelimesini yazd�racakt�r. �ki de�i�ken aras�ndaki de�er al��-veri�i birinci de�i�kenin tuttu�u de�eri de�i�tirmeden �nce oldu�u i�in, ikinci de�i�ken birinci de�i�kenin ilk de�erini alm�� oldu. Fakat kimi zaman iki de�i�ken aras�ndaki de�er al��-veri�i s�rekli (dinamik) olsun isteriz. PHP, buna, ilk atama s�ras�nda & i�areti kullan�rsak izin verir:
$birinci_degisken = "Nurcan";
$ikinci_degisken = &$birinci_degisken;
$birinci_degisken = "T�lay";
print $ikinci_degisken;
Buradaki "print" komutu ise Browser penceresine "T�lay" kelimesini yazd�racakt�r. ��nk� iki de�i�ken aras�ndaki de�er al��-veri�i birinci de�i�kenin tuttu�u de�eri de�i�tirmeden �nce halde, ikinci de�i�kene birinci de�i�kenin de�erini dinamik olarak atam�� olduk. Atama i�lemi s�ras�nda & i�areti kulland���m�z i�in, birinci de�i�kenin de�eri de�i�ti�inde ikinci de�i�kenin de de�eri de�i�ecektir.
Veri T�rleri
PHP, de�i�kenlere, tuttuklar� de�ere g�re farkl� bellek alan� tahsis eder; bu bak�mdan verilerimizin t�r� etkin bir programc�l�k a��s�ndan �nem ta��r. Ayr�ca PHP, di�er b�t�n programlama dilleri gibi belirli veri t�rleri ile belirli i�lemleri yapar veya yapamaz. �rne�in, ancak iki say� aras�nda aritmedik toplama yap�labilir. �ki metin tutan de�i�ken aritmetik olarak toplanamaz; ancak i�erdikleri de�erler ardarda eklenebilir. Ne var ki, PHP sizin aritmetik toplama m�, yoksa ardarda ekleme mi yapmak istedi�inizi bilmek durumunda de�ildir. (PHP'ye 'muazzam dil' dedik; i�inde yapay zek� var demedik!) Dolay�syla de�erleri 5 ile 6 olan iki de�i�keni toplad���n�z zaman ortaya 11 yerine 56 ��karsa, kabahati PHP'de de�il, de�i�kenlere veri atayan ki�ide (b�y�k bir ihtimalle kendinizde) aramal�s�n�z.
PHP a��s�ndan d�nyada alt� t�r de�er vard�r:
Tamsay� (Integer): 5,124, 9834 gibi
�ift (Double): 3,567 gibi
Alfan�merik (String): "Re�it" gibi
Mant�ksal (Boolean): do�ru (true)/yanl�� (false) gibi
Nesne (Object)
Dizi (Array)
Baz� uzmanlara g�re, ger�ekte PHP'de mant�ksal (boolean) de�i�ken t�r� yoktur. B kan�n�n sebebi, PHP'nin true (do�ru) ya da false (yanl��) olarak atad���m�z de�erleri 1 ve bo�/null de�erlere �evirmesi, mant�ksal olarak sorguland���nda 0 d���ndaki tam ve ondal�k de�i�kenleri TRUE, 0'� FALSE saymas�, ve bo� alfan�merik de�i�kenleri FALSE, dolu alfan�merik de�i�kenleri ise TRUE olarak de�erlendirmesidir. Ancak daha sonra gerece�imiz gibi PHP, Mant�ksal/Boolean ad�nda bir de�i�ken de�i�tirme fonksiyonuna sahiptir ve bu t�r de�i�kenlerin t�r� soruldu�unda "boolean" kar��l���n� verir.
T�r De�i�tirme
De�i�kenlere atad���m�z de�erlerinin t�rlerini genellikle biliriz; ama y�zlerce de�i�kenle u�ra�t���m�z bir Web program�nda de�i�ken t�r�n� unutmak �ok kolayd�r. Kimi zaman da de�i�kenlere program yoluyla de�er atar�z; ba�ka bir deyi�le program�m�z baz� de�i�kenleri kendisi olu�turabilir, ve bunlara kendisi de�er atayabilir. Bu t�r program yoluyla atanan de�erlerin de t�r�nde ku�kuya kap�ld���m�z anlar olabilir. Bir de�i�kenin de�erinin t�r� hakk�nda ku�kunuz varsa, en emin yol bunu PHP'nin kendisine sormakt�r. Bu sorgulamay� gettype() fonksiyonu ile yapar�z.
/////////////////KUTU/////////
Fonksiyon
PHP'nin gettype() ve print() gibi, kendi i�inde bulunan kullan�lmaya haz�r bir �ok fonksiyonu vard�r. Daha sonra kendi fonksiyonlar�m�z� yazman�n yollar�n� da g�rece�iz. Programc�l�k dilinde ister dile ait olsun, ister kendimiz yazm�� olal�m, bir fonksiyonu kullanmaya "fonksiyon �a��rma" denir. Fonksiyonlar da fonksiyon �a��rabilirler. �a�r�lan bir fonksiyon ya kendisinden beklenen i�i yapar, ya da kendisini �a��ran i�leme veya fonksiyonu bir de�er sunar. Buna fonksiyondan d�nen de�er denir.
////////////////////KUTU
B�TT�///////////
�imdi, bir PHP program� yazal�m, bir tak�m de�i�kenlere de�erler atayal�m ve bunlar�n t�rlerini PHP'ye soral�m. Bir d�zyaz� program� ile �u metni yaz�n ve turler.php ad�yla kaydedin:
<HTML>
<HEAD>
<TITLE>PHP'de Degisken Turleri</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<B>
<H2>
<?php
$sayi = 5;
print("Birinci de�i�kenin ad�: \$sayi<br>");
print("De�eri : ");
print "$sayi<br>";
print("T�r� : ");
print gettype( $sayi ) ; //tamsayi/integer
print "<br>";
print "<br>";
$alfanumerik = "Re�it";
print "�kinci de�i�kenin ad�: \$alfanumerik<br>";
print "De�eri : ";
print "$alfanumerik<br>";
print("T�r� : ");
print gettype( $alfanumerik ) ; //alfan�merik/string
print "<br>";
print "<br>";
$ondalik = 5.1234;
print "���nc� de�i�kenin ad�: \$ondalik<br>";
print "De�eri : ";
print "$ondalik<br>";
print("T�r� : ");
print gettype( $ondalik ) ; //�ift,ondal�k/double
print "<br>";
print "<br>";
$mantiksal = true;
print "���nc� de�i�kenin ad�: \$mantiksal<br>";
print "De�eri : ";
print "$mantiksal<br>";
print("T�r� : ");
print gettype( $mantiksal ) ; //mant�ksal/boolean
print "<br>";
print "<br>";
?>
</H2>
</B>
</BODY>
</HTML>
Bu program� �al��t���m�zda kar��m�za ��yle bir g�r�nt�n�n gelmesi gerekir:
<php00009.tif>
Burada mant�ksal (boolean) de�er olarak do�ru anlam�na true de�eri atad���m�z halde, PHP'nin bu de�i�kenin de�eri olarak 1'i g�sterdi�ine dikkat edin. PHP'de bir fonksiyon, elde etti�i de�er do�ru ise sonu� olarak 1 de�erini verir. (Yanl��/false de�erinin neye �evrildi�ini bulabilir misiniz?)
///////////////KUTU//////////
Escape
turler.php dosyas�n� yazd�ysan�z, �u sat�rdaki, ters-b�l� i�areti dikkatinizden ka�mam�� olmal�:
print "�kinci de�i�kenin ad�: \$alfanumerik<br>";
Daha �nce g�rd�k ki, tek veya �ift t�rnak i�ine de alsak, PHP, bir de�i�ken ad�n� g�rd��� zaman onun yerine o de�i�kenin tuttu�u de�eri yazar. PHP bunu, de�i�ken ad�n�n ba��ndaki $ g�rerek yaparak. $ i�areti gibi PHP i�in �zel anlam� olan i�aretlerin anlamland�r�lmas�n� �nlemek ve bu i�aretleri d�z metin saymas�n� sa�lamak i�in bu i�aretlerin �n�ne ters-b�l� i�areti koyar�z. Buna o karakteri kurtarma veya ESCaping denir. PHP'nin anlaml� i�aretleri ve bunlar�n ESCape-yaz�l��� ��yledir:
\' Tek t�rnak
\" �ift t�rnak
\\ Ters-b�l�
\$ Dolar i�areti
\n Yeni Sat�r (New Line)
\r Sat�r Ba�� (Return)
\t Sekme (Tab) karakteri
///////////////////////////KUTU////////////////
Kimi zaman bir de�i�kene atad���m�z de�erin t�r�n� de�i�tirmek gerekir. Bunu settype() fonksiyonu ile yapar�z. Elimizde b�yle bir imkan var diye, bir de�i�kenin alfan�merik (String) olan de�erini say�ya �evirebilece�ini sanmay�n. PHP buna �ok k�zar! �u �rne�i de tur_degistir.php ad�yla kaydedelim:
<HTML>
<HEAD>
<TITLE>PHP'de Degisken Turleri</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<B>
<H2>
<?php
$degisken = 5.67890;
print("De�i�kenin de�eri : ");
print "$degisken<br>";
print("T�r� : ");
print gettype( $degisken ) ; //�ift,ondal�k/double
print "<br>";
print "<br>";
print "�lk de�i�tirme i�lemi: Alfan�merik/String:<br>";
settype( $degisken, string ); //alfan�merik/string
print "De�eri : ";
print "$degisken<br>";
print("T�r� : ");
print gettype( $degisken ) ; //alfan�merik/string
print "<br>";
print "<br>";
print "�kinci de�i�tirme i�lemi: Tamsay�/Integer:<br>";
settype( $degisken, integer ); //Tamsay�/Integer
print "De�eri : ";
print "$degisken<br>";
print("T�r� : ");
print gettype( $degisken ) ; //Tamsay�/Integer
print "<br>";
print "<br>";
print "���nc� de�i�tirme i�lemi: Ondal�k/Double:<br>";
settype( $degisken, double ); //�ift,ondal�k/double
print "De�eri : ";
print "$degisken<br>";
print("T�r� : ");
print gettype( $degisken ) ; //�ift,ondal�k/double
print "<br>";
print "<br>";
print "D�rd�nc� de�i�tirme i�lemi: Mant�ksal/Boolean:<br>";
settype( $degisken, boolean ); // Mant�ksal/Boolean
print "De�eri : ";
print "$degisken<br>";
print("T�r� : ");
print gettype( $degisken ) ; // Mant�ksal/Boolean
print "<br>";
print "<br>";
?>
</H2>
</B>
</BODY>
</HTML>
Bu program� �al��t�rd���m�zda, ilk atad���m�z de�erin ondal�k/double olarak belirlendi�ine dikkat edin. Bu de�erin t�r�n� alfan�merik/string olarak de�i�tirdi�imizde de�i�medi�ini g�r�yoruz. Fakat tamsay�/integer'a �evirdi�imizde PHP de�erin tamsay� b�l�m�n� al�yor; ondal�k-kesir b�l�m�n� at�yor. Nitekim daha sonra de�i�kerin t�r�n� yeniden ondal�k yapt���m�z halde, at�lan bu b�l�m geri gelmiyor. Son olarak de�i�keni mant�ksal ifade olarak de�i�tirdi�imizde, de�erin do�ru/true oldu�unu anl�yoruz; de�er olarak bize 1 d�n�yor. PHP, s�f�r d���ndaki t�m de�erleri do�ru/true'ya �evirir; s�f�r'� ise yanl��/false olarak atar ve bo�/null de�er verir.
<php00010.tif>
�u anda PHP'yi tam bilemedi�imiz i�in nerede kullan�l�r kestiremiyoruz, ama diyelim ki burada oldu�u gibi, de�i�keni bir daha d�zelmeyecek �ekilde de�i�ikli�e u�ratmak istemeyebiliriz; fakat yine de de�erinin t�r�n� de�i�tirmek isteyebiliriz. Bunu da nerede kullanabiliriz, �u anda bilmiyoruz. Ama diyelim ki, b�yle bir i�lem yapmaya ihtiyac�m�z oldu! Hat�rl�yor musunuz, biraz �nce �zel bir �ekilde bir de�i�kene ba�ka bir de�i�kenin ad�n� de�er olarak vererek, asl�nda bu de�i�kenin ilk de�i�kenin de�erini almas�n� sa�lam��t�k. Burada da ayn� tekni�i kullanabiliriz. Bu kodu da tur_kopyala.php ad�yla kaydedin:
<HTML>
<HEAD>
<TITLE>PHP'de Degisken Turleri Kopyalama (Casting)</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<B>
<H2>
<?php
$degisken = 3.1418;
print("De�i�kenin de�eri : ");
print "$degisken<br>";
print("T�r� : ");
print gettype( $degisken ) ; //�ift,ondal�k/double
print "<br>";
print "<br>";
print "�lk kopyalama i�lemi: Alfan�merik/String:<br>";
$kopya_degisken = ( string ) $degisken; //alfan�merik/string
print "De�eri : ";
print "$kopya_degisken<br>";
print("T�r� : ");
print gettype( $kopya_degisken ) ; //alfan�merik/string
print "<br>";
print "<br>";
print "�kinci kopyalama i�lemi: Tamsay�/Integer:<br>";
$kopya_degisken = ( integer ) $degisken; //Tamsay�/Integer
print "De�eri : ";
print "$kopya_degisken<br>";
print("T�r� : ");
print gettype( $kopya_degisken ) ; //Tamsay�/Integer
print "<br>";
print "<br>";
print "���nc� de�i�tirme i�lemi: Ondal�k/Double:<br>";
$kopya_degisken = ( double ) $degisken; //�ift,ondal�k/double
print "De�eri : ";
print "$kopya_degisken<br>";
print("T�r� : ");
print gettype( $kopya_degisken ) ; //�ift,ondal�k/double
print "<br>";
print "<br>";
print "D�rd�nc� kopyalama i�lemi: Mant�ksal/Boolean:<br>";
$kopya_degisken = ( boolean ) $degisken; // Mant�ksal/Boolean
print "De�eri : ";
print "$kopya_degisken<br>";
print("T�r� : ");
print gettype( $kopya_degisken ) ; // Mant�ksal/Boolean
print "<br>";
print "<br>";
?>
</H2>
</B>
</BODY>
</HTML>
Bu program�n can al�c� noktas� �rne�in "$kopya_degisken = ( boolean ) $degisken;" �eklindeki komut; burada $kopya_degisken adl� de�i�kene $degisken adl� de�i�kenin de�erini (e�ittir i�areti ile) kazand�r�rken, arada yeni de�i�kenin kazanmas�n� istedi�imiz t�r�n ad�n� parantez i�inde yaz�yoruz. Burada ger�ekte, $degisken adl� de�i�kenin de�erine hi� bir �ey olmuyor. Bu program� �al��t�r�rsan�z, ilk de�erin ontal�k k�sm�n�n �nceki �rnekte oldu�u gibi de�i�im i�lemi sonunda tamamen yok olmad���n� g�rebilirsiniz.
<php00011.tif>
$degisken adl� de�i�kenin de�eri de�i�meden durdu�u i�in ���nc� ad�mda y�pt���m�z ondal�k t�r olarak kopyalama sonucu yeni de�i�kenin de�eri yine kesiri ile kar��m�za ��k�yor.
////////////////KUTU///////////
D�rt yararl� fonksiyon
PHP'de de�i�ken de�er t�r� de�i�tirmekte kullanabilece�imiz kullan�lmaya haz�r fonksiyon vard�r. ilerde d�ng�leri ele ald���m�zda daha �ok anlam kazanacak olan bu de�i�kenleri �imdilik bir kenara kaydedin:
isset() ve unset()
PHP, bir de�i�ken tan�mland��� anda, sanki i�inde de�er varm�� gibi, bilgisayar�n belle�inde yer ay�r�r. Bu bazen bilgisayar�n k�t kaynaklar�n� zorlayabilir. isset() fnksiyonu, PHP'nin bir de�i�kenin i�inde de�er bulunup bulunmad���n� s�namas�n� sa�lar. unset() ise varolan bir de�i�keni yok eder. Bu iki fonksiyonu birlikte kullanabiliriz ve bo� de�i�kenleri yok ederek, bilgisayar�n belli�inde yer a�abiliriz:
if (isset($bir_degisken)) {
print( $bir_degisken );
}
else {
unset($bir_degisken);
}
Bu kod par�as�, $bir_degisken isimli d�i�kenin i�i bo� de�i�se, i�eri�ini g�r�nt�leyecek, i�i bo� ise varl���na son verecektir.
empty()
isset() fonksiyonun tersi i�leve sahiptir; bir de�i�kene de�er atanmam��sa, veya de�eri s�f�r veya bo� alfan�merik (null string) ise, do�ru (True) de�eri verir.
$bir_degisken = 123;
echo empty($bir_degisken);
$bir_degisken = "";
echo empty($bir_degisken);
Bu program par�as� Browser penceresine sadece empty() fonksiyonun do�ru sonu� verdi�i birinci echo() deyiminde 1 yazd�racakt�r.
is_string(),is_integer(),is_double(),
S�nad�klar� de�i�kenin arad�klar� t�rden de�er i�ermesi halinde do�ru 'True) sonu� verirler.
<?php
$a = 6.567;
if (is_double($a)) {
print ("A Double'd�r<br>");
}
$b = "Re�it";
if (is_double($a)) {
print ("B String'dir<br>");
}
$c = 6;
if (is_int($c)) {
print ("C Integer'd�r<br>");
}
?>
Bu kod, Browser penceresine "A double'd�r, B String'dir, C Integer'd�r" yazd�racakt�r. PHP'de bu fonksiyonlara benzeyen fakat ba�ka t�r de�er arayan �u fonksiyonlar da vard�r: is_array(), is_object.
intval(), doubleval(), doubleval()
Bir de�i�kenin de�erinin t�r�n� ba�ka bir t�re �evirmeye yararlar. intval(), ortaya ��kartaca�� tamsay� de�i�kenin 10 tabanl� (decimal) veya 16 tabanl� (hexadecimal) olmas�n� sa�layan ikinci bir arg�man alabilir:
<?php
$a = "123ABC";
$b = inval($a, 16)
print ($b);
?>
Bu program Browser penceresine, 123'�n hexadecimal ifadesi olan "1194666" yazd�racakt�r.
��lemciler (Operat�rler)
Yukar�daki �rnekleri birlikte yapt�ysak, = i�aretini bol bol kulland�k ve b�ylece PHP'nin bir �ok operat�r�nden biriyle tan��t�k. Buna PHP dilinde "atama operat�r�" denir. Bu i�lemci sadece yukar�da kulland���m�z gibi, bir de�i�kenin bir de�ere e�itli�ini ilan etmek amac�yla kullan�lmaz. �rne�in:
print ( $sayi = 123 ) ;
ifadesinde oldu�u gibi, bir fonksiyonun i�inde de hem atama i�lemi yap�labilir; hem de i�lem y�r�t�l�r. PHP'nin aritmetik, birle�ik-atama, birle�tirme, kar��la�t�rma ve mant�ksal s�nama operat�rleri vard�r.
Aritmetik i�lemciler:
+ Toplama 6+5 = 11
- ��kartma 6-5 = 1
/ B�lme 6/5 = 1.2
* �arpma 6*5 = 30
% Kalan (Modulus) 6%5 = 1
Aritmetik i�lemleri ger�ek say�larla yapt���m�z gibi, tuttu�u de�er say� olan de�i�kenlerle de yapabiliriz.
Daha �nce, PHP'de de�i�ken tan�mlar ve bunlara de�er atarken say� olan de�i�kenleri t�rnak i�areti kullanmadan, alfan�merik de�i�kenleri ise t�rnak i�inde yazd���m�z� hat�rlayacaks�n�z. Bu, geleneksel hale gelmi� olan bir programc�l�k al��kanl���d�r. PHP, t�rnak kullanmasan�z da bir de�i�kenin say� olup olmad���n� anlar; daha sonra bu de�i�kenlerle aritmetik i�lem yapabilir. PHP ayr�ca rakamla ba�layan alfan�merik de�i�kenleri say� olarak kullanmaya kalkt���n�zda, bu de�erin ba��ndaki b�t�n rakamlar� say� olarak kabul eder. PHP a��s�ndan harf veya i�aretle ba�layan alfan�merik de�i�kenlerin say� olarak de�eri s�f�rd�r. �rnek:
$a = 6;
$b = "22/A"
print ($a + $b)
sonu� olarak 28'i verecektir; veya
$a = 6;
$b = "A/22"
print ($a + $b)
sonu� olarak 6 ��kacakt�r. Bu k���k deneyi yaparsan�z, PHP ile program yazarken hangi de�i�kenin ne sonu� vermesi gerekti�ini dikkatle d���nmek zorunda oldu�unuzu g�r�rs�n�z. Bir ki�inin geliri ile adresini toplamak, programc� olarak arzu etti�iniz bir i�lem olmayabilir!
Bununla birlikte elimizde bir ki�inin ad� ve soyad� ayr� de�i�kenler halinde ise, bunlar� birbirine ekleyerek (concatenation) ortaya yeni bir alfan�merik de�i�ken ��kartabiliriz:
<?php
$adi = "Re�it";
$soyadi = "Muhtar";
$adi_soyadi = $adi . " " . $soyadi;
print ("<br>");
print ($adi_soyadi);
print ($adi . "'n�n soyad� " . $soyadi . "'dir.")
?>
Bu �rnekte, sadece ekleme yoluyla yeni bir de�i�ken olu�turmakla kalm�yoruz; fakat alfan�merik de�i�kenleri, ba�ka metinlerle de birbirine ekleyebildi�imizi g�r�yoruz. Bu i�lemi nokta i�aretiyle (.) yap�yoruz. Bu i�lemciyle sadece de�i�kenlerin de�erlerini de�il fakat metinleri de birbirine ekleyebiliriz:
<?php
print ("�yileri iyikleri ile alk��la; " . "..." . "ve sen soluklar�nda daima Mes�h ol..! ")
?>
PHP'nin atama i�lemcisinin e�ittir (=) i�areti oldu�unu hat�rl�yorsunuz birle�ik-atama (combined-assignment) i�lemcileri, bu i�arete di�er aritmetik i�lemciler eklenerek olu�turulur.
��lemci �rnek
Anlam�
+= $a += 5 $a = $a + 5
-= $a -= 5 $a = $a - 5
/= $a /=5 $a = $a / 5
*= $a *= 5 $a = $a * 5
%= $a %= 5 $a = $a % 5
.= $a .= "metin" $a = $a" metin"
Bu i�lemi zihnimizde, "A de�i�keninin mevcut de�erine 5 ekle, ��kan sonucu A de�i�kenin yeni de�eri yap!" �eklinde canland�rabiliriz.
/////////////////KUTU//////////////
Bir Artt�rmak veya Azaltmak i�in
De�erleri sadece 1 artt�rmak veya azaltmak i�in PHP, bir kolayl�k sa�lar:
$a++veya ++$a: $a'n�n de�erini 1 artt�r�r;
$a--veya --$a: $a'n�n de�erini 1 eksiltir.
++ veya -- i�aretinin de�i�ken ad�ndan �nce veya sonra olmas�n�n sonucu farkl� olur. ��aretler de�i�kenin ad�ndan �nce ise PHP �nce de�i�kenin de�erini bir artt�r�r veya eksiltir, sonra bu yeni de�eri i�leme katar; i�aretler de�i�ken ad�ndan sonra ise, PHP de�i�kenin o andaki de�erini i�leme kadar, sonra de�eri bir artt�r�r veya eksiltir.
/////////////////////KUTU
B�TT�/////////////
PHP'nin kar��la�t�rma yapmas� i�in kulland���m�z i�lemciler ise i�lem i�aretinin sa�� ve solundaki de�erleri veya de�i�kenlerin de�erlerini i�aretin belirtti�i kar��la�t�rmay� yapt�ktan sonra ortaya ya do�ru (true) ya da yanl�� (false) sonucunu ��kart�rlar. S�z gelimi, de�eri 6 olan de�i�kenin 5'ten b�y�k olup olmad���n� s�narsak, sonu� do�ru; 5'ten k���k olup olmad���n� s�narsak sonu� yanl�� ��kacakt�r. PHP'nin kar��la�t�rma i�lemcileri �unlard�r:
��lemci �rnek
�rnek $a=6
ise:
== e�itse $a == 5 Yanl��/False
!= e�it de�ilse $a != 5 Do�ru/True
=== ayn� ise $a === 5 Yanl��/False
> b�y�kse $a > 5 Do�uru/True
< k���kse $a < 5 Yanl��/False
<= k���kse $a <= 5 Yanl��/False
veya e�itse
>= b�y�kse $a >= 5 Do�ru/True
veya e�itse
PHP'nin kar��la�t�rma i�lemcileri hem tam ve ondal�k say� t�r� de�erlerle, hem de alfan�merik de�erlerle kullan�labilir.
Daha ileri a�amalarda, bazen de�i�kenlerimizin kar��la�t�rmas�n�n bu kadar basit olamayaca��n�; kimi zaman iki grup de�i�kenin kar��la�t�r�lmas� gerekti�i durumlar�n bulundu�u g�rece�iz. Diyelim ki, bir ��rencinin ba�ar�l� say�lmas� i�in hem vize notunun, hem de y�lsonu s�nav notunun belirli say�lardan b�y�k olmas� gerekiyor. Bu durumu ancak karma��k-mant�ksal s�namadan ge�irmemiz gerekir. Bu s�namay� iki ayr� s�nama sonucu ile birlikte kullan�r�z. �rne�in:
vize notu yeterli - final notu yetersiz = kal�r (yanl��/false)
vize notu yeterli - final notu yeterli = ge�er (do�ru/true)
PHP'de bu kar��la�t�rmay� iki grubun aras�na koydu�umuz i�aretlerle yapar�z ��aretin sa� ve sol taraf�n�n do�rulu�u veya yanl����� i�arete g�re nihai sonucun do�ru veya yanl�� olmas�n� sa�lar. Bu kar��la�t�rmalar� yaparken �u i�lemcileri kullan�r�z:
��lemci Ad�
Anlam�
�rnek
|| veya sol veya sa� do�ru do�ru || yanl�� = do�ru
or veya sol veya sa� do�ru do�ru || yanl�� = do�ru
&& ve sol ve sa� do�ru do�ru || yanl�� = yanl��
and ve sol ve sa� do�ru do�ru || yanl�� = yanl��
Xor �artl�-veya Sadece sol veya sa� do�ru do�ru || yanl�� = do�ru
! De�il sol veya sa� yanl�� do�ru || yanl�� = do�ru
"veya" ve "ve" s�namalar� i�in iki ayr� i�lem i�areti bulunmas�n�n sebebi, PHP'nin i�lem s�ras�yla ilgilidir. Birazdan oraya geliyoruz. �imdi, kavranmas� kolay olmayan ikili mant�ksal s�namalara bir �rnek verelim; yukar�da ��rencinin durumunu PHP komutu olarak yazal�m.
<?php
$vize = 45;
$final = 65;
if ($vize >= 50 && $final >= 50) {
print ("��renci ge�ti!");
}
else {
print ("��renci kald�!");
}
?>
Mant�ksal kar��la�t�rma i�lemleri daha da karma��k olabilir. �rne�in, ��rencinin ge�mi� say�lmas� i�in y�lsonu vize ve final notlar�n�n 45'dan y�ksek, ve ya birinci s�mester notunun ya da vize ve final notlar�n�n ortalamas�n�n 65'den y�ksek olmas� �art� aranabilir. (Kabul; k�t� bir �rnek oldu. Ama s�rf al��t�rma i�in!) Bu durumda kodu ��yle yazmam�z gerekirdi:
<?php
$vize = 45;
$final = 65;
$ilk_sem = 45;
$ortalama = ($vize + $final) / 2;
if (($vize >= 45 && $final >= 45) and ($ilk_se >= 65 || $ortalama >= 65)) {
print ("��renci ge�ti!");
}
else {
print ("��renci kald�!");
}
?>
Burada, PHP �nce || veya && i�aretinin sonucunu bulacak sonra and veya or i�lemcisinin gere�ini yapa�akt�r. Bu kodun verece�i sonucu, bilgisayarda �al��t�rmadan tahmin edebilir misiniz? �pucu: Bu ��rencinin yerinde olmak istemezdim!
��lem �nceli�i deyince.. B�t�n programlama dilleri gibi PHP i�in de i�lemlerin hangi s�rada yap�ld��� �nem ta��r. "5 + 4 * 2" i�leminin sonucu, �nce 5 ile 4'�n toplanmas� ve sonucun 2 ile �arp�lmas� halinde ba�ka, 4'�n 2 ile �arp�lmas� ve sonucun 5 ile toplanmas� halinde ba�ka olacakt�r. Bu bak�mdan, PHP'nin hangi i�lemi �nce yapt���, hangi i�lemi sonra yapt���n� bilmemiz gerekir. PHP'deki i�lemlerin yap�l�� s�ras� ��yledir:
++ ve --
/ * %
+ -
< <= => >
== === | =
&&
||
= += -= /= %= .=
and
xor
or
r.
Sabit De�erler
�ster Web, ister Web-d��� ama�l� olsun, bir program�n bazen ba��ndanh sonuna kadar de�eri de�i�meyen de�i�kene ihtiyac� olabilir. "De�eri de�i�meyen de�i�ken" teriminin anlams�z oldu�u kan�s�nda iseniz, bunlara sabit de�erler ad�n� da verebilirsiniz! PHP'de sabit de�erler, Script boyunca de�i�meden kal�r.
Sabit de�erler, de�i�kenlerden farkl� �ekilde olu�turulur. Bunun i�in PHP'nin define() fonksiyonunu kullan�r�z. Bu fonksiyonun yaz�m kural� ��yledir:
define ("SABIT_DEGER", de�er);
Burada SABIT_DEGER yerine, tan�mlamak istedi�imiz sabit de�ere verece�imiz isim, de�er yerine de sabit de�eri yazar�z. �rnek:
<?php
$Dolar_miktar = 125;
define ( "DOLAR_KURU", 625675);
$TL_Tutar = $Dolar_miktar * DOLAR_KURU;
print ($TL_Tutar);
?>
Burada tan�mlad���m�z DOLAR_KURU sabit-de�eri, t�pk� bir de�i�ken gibi kullan�labilir. Fakat bir sabit de�eri tan�mlad�ktan sonra i�eri�ini de�i�tiremezsiniz. Sabit de�er ile ayn� ismi ta��yan de�i�ken olu�turmak m�mk�nd�r; ancak ayn� ismi ta��sa da bir sabit ile de�i�keni (birinin ad�n�n �n�nde $ i�areti bulundu�u i�in) kar��t�rmak kolay olmasa gerek.
Tan�mlanm�� olan bir sabiti yeniden olu�turamay�z; ama buna te�ebb�s etti�imizde PHP hata vermez. Bir sabit de�erin olu�turulmu� olup olmad���n� defined() fonksiyonu ile anlayabiliriz:
<?php
$Dolar_miktar = 125;
if (defined( "DOLAR_KURU" )) {
echo ("Sabit de�er daha �nce tan�mlanm��t�.<br>");
}
define ( "DOLAR_KURU", 625675);
$TL_Tutar = $Dolar_miktar * DOLAR_KURU;
print ($TL_Tutar);
?>
Bu program�, bu �ekilde ve define() komutunu en �st sat�ra alarak �al��t�r�rsan�z, ikinci �al��t�r���n�zda program�n sabit de�eri yeniden olu�turmay� reddetti�ini g�recektiniz. Sabit de�erleri, Web sitesinde ziyaret�ilerin girdi�i verilerden alarak kendili�inden olu�turan bir program yazd���n�zda, defined() fonksiyonu mant�ksal hata yapman�z� �nler.
PHP'nin kullan�lmaya haz�r bir ka� sabid de�eri vard�r. True (do�ru) de�eri 1 olan, False (yanl��) ise de�eri s�f�r say�s� veya bo� alfan�merik olan iki sabittir. Di�er sabitler �unlard�r:
__FILE__ : O anda �al��makta olan PHP dosyas�n�n ad� (kelimenin �n�nde ve sonunda iki alt-�izgi var);
__LINE__ : Bu ifadenin yer ald��� sat�r�n say�s� (kelimenin �n�nde ve sonunda iki alt-�izgi var);
PHP_VERSION: PHP'nin s�r�m� (�ki kelimenin aras�nda bir alt-�izgi var);
PHP_OS: PHP'nin �al��t��� i�letim sistemi (�ki kelimenin aras�nda bir alt-�izgi var);
PHP_VERSION : PHP'nin s�r�m� (�ki kelimenin aras�nda bir alt-�izgi var);
Bunlara ek olarak, E_ERROR, E_WARNING, E_NOTICE ve E_PARSE �eklinde hata durumunda hatan�n �e�itli �zelliklerini bildiren sabit de�erleri de kullanabiliriz.
PHP hakk�nda �ok daha geni� bilgiyi phpinfo() fonksiyonunu �a��rak alabilirsiniz.
//////////////////KUTU//////////////
Tarih ve saat Verisi
PHP, o andaki zaman bilgisini, saat, dakika, saniye ve salise olarak; tarih bilgisini y�l, ay, g�n (say� veya isim olarak), program�m�z�n herhangi bir yerinde bize bildirebilir. Bu bilgiyi Web sunucusunda istedi�imiz anda, muhtemelen sunucunun bulundu�u bilgisayar�n sistem saatinden alacak olan PHP, sunucu program�nda farkl� b�lgesel ayarlar i�in gerekli d�zenleme yap�lm��sa, bu imkandan yararlanarak bize sunucunun de�il, arzu etti�imiz b�lgenin saat ve tarihini bildirebilir.
�zellikle T�rkiye'de olmayan bir sunucuda bu imkan�n bulunup bulunmad���n�, ancak s�nayarak veya sistem y�neticisine sorarak ��renebiliriz. B�ylebir s�Nama i�in �u kodlar� program�n�z�n ba��na koyun:
<?php
setlocale ("LC_TIME", "TR");
print (strftime ("T�rk�e bug�n g�nlerden: %A "));
?>
Browser penceresinde "T�rk�e bug�n g�nlerden Sunday" yaz�s�n� okursan�z, sunucuda T�rk�e i�in b�lgesel ayar deste�i yok demektir!
PHP'nin zaman ve tarih belirlemekte kullanabilece�iniz ba�l�ca fonksiyonu getdate() ise �x�yle kullan�l�r.
getdate() Tarih ve saat bilgisini al�r ve ve verece�iniz bir isimdeki dizi-de�i�kende kaydeder. �rnek:
$saat_tarih = getdate()
Bu durumda, $saat_tarih dizi de�i�keninde s�ras�yla �u bilgiler yer al�r:
32 saniye
57 dakika
6 saat
30 ay�n g�n say�s� (1-31)
0 haftan�n g�n say�s� (1-7)
7 ay�n say�s� (1-12)
2000 y�l
211 y�l�n ka��nc� g�n�
Sunday g�n�n ad�
July ay�n ad�
964929452 Unix sistemlerinde Epoch bi�iminde zaman bilgisi
PHP'nin tarih ve saat bilgisini bi�imlendirmede yararland���m�z date() fonksiyonunu daha sonra metin bi�imlerdirme b�l�m�nde ele alaca��z
PHP'de Program Denetimi
Bilgisayar program�, belirli de�erlere g�re kendi izleyece�i yolu kendisi bulmal�d�r. Bir Web program� da ayn� mant�kla tasarlan�r. PHP, bir k�sm�n� daha �nceki b�l�mlerde, bir k�sm�n� da �imdi ele ald���m�z ara�lar� kullanarak, belirli durumlarda belirli istikametlere gidecek, yeri geldi�inde geri d�necek, yeri geldi�inde ba�ka b�l�mlere s��rayacak bir ak�� plan� tasarlamam�za imkan verir.
Web programlar�m�zda, ziyaret�ilerimizin sitemizde yapt�klar� veya yapmak istediklerini bildirdikleri i�e g�re sayfalar, bu i�lere g�re sayfa i�erikleri sunar�z. Web program�m�z ziyaret�imizin hareket tarz�na ve amac�na uygun olarak ilerler. Bir program�n ak�� plan�n� kontrol etmemizi sa�layan unsurlar �o�u zaman program�n kendi kendine karar vermesini sa�layan ara�lard�r. PHP'de program denetim unsurlar�, program�n gidi� y�n�n� de�i�tirmemizi veya oldu�u yerde durmas�n� ve beklemesini veya bir i�i biteviye yapmas�n� sa�lar. Bu b�l�mde bu ara�lar� ele alaca��z.
if Deyimi
�nsan olarak kararlar�m�z� hemen hemen daima "bir �ey �yle ise b�yle, �yle de�ilse ��yle davranmak" �zere almaz m�y�z? PHP program�nda if deyimi bunu sa�lar. Kelime anlam� e�er olan if deyimi ile program�m�z� karar almaya zorlar�z. Ne var program�m�z bizim kadar ak�ll� olamayaca�� i�in if �art�n�n do�ru veya yanl�� olmas� durumunda ne yapaca��n� da ona biz s�yleriz. if deyimi ��yle yaz�l�r:
if ( ko�ullar ) {
ko�ullar do�ru ise yap�lacak i�lere ili�kin komutlar
}
elseif (di�er ko�ullar) {
di�er ko�ullar do�ru ise yap�lacak i�lere ili�kin komutlar
}
else {
di�er her durumda yap�lacak i�lere ili�kin komutlar
}
PHP, if ifadesinin do�ru olmas� halinde, ifadeye ait ilk s�sl� parantezin i�indeki komutlar� icra eder; bu �artlar do�ru de�ilse, elseif deyimi ile ileri s�rebilece�imiz di�er bir grup �art�n do�ru olup olmad���n� s�nayabiliriz. Bu �artlar yerine geliyorsa, PHP, elseif b�l�m�ndeki i�leri icra eder. Nihayet di�er her hangi bir durumda icra edilmesini istedi�imiz komutlar� else b�l�m�nde belirtiriz. PHP, if deyimi do�ru de�ilse, deyime ait s�sl� parantezin i�indeki i�leri yapmadan yoluna devam eder; varsa elseif deyiminin �artlar�n� s�nar; elseif b�l�m� yok fakat else b�l�m� varsa bu b�l�mdeki i�leri icra eder. Deyimde else b�l�m� de yoksa, PHP yoluna if deyiminden sonraki ilk ad�mdan devam eder. Bunu bir �rnekle belirtelim:
<?php
$sarki = "G�ne� Do�acak";
if ( $sarki == "G�ne� Do�acak" ) {
echo ("Se�ti�iniz �ark�n�n ad�: G�ne� Do�acak!");
}
elseif ($sarki == "Beklerim Ben") {
echo ("Se�ti�iniz �ark�n�n ad�: Beklerim Ben!");
}
else {
echo ("L�tfen bir �ark� se�iniz!");
}
?>
�o�u zaman if deyimlerini birden fazla ko�ulu s�nayacak �ekilde yazar�z; bununla birlikte elseif ve else b�l�mleri olmadan da yaz�labilir:
<?php
if ( $parola == "" ) {
echo ("Sitemize girmek i�in parola yazman�z gerekir.<br>");
echo ("L�tfen parolay� yaz�n! <br>");
}
?>
Buradaki if deyimi $parola de�i�keninin bo� alfan�merik olmas� halinde ziyaret�iyi uyarak ve g�revi bitecektir. Ziyaret�i bir parola yazm��sa, daha sonraki komutlar bu parolan�n do�ru olup olmad���n� s�nayabiliriz.
switch deyimi
PHP'de program ak���n� y�nlendirmekte kulland���m�z bir di�er unsur, switch deyimidir. Ad� anahtar anlam�na gelen switch deyimi, verilen bir de�i�kenin de�erinin s�ralad���m�z ko�ullardan hangisine uygun oldu�unu s�nar ve o ko�ula ili�kin komutlar� icra eder. PHP'nin yapt��� i�i bitirdikten sonra switch deyiminin d���na ��kmas�n� sa�layan, break komutu vard�r:
switch ( de�i�ken ) {
case KO�UL-1 ;
Ko�ul-1 do�ru ise yap�lacak i�lere ili�kin komutlar
break;
case KO�UL-2 ;
Ko�ul-2 do�ru ise yap�lacak i�lere ili�kin komutlar
break;
case KO�UL-3 ;
Ko�ul-3 do�ru ise yap�lacak i�lere ili�kin komutlar
break;
case KO�UL-4 ;
Ko�ul-4 do�ru ise yap�lacak i�lere ili�kin komutlar
break;
......................
......................
default:
di�er her durumda yap�lacak i�lere ili�kin komutlar
}
switch deyimini yazarken mutlaka break ifadesini kullanmam�z gerekmez; switch deyiminin ak��� break ile kesilmemi�se, program ilk �art yerine gelmi� olsa bile di�er �artlar� da s�namaya devam eder ve en sondaki default deyimine ula�arak (default'tan sonra noktal� virg�l de�il iki nokta �st�ste i�areti oldu�una dikkat edin), bu b�l�mdeki komutlar� icra eder. Ne var ki programc�l�k mant���na ayk�r� olabilir: bir de�i�kenin i�eri�i verdi�imiz �artlardan birini tutmu�sa, muhtemelen di�er �artlar� yerine getirmeyecek demektir. Bu durumda di�er ko�ullar�n s�nanmas� gereksiz e default i�lerin icra edilmesi ise hata olur. Bu deyimi de bir �rnekle g�relim:
switch ( $sarki ) {
case "G�ne� Do�acak" ;
echo ("Se�ti�iniz �ark�n�n ad�: G�ne� Do�acak<br>") ;
break;
case "Derdime Derman" ;
echo ("Se�ti�iniz �ark�n�n ad�: Derdime Derman<br>") ;
break;
case "Haberi Yok" ;
echo ("Se�ti�iniz �ark�n�n ad�: Haberi Yok<br>") ;
break;
case "Sonsuza kadar" ;
echo ("Se�ti�iniz �ark�n�n ad�: Sonsuza kadar <br>") ;
break;
default:
echo ("Se�ti�iniz �ark�n�n ad� bilinmiyor<br>") ;
}
Program�m�z, bu kodu icra ederken,, $sarki adl� de�i�kenin de�erini, buradaki d�rt isimle kar��la�t�racakt�r. �ark�n�n ad�, "G�ne� Do�acak" ise ilk durum ger�ekle�mi� olacak; program Browser pencerisine �ark�n�n ad�n� yazacak (ve muhtemelen bu s�zlerini g�r�nt�leyecek!) ve ikinci ad�ma break ifadesine ge�ecektir. break, switch deyiminin sona ermesini sa�lar; PHP yoluna, switch deyiminin kapanan s�sl� parantezinden sonra devam eder. Bu �rnekte break ifadesi kullan�lmam�� olsayd�, PHP, di�er �artlar� da s�nacak ve bo�un azaman kaybedecekti; daha da garibi, en sondaki default komutu da icra edilece�i i�in program�m�z Browser pencerisine hem se�ilen �ark�n�n ad�n�, hem de "Se�ti�iniz �ark�n�n ad� bilinmiyor" yazacakt�. Bunu g�z�n�nde tutarak, switch deyimini daima break ile birlikte yazmam�z gerekir.
////////////////KUTU///////////////
switch i�in k�sa yol
Kimi zaman uzun uzad�ya switch deyimi yazmam�z gerekmeyebilir; bir de�i�kenin de�erini sadece bir �arta uygunluk a��s�ndan s�namam�z gerekir. Bunu soru ve iki nokta �st�ste i�aretleri (? ... :) olarak yaz�lan i�lemci ile yapar�z. Diyelim ki, Web sitemizi ziyaret eden ki�inin parola yaz�p yazmad���n� s�ramak istiyoruz:
<?php
$uyari = ($parola == "" ) ? "Parola yazman�z gerekir" : "Te�ekk�r ederiz" ;
echo ($uyari);
?>
Bu kod par�ac���, ziyaret�inin parola girip girmedi�ini $parola de�i�keninin i�inin bo� olup olmad���na bakarak anlayacak ve $parola de�i�kenin i�i bo� ise (yani soru i�aretinin sorgulad��� durumun do�ru olmas� halinde) iki nokta �st�skte i�aretinden �nceki metni $uyar� de�i�kenin i�eri�i haline getirecek; $parola de�i�keninin i�i dolu ise (yani ko�ul yerine gelmiyorsa, durum yanl�� ise) iki nokta �st�ste i�aretinden sonraki metni $uyar� de�i�keninin i�eri�i yapacakt�r. Bir sonraki echo() komutu ise i�eri�i bu s�nav sonucuna g�re belirlennen $uyar� de�i�keninin de�erini Browser penceresinde g�r�nt�leyecektir.
/////////////////////////////KUTU
B�TT�///////////////
D�ng�ler
Yukar�daki iki denetim �gesi de program�n ileri do�ru ak���n� bozmayan ara�lard�r. Oysa bazen program�m�z�n bir ko�ul ger�ekle�incele kadar yerinde saymas� ve ko�ul ger�ekle�medik�e ilerlememesi gerekebilir. Kimi zaman da program�m�za bir i�i bitirmeden ileri gitmemesini biz bildiririz. Program ak���n�n bu t�r denetimini d�ng� deyimleri sa�lar. PHP'de iki t�r d�ng� vard�r: bir durum devam etti�i veya etmedi�i s�rece yap�lan ve ka� kere tekrar edece�i bilinemeyen while d�ng�leri, ve tekrar say�s� belirli for d�ng�leri.
while d�ng�s�
Bir de�i�kenin i�eri�inin belirli bir �art� kar��lamas� veya kar��lamamas� halinde icra edilir. Burada dikkat edece�imiz nokta, program�n icras� s�ras�nda de�i�kenin i�eri�inin veya ko�ulun de�i�mesinin sa�lanmas�d�r. Aksi taktirde p�gram�m�z sonsuz d�ng�ye girer ve muhtemelen ��ker. while d�ng�s� ��yle yaz�l�r:
while (ko�ul) {
Ko�ul do�ru ise yap�lacak i�lere ili�kin komutlar
}
Bu y�ntemin yayg�n kullan�ld��� alan, bir saya�la yapt�r�lan i�lerdir. A�a��daki program� while.php ad�lma kaydedip, �al��r�rsan�z, PHP, Browser'�n yaz� t�r� boyutunu 1'den 7'ye kadar b�y�terek, ayn� metni yazd�racakt�r:
<HTML>
<HEAD>
<TITLE>PHP'de D�ng�</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<?php
$sayac = 1;
while ( $sayac <= 7 ) {
print ("<font size= $sayac >");
print ("<b><p>�yileri iyilikleri ile alk��lay�n�z!</b></p>");
print ("</font>");
$sayac ++;
}
?>
</BODY>
</HTML>
Program�m�z, while d�ng�s� i�indeki iken, sonsuz d�ng�den kurtulabilmek i�in, yaz�y� yazd�rd�ktan sonra, $sayac de�i�kenini bir artt�r�yor. Aksi taktirde, de�i�ken hi� bir zaman while d�ng�s�n�n bekledi�i �arta kavu�arak 7'ye e�it hale gelemeyecektir. (Program�, sondaki "$sayac ++;" sat�r�n� kald�rarak denerseniz, zarars�z bir sonsuz d�ng�n�n ne oldu�unu g�rebilirsiniz! Ama �nce Browser'�n dur d��mesinin yerinde durup durmad��na bir bak�n!)
while d�ng�s�n arad��� �art�n yerine gelmesi, her zaman burada oldu�u gibi, tabir yerinde ise "elle" yap�lmaz; d�ng�n�n icra etti�i komutlar veya fonksiyonlar ko�ulu i�eren de�i�keni de�i�tirebilirler. S�zgelimi elektronik ticaret sitemizde Web ziyaret�imizin while i�inde yapt��� al��veri�in tutar�n� ko�ul olarak kullanabiliriz ve bu ko�ulu i�eren de�i�ken al��veri� ile de�i�ebilir.
do..while
while d�ng�s� farketti�iniz gibi, ileri s�rd���m�z �art�, iyi yapmadan �nce s�nar; ve bu �art ortadan kalkmam��sa (yani hen�z do�ru/true ise) yapaca�� i�i yapar; ba�ka bir deyi�le while d�ng�s�n�n yapaca�� i� hi� yap�lmayabilir. Fakat s�naman�n i� yap�ld�ktan sonra yerine getirildi�i bir �ekli de vard�r: do..while.. Bu d�ng� ise ��yle yaz�l�r:
do {
Ko�ul do�ru ise yap�lacak i�lere ili�kin komutlar
}
while (ko�ul);
Burada g�rd��n�z gibi do..while d�ng�s� en az bir kere icra edilir; ��nk� �art�n s�nanmas� yap�lacak i�e ili�kin komutlardan sonra gelmektedir. Bu d�ng�n�n arad��� �art�n d�ng�n�n yapt��� i�lerin sonucu veya kod b�l�m�nde bizim taraf�m�zdan ger�ekle�tirilmesi i�in igerekli komutlar�n bulunmas�na dikkat etmelisiniz. Yoksa, bu d�ng� de sonsuzlu�a eri�ir! Yukar�da �rne�i, bu y�ntemle yazal�m:
<?php
$sayac = 1;
do {
print ("<font size= $sayac >");
print ("<b><p>�yileri iyilikleri ile alk��lay�n�z!</b></p>");
print ("</font>");
$sayac ++;
}
while ( $sayac <= 7 ) ;
?>
Bu d�ng�y� yazarken, while sat�r�n�n sorunda noktal� virg�l bulundu�una dikkat edin.
for d�ng�s�
PHP'de Web programlar�m�z, d�ng�n�n belirli bir say�da olmas�n� ve mesela bu say�n�n bizim istedi�imiz basamaklarda artmas�n� gerektiriyorsa, d�ng�y� for deyimiyle kurabiliriz. Ayr�ca for deyimi saya� gibi �art�n yerine gelmesini sa�layacak artt�rma ve�a eksiltme i�lemlerini kendisi yapaca�� i�in, sonsuz d�ng�ye girme tehlikesi de hemen hemen yoktur. Bu d�ng� ��yle yaz�l�r:
for ( $yeni_degisken atama ; ko�ul ; art�� basamas� ) {
Ko�ul do�ru ise yap�lacak i�lere ili�kin komutlar
}
for deyiminin ilk �gesi, d�ng� sayac� olarak kullan�lacak bir de�i�ken olu�kturulmas� ve buna de�er atanmas�na ili�kindir; sonra bir noktal� vrig�l ile bu sayac�n s�n�r� olan ko�ul belirtilir. Yine noktal� virg�l ile ay�rarak, saya� de�i�keninin art�� h�z� verilir. Bunu da yine yukar�daki �rnekle g�sterelim:
<?php
for ($sayac = 1; $sayac <= 7 ; $sayac++ ) {
print ("<font size= $sayac >");
print ("<b><p>�yileri iyilikleri ile alk��lay�n�z!</b></p>");
print ("</font>");
}
?>
Buradaki kod, while ve do..while g�re �ok daha k�sa; ve while d�ng�s� sayac� artt�rmay� sa�layan sat�r unutulsa bile �al��aca�� halde, for d�ng�s� unsurlara ili�kin noktal� virg�ller eksik olursa �al��mayacak ve bize b�ylece sonsuz d�ng� tehlikesini hat�rlatm�� olacakt�r. for d�ng�s� kendi sayac�n� verdi�iniz �art� kar��lay�ncaya kendisi artt�racak, yani buradaki �rne�i g�re $saya� de�i�keni 7 oluncaya kadar �al��acak ve �art kar��land��� anda, sona erecektir.
//////////////////KUTU///////////////
foreach
PHP'nin programc�ya �ok kolayl�k sa�layan bir di�er d�ng�s�, foreach d�ng�s�d�r. Ancak bir de�i�kenin b�t�n elemanlar�n� tekrar say�s�nda esas alan bu d�ng�n�n �al��ma ilkelerini g�rebilmek i�in dizi de�i�ken kavram�n� ele alm�� olmam�z gerekiyor. �imdilik bu d�ng�n�n varl���n� bir kenara yaz�p, dizi de�i�kenlere kadar, unutabilirsiniz.
////////////////////KUTU
B�TT�///////////////
D�ng�y� sona erdirmek i�in: break
Program�m�z�n ak���, bazen d�ng�n�n durdurulmas�n� gerektirir. �rne�in, saya� de�i�kenini ziyaret�inin vermesi gerekti�i ve vermedi�i durumda, d�ng�n�n ba�lamamas� yerinde olur. Program�n gerektirdi�i b�yle bir sebeple d�ng�y� break komutuyla durduruz.
S�zgelimi a�a��daki kodda kulland���m�z $tekrar de�i�kenini de�erini ziyaret�iden form yoluyla ald���m�z� varsayal�m:
<?php
$tekrar = 10 :
for ($sayac = 1; $sayac <= $tekrar ; $sayac++ ) {
if ( $tekrar <= 0 )
break;
print ("<font size= $sayac >");
print ("<b><p>�yileri iyilikleri ile alk��lay�n�z!</b></p>");
print ("</font>");
}
?>
Bu kod par�as�n�, bir sayfa kodunun i�ine yerle�tirir ve �nce bu �ekliyle, danha sonra $tekrar= 0 yazarak s�narsan�z, break komutunun i�e yarad���n� g�receksiniz. ($tekrar de�i�keninin de�erini, Form yoluyla ziyaret�iden de�i�ken de�eri almay� ��reninceye kadar �imdilik kayd�yla biz yap�yoruz. Ayr�ca buradaki if deyiminin s�sl� parantez olmadan yaz�ld���na dikkat edin.
D�ng�y� s�rd�rmek i�in: continue
break ifadesinin d�ng�y� tamamen durdurdu�unu farkettiniz mi? Oysa program�m�z�n ak���, kimi zaman da d�ng�n�n sadece belirli bir durumda kendisinden beklenen i�i yapmamakla birlikte b�yle t�m�yle kesilmesini de gerektirmez. Yine yukar�daki �rne�e d�nersek, saya� de�i�kenini ziyaret�inin vermesi gerekti�i ve vermedi�i durumda, d�ng�n�n t�m�yle kesilmesini de�il de, sadece sayac� g�steren $sayac de�i�keninin s�f�rdan b�y�k bir de�ere ula�lmas�n� beklememiz yerinde olabilir. Bu devaml�l��� continue komutuyla sa�lar�z:
Yine bu �rnekte kulland���m�z $saya�c de�i�keninin de�erini ziyaret�iden form yoluyla ald���m�z� varsayarak, kodu ��yle de�i�tirebiliriz:
<?php
$sayac = -5 :
for (; $sayac <= 7 ; $sayac++ ) {
if ( $sayac <= 0 )
continue;
print ("<font size= $sayac >");
print ("<b><p>�yileri iyilikleri ile alk��lay�n�z!</b></p>");
print ("</font>");
}
?>
Bu durumda PHP, conktinue komutunu g�rd��� anda for d�ng�s�n�n geri kalan k�sm�n� icra etmek yerine ba�a d�necek ve d�ng�y� yeniden icra etmeye ba�layacakt�r. D�ng�n�n ilk sat�r�nnda kod par�as�n�, bir sayfa kodunun i�ine yerle�tirir ve �nce bu �ekliyle, danha sonra $sayac= 1 yazarak s�narsan�z, continue komutunun program� saya� de�i�keninin de�eri 1 oluncaya kadar durdurdu�unu ama bu s�rada for d�ng�s�n�n devam etti�ini g�receksiniz. ($sayac de�i�keninin de�erini, Form yoluyla ziyaret�iden nas�l alaca��m�z� daha sonra g�rece�iz.)
Buraya kadar, PHP program� olu�turabilmek i�in gerekli temel yaz�m kurallar�n�, yap�ta�lar�n� ve program ak���nda yararlanaca��m�z kontrol �gelerini ele alm�� olduk. �imdi bu unsurlar�n hepsini bir arada kullanabilece�imiz gruplar�, fonksiyonlar� ele alabiliriz.
Fonksiyonlar
Bir bilgisayar program�n�n kalbi, fonksiyonlard�r. Fonksiyonlar, bir kere tan�mlan�r ve bir �ok kereler, ihtiya� oldu�u noktada hizmete �a�r�l�r. Fonksiyonlar genellikle bir i� veya hesaplama yaparlar ve bunun sonucu olarak ortaya yeni bir de�er ��kart�rlar. Bu de�ere "fonksiyondan d�nen de�er" denir.
Fonksiyonun bir program i�in ne kadar �nemli bir unsur oldu�unu bir �rnekle belirtelim. Diyelim ki Web'de ��rencilerimizin y�l i�inde ald�klar� notlar� g�steren bir program�m�z var. Bu siteyi ziyaret eden ��rencilerin, iskterlerse, bir d��meyi t�klayarak, o andaki not ortalamalar�n� hesap ettirmelerini sa�lamak istiyoruz. Bu hesab� yapacak olan i�lem, bir fonksiyondur. Web ziyaret�isi d��meyi t�klad��� anda, program, ortalama hesab�n� yapacak olan fonksiyonu, o sayfada bulunan notlar� bildirecek; fonksiyon da kendisine verilen bu de�erlerle yapmas� gereken hesab� yapacak; ve elde edece�i sonucu kendisini g�reve �a��ran program sat�r�na bildirecektir. Bildirilen bu de�erle ne yap�laca��, fonksiyonu g�reve �a��ran komuta veya i�leme aittir. Fonksiyon kendisinden isteneni yapmakla yetinir.
PHP'nin kullan�lmaya haz�r bir �ok fonskiyonu vard�r. �u ana kadar s�rekli kulland���m�z echo() ve print() bu t�r PHP fonksiyonlar�d�r. PHP'nin kendi fonksiyonlar�n� g�reve �a��rmak, yine yukar�daki �rneklerde oldu�u gibi, program i�inde gerekti�i yere ad�n� ve kullanaca�� de�eri yazmakla olur:
print ("Bu bir metindir!");
PHP bizim kendi fonksiyonlar�m�z� kullanmam�za da izin verir. Fakat bunun i�in �nce fonksiyonu tan�mlamam�z gerekir.
Fonksiyon Tan�mlama ve �a��rma
PHP'de fonksiyonlar function komutu ile olu�turulur. Tan�mlad���m�z fonksiyon, kendisini g�reve �a��racak komuittan, yapaca�� i�lemde kullanmak �zere de�er alacaksa, bu de�erlere verece�imiz de�i�ken isimleri fonksiyon ad�n�n yan�nda parantez i�inde g�sterilir. Fonksiyon birden fazla de�er bekleyecekse, bunlar�n de�i�ken adlar�n�n aras�na virg�l koyar�z. Fonksiyona ula�t�r�lan de�erlere arg�man denir. Fonksiyon, kendisine bir de�er ula�t�r�lmas�n� beklemese bile i�i bo� parantez koymam�z gerekir. Buna g�re PHP'de fonksiyon ��yle yaz�l�r:
function fonksiyonun_ad� (arg�man1, arg�man2, ... arg�manN) {
fonksiyonun yapaca�� i�e ili�kin komutlar
}
Fonksiyon adlar�, de�i�ken adlar� ile ayn� kurallara tabidir. Fonksiyon i�inden fonksiyon �a�r�labilir; fonksiyonlar�n i�inde PHP'nin kendi fonksiyonlar� kullan�labilir. �imdi, ilk �rnek fonksiyonumuzu yazal�m.
Yukar�daki �rneklerde, PHP'ye, bir Web sayfas� olu�tururken HTML �gesi olacak baz� sat�rlar�n ba��na <H1>, sat�r sonlar�na <BR> gibi etiketler koydurdu�umuza dikkat etmi� olmal�s�n�z. Bir programda bu i�i s�k s�k yapacaksak, yani metinlerimiz <BR> ile bitecek, baz� ba�l�klar�m�z ise sayfam�za HTML'in ba�l�k etiketleri ile g�nderilecekse, bu etiketleri defalarca yazmam�z sadece zorluk de�il, fakat ayn� zamanda yaz�m hatas�n� davet eden bir davran�r olur. PHP'de kendisine verece�imiz metinleri ba�l�k veya g�vde yaz�s� olarak bi�imlendirecek fonksiyonlar tan�mlayarak, programc�l�kta daima tehlikeli olan insan unsurunu asgar�ye indirebiliriz. �u program� yazdir01.php ad�yla kaydederek, Browser'da a��n:
<HTML>
<HEAD>
<TITLE>PHP'de Fonksiyon</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<?php
function yazdirBR ($metin) {
print ("$metin<br>\n");
}
function yazdirH1 ($metin) {
print ("<h1>$metin</h1>\n");
}
function yazdirH2 ($metin) {
print ("<h2>$metin</h2>\n");
}
function yazdirH3 ($metin) {
print ("<h3>$metin</h3>\n");
}
function yazdirH4 ($metin) {
print ("<h4>$metin</h4>\n");
}
function yazdirP ($metin) {
print ("<p>$metin</p>\n");
}
// Ba�ka kodlar buraya girebilir
yazdirH1("Bu H1 Ba�l�k");
yazdirH2("Bu H2 Ba�l�k");
yazdirH3("Bu H3 Ba�l�k");
yazdirH4("Bu H4 Ba�l�k");
yazdirBR("Bu kendisinden sonra BR olan birinci metin.");
yazdirBR("Bu kendisinden sonra BR olan ikinci metin.");
yazdirP("Bu uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun bir paragraf metni.");
yazdirP("Bu uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun bir di�er paragraf metni.");
?>
</BODY>
</HTML>
Bu programda, yazdirBR(), yazdirH1(), yazdirH3(), yazdirH4(), ve yazdirP() adlar�yla alt� fonksiyon tan�mlad���m�z� g�r�yorsunuz. Bu fonksiyonlar�n hepsi kendilerini g�reve �a��ran sat�rdan, kendilerine bir de�er verilmesini istiyorlar ve bu de�eri $metin adl� de�i�kende tutuyorlar. Fonksiyonlar�m�z t�m� de PHP'nin print() fonksiyonundan yararlan�yor; ancak bu fonksiyonun nas�l kullan�laca��n�, nas�l i�letilece�ini de belirliyorlar. Buna g�re baz� fonksiyonlar�m�z $metin adl� de�i�kenin de�erini �n�ne ve arkas�na bir HTML etiketi koyarak Browser'a g�nderiyor; birisi ise sadece $metin de�i�kenin tuttu�u de�erin sonuna bir HTML etiketi koyduruyor. Fonksiyonlar�m� buradaki �rnekte oldu�u gibi hemen olu�turulduktan sonra g�reve �a��rmay�z. Geleneksel olarak, bir programda kullan�lacak fonksiyonlar, program�n ba� taraf�nda toplan�r ve daha sonra nerede gerekirse orada, �a�r�l�rlar. Fonksiyonlar� adlar�n� ve kendilerine verilmesi gereken bir de�er varsa o de�eri parantez i�inde yazarak �a��r�r�z. Burada oldu�u gibi, fonksiyonu g�reve �a��r�rken parantez i�inde de�erin kendisini yazabilece�imiz gibi, bu de�eri tutan bir de�i�kenin ad�n� da yazabiliriz. Bu program� �al��t�r�rsan�z, Browser'da bu g�r�nt�y� elde edebilirsiniz:
<php00012.tif>
�imdi, bu penceredeki belgenin kayna��n� g�r�nt�leyelim. Kar��m�za �una benzer bir metin ��km�� olmas� gerekir:
<HTML>
<HEAD>
<TITLE>PHP'de Fonksiyon</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<h1>Bu H1 Ba�l�k</h1>
<h2>Bu H2 Ba�l�k</h2>
<h3>Bu H3 Ba�l�k</h3>
<h4>Bu H4 Ba�l�k</h4>
Bu kendisinden sonra BR olan birinci metin.<br>
Bu kendisinden sonra BR olan ikinci metin.<br>
<p>Bu uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun bir paragraf metni.</p>
<p>Bu uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun bir di�er paragraf metni.</p>
</BODY>
</HTML>
Bu, bize, olu�turdu�umuz b�t�n fonksiyonlar�n kendilerinden bekleneni yapt���n� ve kendilerine verdi�imiz metinleri, t�pk� istedi�imiz gibi, arzu edilen HTML etiketleri ile birlikte Browser'a g�nderdiklerini g�steriyor.
Buradaki fonksiyon, kendisini bir i� yapan t�rden fonksiyondur. Oysa kimi zaman fonksiyonlar, kendilerini g�reve �a��ran komuta bir de�er g�nderirler. �imdi de b�yle bir fonksiyon �rne�i yazal�m. A�a��daki kodu, hesapla.php ad�yla kaydedin:
<HTML>
<HEAD>
<TITLE>PHP'de Fonksiyon</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<?php
function topla ($sayi1, $sayi2) {
$sonuc = $sayi1 + $sayi2;
return $sonuc;
}
function cikart ($sayi1, $sayi2) {
$sonuc = $sayi1 - $sayi2;
return $sonuc;
}
function carp ($sayi1, $sayi2) {
$sonuc = $sayi1 * $sayi2;
return $sonuc;
}
function bol ($sayi1, $sayi2) {
$sonuc = $sayi1 / $sayi2;
return $sonuc;
}
// Ba�ka kodlar buraya girebilir
$sayi1 = 12;
$sayi2 = 5;
print topla($sayi1, $sayi2);
print ("<br>");
print cikart($sayi1, $sayi2);
print ("<br>");
print carp($sayi1, $sayi2);
print ("<br>");
print bol($sayi1, $sayi2);
print ("<br>");
?>
</BODY>
</HTML>
Bu programda, d�rt aritmetik i�lemi yapan d�rt ayr� fonksiyon tan�ml�yoruz. Fonksiyonlar�m�z kendilerini g�reve �a��ran komuttan, kendilerine iki de�er vermesini bekliyorlar ve bu de�erleri $sayi1 ve $sayi2 adl� de�i�kenlere yaz�yorlar. Sonra herbiri, kendisinden beklenen aritmetik i�lemi yaparak, sonucunu $sonuc adl� de�i�kene yaz�yor. Burada dikkat edece�imiz nokta, return komutudur. Bu komut, f onksiyonun elde etti�i de�eri, de�eri tutan de�i�kenin ad�yla, fonksiyonu �a��rm�� olan sat�ra g�nderir. return komutuyla, kendisini g�reve �a��ran sat�ra de�il fakat mesela ba�ka bir fonksiyona da de�er g�nderebiliriz:
return ( baska_fonksiynon ( $degisken)) ;
Fonksiyonun return sat�r�nda b�yle bir ba�ka fonksiyonun ad� yazm�yorsa, bulunan de�er g�reve �a��ran sat�ra g�nderilir.
Bu program, i�ine bizim yazd���m�z iki de�eri hesaplayarak, Browser'a g�nderecektir. Ancak bu de�erler ziyaret�inin dolduraca�� bir formdan al�nabilece�i gibi, program taraf�ndan da hesaplanabilir
<php00013.tif>
Bu sayfan�n kayna��ndaki HTML kodlar� ise ��yla olacakt�r:
<HTML>
<HEAD>
<TITLE>PHP'de Fonksiyon</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
17<br>7<br>60<br>2.4<br>
</BODY>
</HTML>
Fonksiyonlar�m�z, kendilerinden bekleneni yaparak, gereken hesaplaman�n sonucunu, kendilerini g�reve �a��ran komuta, burada PHP'nin print() fonksiyona g�ndermi�; bu fonksiyon da sadece bu sonu�lar� Browser'a iletmi� bulunuyor.
Fonksiyona varsay�lan de�er verebiliriz
Buradaki �rneklerde tan�mlad���m�z fonksiyonlara bekledikleri de�erleri, onlar� g�reve �a��rd���m�z noktada biz veriyoruz. Ancak �yle durumlar olabilir ki, fonksiyonun bekledi�i de�erlerden biri veya bir ka��, g�reve �a��ran sat�r taraf�ndan verilmeyebilir; fonksiyon varsay�lan bir de�erle �al��t�r�labilir. �u �rne�i yazdir02.php ad�yla kaydedin:
<HTML>
<HEAD>
<TITLE>PHP'de Fonksiyon</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<?php
function yazdir ($metin, $boyut=3) {
print ("<font size=\"$boyut\">$metin</font><br>");
}
// Ba�ka kodlar buraya girebilir
yazdir("Bu Ba�l�k", 5 );
yazdir("Bu k���k boyutta bir metin", 2);
yazdir("Bu varsay�lan boyutta bir metin");
yazdir("Bu �ok b�y�k Ba�l�k", 8);
yazdir("Bu uzun bir paragraf metni. Boyutu varsay�lan �l��de. Bu uzun bir paragraf metni. Boyutu varsay�lan �l��de. Bu uzun bir paragraf metni. Boyutu varsay�lan �l��de.");
?>
</BODY>
</HTML>
Bu �rnekte, daha �ncekilerden farkl� olarak fonksiyonun, bekledi�i iki arg�mandan birisini, fonksiyonu tan�mlarken verdi�imize dikkat edin: " function yazdir ($metin, $boyut=3)" ifadesi, PHP'ye, "Bu fonksiyona ikinci arg�man eksik g�nderilirse, tela�a kap�lma, onun yerine 3 rakam�n� kullan!" anlam�na gelir. Nitekim, program�n daha ilerdeki b�l�mlerinde bu fonksiyon g�revlendirilirken birinci arg�man�n de�eri olan metin verildi�i halde, iki ayr� yerde ikinci arg�man�n de�eri verilmiyor. Bu iki durumda., PHP, yazdir() fonksiyonunda varsay�lan de�er olan 3'� kullan�yor.
<php00014.tif>
Bunu, g�r�nt�lenen sayfan�n kayna��nda rahat�a g�rebiliriz:
<HTML>
<HEAD>
<TITLE>PHP'de Fonksiyon</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<font size="5">Bu Ba�l�k</font><br>
<font size="2">Bu k���k boyutta bir metin</font><br>
<font size="3">Bu varsay�lan boyutta bir metin</font><br>
<font size="8">Bu �ok b�y�k Ba�l�k</font><br>
<font size="3">Bu uzun bir paragraf metni. Boyutu varsay�lan �l��de. Bu uzun bir paragraf metni. Boyutu varsay�lan �l��de. Bu uzun bir paragraf metni. Boyutu varsay�lan �l��de. </font><br>
</BODY>
</HTML>
Programda, yazdir() fonksiyonunun ikinci ve d�rd�nc� kullan�m�nda ikinci arg�man�n bulunmad���na, yukar�daki HTML'de bu sat�rlar i�in font size="3" etiketinin kullan�ld���na dikkat edin.
De�i�kenlerin kapsam�: global ve static
Yukar�da hesapla.php �rne�ini birlikte yapt�ysak, bir nokta dikkatinizi �ekmi� olmal�: d�rt fonksiyonda da ayn� de�i�ken adlar�n� kullan�yoruz ve sonucu ayn� isimle print() fonksiyonuna g�nderiyoruz. PHP nas�l oluyor da, ayn� isimli de�i�kenleri buradaki gibi ayr� ayr� de�erlerle ele alabiliyor? Bu sorunun cevab�n� verebilmek i�in de�i�kenlerin kapsam alan�na bakmam�z ve ve bu arada global deyimi ile tan��mam�z gerekir.
Bir fonksiyonun de�i�kenleri, sadece o fonksiyonun �mr� s�resince vard�r; hi� bir fonksiyon di�er bir fonksiyonun de�i�kenlerinin veya kendisine verilmemi� bir ba�ka de�i�kenin de�erini bilemez; kullanamaz. Bunu hemen bir �rnekle g�relim. �u kodu kapsam01.php ad�yla kaydedin:
<HTML>
<HEAD>
<TITLE>PHP'de Fonksiyon</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<?php
$metin = "Ba�kalar�na yararl� olman�n s�n�r� yoktur!";
function yazdir () {
print ("<h1>��te metin: $metin </h1>");
}
// Ba�ka kodlar buraya girebilir
yazdir();
?>
</BODY>
</HTML>
Normal g�r�n��l� bir fonksiyon ve kendisinden �nce tan�mlanm�� olan $metin adl� de�i�kenin tuttu�u de�eri, kendisi g�reve �a�r�ld��� anda Browser penceresinde g�r�nt�lemeye haz�r g�r�n�yor! Fonksiyonun d��ar�dan arg�man istemedi�ini, kullanaca�� print() komutunun konusu olarak $metin de�i�keninin de�erini kullanaca��n� da anl�yabiliyoruz. Fakat bu program� �al��t�rd���m�zda kar��m�za ��kan manzara �ok farkl� oluyor.
<php00015.tif>
Fonksiyonun �al��t���n�, yazd�rmas� beklenen �eylerin ilk b�l�m�n� yazd�rm�� olmas�ndan anlayabiliriz. Fakat, $metin de�i�keninin de�eri nerede? �imdi bu sorunun cevab�n� biliyoruz: $metin de�i�keni fonksiyonun kapsama alan� (scope) d���nda! Bir fonksiyon kendisine verilmeyen veya kendi i�inde tan�mlanmayan bir de�i�keni kullanamaz; bilemez, de�erinden haberi olmaz. Nitekim bu g�r�nt�y� ald���n�z s�rada kaynak kodlar�na bakarsan�z, "<h1>..</h1>" etiketlerinin aras�nda sadece "��te metin:" kelimelerinin bulundu�unu g�receksiniz.
Bir fonksiyonun d���nda tan�mlad���m�z de�i�kenlerimizi fonksiyona tan�tabilmek i�in global deyimini kullan�r�z; b�ylece de�i�ken b�t�n program boyuinca k�resel nitelik kazanm�� olur:
Ayn� kodun fonksiyon b�l�m�n� ��yle de�i�tirerek, kapsam02.php ad�yla kaydedin:
function yazdir () {
global $metin;
print ("<h1>��te metin: $metin </h1>");
}
Program�m�z� �al��t�rd���m�zda, bu kez metnin arzu etti�imiz gibi g�r�nt�lendi�ini g�rece�iz.
<php00016.tif>
Bu noktada dikkat etmemiz gereken �ey, global deyimi ile kendisine kullan�lmak �zere verilen de�i�ken, art�k bir bak�ma fonksiyonun mal� olur ve fonksiyon taraf�ndan de�eri de�i�tirilebilir. B�t�n program boyunca kullanmaya niyetli oldu�unuz global de�i�kenlerin, kullan�m�na verildi�i fonksiyon taraf�ndan de�i�tirilip-de�i�tirilmedi�ine dikkat edin.
Bir de�i�kenin b�t�n programda gerekli olmad��� ve sadece bir fonksiyon i�inde kullan�laca�� durumlarda bu de�i�keni fonksiyonun i�inde tan�mlamak daha do�ru olur. Fakat daha �nce belirtti�imiz gibi fonksiyonlar�n i�inde tan�mlanan de�i�kenler fonksiyon �al���rken var olur; fonksiyon sona erdi�inde de �l�r. Ba�ka bir deyi�le, bir fonksiyonun i�inde olu�turdu�umuz bir de�i�kenin fonksiyon sona erdi�inde s�f�rlanmamas� i�in bir �are olmas� gerekir. Bu �arenin ad�, static deyimidir. ��yle bir �rnek d���nelim: Sitemizdeki bir hesaplama fonksiyonu ziyaret�ilerimizin yeni al��veri�lerinin toplam�n� eski toplama ekleyerek, yeni ana toplam� buluyor ve ziyaret�i al��veri� sepetine yeni bir mal ekledik�e, ve o andaki ana toplam�n ne oldu�unu ��renmek istedik�e, fonksiyonumuzun eski ana toplam� hat�rlamas� gerekiyor. �u andaki PHP bilgimizle b�yle bir program yazmaya kalkmayal�m; ama daha basit bir �rnek olarak bu kodu static.php ad�yla kaydedelim:
<HTML>
<HEAD>
<TITLE>PHP'de Fonksiyon</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<?php
function saydir () {
static $sayi = 0;
$sayi++;
print ("<h3>Fonksiyonun tuttu�u say�: $sayi </h3>");
}
// Ba�ka kodlar buraya girebilir
print ("<h2>Fonksiyonun birinci kez �a�r�lmas�:</h2>");
saydir();
print ("<h2>Fonksiyonun ikinci kez �a�r�lmas�:</h2>");
saydir();
print ("<h2>Fonksiyonun ���nc� kez �a�r�lmas�:</h2>");
saydir();
print ("<h2>Fonksiyonun d�rd�nc� kez �a�r�lmas�:</h2>");
saydir();
?>
</BODY>
</HTML>
Bu program�, static deyimi olmadan �al��t�racak olursak, saydir() fonksiyonu her �a�r�ld���nda $say� de�i�keninin ba�tan tan�mland���n� ve bir t�rl� 1'den ileri gidemedi�ini g�rece�iz. static ise fonksiyon bittikten sonra $sayi de�i�keninin de�erinin de�i�meden kalmas�n� sa�layacakt�r.
�imdi, bir PHP program�n�n gerektirdi�i hemen her�eyi g�rm�� olduk; sadece iki �zel ara�, dizi de�i�kenler ve nesneler (Objects) kald�. Bunlar� da gelecek b�l�mde ele ald�ktan sonra, PHP'yi ger�ek ortamda, Web'de kullanmaya ba�layabiliriz.
Dizi-De�i�kenler, Nesneler
PHP'de, di�er programlama dillerinde oldu�u gibi, kulland���m�z bilgileri, verileri de�i�ken ad�n� verdi�imiz kaplarda tuttu�umuzu biliyoruz. Bu kaplarla ne i�ler yapabilece�imizi de g�rd�k. Fakat bu kaplar�n sadece bir birim bilgi tuttu�unu farketmi� olmal�s�n�z. Oysa programlar�m�zda genellikle, s�zgelimi "��rencilerin adlar�" dedi�imiz zaman y�zlerce ismi tutabilen kaplara ihtiyac�m�z olur. Aksi taktirde, ��renci say�s� kadar de�i�ken olu�turmam�z gerekir ki, bu durumda de�i�ken olu�turma zahmetinden vazge�mek daha uygun olur; ��rencilerin isimleri, de�i�kene koymadan da kullanabiliriz. ��te, bu t�r, bir grup bilgili topluca tutan de�i�kenlere dizi-de�i�ken (array) denir; ve program boyunca i�e yarayan de�i�ken t�r� de budur.
PHP'nin di�er bir �ok dilden fark�n� sa�layan bir �zelli�i, b�y�k �l��de dizi de�i�kenlere dayanan, i�inde kendi de�i�kenleri ve kendi fonksiyonlar� olan nesne (object) olu�turma imkan�na sahip bulunmas�d�r. Bu a��dan PHP, nesne-y�nelimli (Object-oriented) diller grubuna girer. Nesne olu�turmak ve kullanmak, bu y�nteme al���k olmayan programc�lar i�in �nceleri �ok zor g�r�n�r. Ancak bir kere nesne ile programlaman�n �z�n� kavrayanlar�n bir daha kolay kolay nesne fikrinden vazge�tikleri de g�r�lmemi�tir.
Dizi De�i�kenler
Dizi de�i�kenden ayr�nt�l� s�z edebilmek i�in �nce tipik bir dizi-de�i�kende neler oldu�una bakal�m. S�zgelimi, verdi�iniz "PHP ile Programlama" kursundaki ��rencilerinizin listesi ��yle olabilir:
��renci
No
Ad�
Soyad�
S�nav-1
S�nav-2
Not
1 �zbay Altun .. .. ..
2 Muharrem Ta� .. .. ..
3 Erhan Matarac� .. .. ..
4 Hasan Civelek .. .. ..
5 �ahika Tabak .. .. ..
Dizi De�i�ken Olu�tural�m
�imdi, PHP bize �yle bir ara� vermeli ki, biz bir kerede bu listenin t�m�n�, her bir �gesine sanki bir de�i�kenin de�eri imi� gibi tek-tek, veya bir ka��na birden ula�abilmeli ve arzu etti�imiz zaman notlar� doldurabilmeliyiz. ��renciler de yapaca��m�z Web sitesine girerek, kendi notlar�n� g�rebilmeli ve notlar�n� inceleyebilmeli. PHP'nin bu ama�la sa�lad��� ara�, �ok-boyutlu dizi-de�i�ken olu�turma arac�d�r. Ve bu ara�la yukar�daki listeyi aynen ��yle yapabiliriz. Bu kodu dizi_degiskenler01.php ad�yla kaydedin:
<HTML>
<HEAD>
<TITLE>PHP'de Degiskenler</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<B>
<H2>
<?php
$ogrenciler = array (
array ( adi => "�zbay", soyadi => "Altun", sinav1 =>"", sinav2 =>"", not =>""),
array ( adi => "Muharrem", soyadi => "Ta�", sinav1 =>"", sinav2 =>"", not =>""),
array ( adi => "Hasan", soyadi => "Civelek", sinav1 =>"", sinav2 =>"", not =>""),
array ( adi => "�ahika", soyadi => "Tabak", sinav1 =>"", sinav2 =>"", not =>""),
);
// Buraya ba�ka kodlar girecek
print $ogrenciler[0][adi];
?>
</H2>
</B>
</BODY>
</HTML>
Programdaki "print()" komutunu sadece dizi de�i�keni do�ru yaz�p yazmad���m�z� s�namak amac�yla yazd�k; bu program� Browser'da a�t���n�zda yazd���n�z ilk ismi Browser penceresinde g�r�yorsan�z, dizi-de�i�keni do�ru �ekilde olu�turdunuz demektir. Burada, array() komutnu yazarken, s�sl� parantez de�il, normal parantez kulland���m�za ve herbir eleman�n de�erlerinin sonunda vrig�l oldu�una dikkat edir. Bir di�er �nemli nokta: endeks adlar� bir kelimeden fazla ise bunlar� t�rnak i�ine alarak belirtmektir. �rne�in:
array ( adi => "�zbay", soyadi => "Altun", "Sinav 1 Notlar�" =>"", "Sinav 2 Notlar�" =>"", "Toplam Not Ortalamasi" =>""),
Burada, daha �ncekilere benzer bir �ekilde adland�r�lm�� $ogrenciler de�i�kenin i�eri�ini array() komutu ile doldurdu�umuzu g�r�yoruz. Array() ile b�yle �ok boyutlu ve i�erdi�i de�erlerin her birinin bir "endeks ad�" olan dizi-de�i�kene �li�kili Dizi (Associative array) de denir. Perl bilenler ise bu t�r de�i�kenlere "Hash" dendi�ini hat�rlayacaklard�r. �li�kili Dizi'lerin birinci sat�r� 0, ikinci sat�r� 1, ���nc� sat�r� 2.. diye numaraland�r�l�r. Bu dizinin o sat�r�ndaki kayd�n s�ra endeksidir. Ayr�ca burada "adi," "soyadi," "sinav1" .. dizi de�i�kenin i�indeki de�erlerin endeks ad�d�r. Yani bu de�erlere at�fta bulunurken, referans yaparken veya bu de�erleriekullanmak amac�yla eri�irken s�ra endeksi ve endeks ad�yla hitabederiz. Yukar�daki s�nama ama�l� print() komutuna bakarsan�z, birinci ��rencinin ismini "[0][adi]" olarak �a��r�yor.
�ok elemanl� ili�kili dizi olu�turman�n bir di�er yolu, yeri geldi�inde b�yle bir dizi i�in yeni bir �ye ilgili bilgileri eleman endeksi ve de�erler i�in endeks ad� belirterek ��yle bir kod yazmaktan ibarettir. dizi_degiskenler01.php dosyas�nda �u de�i�ikli�i yaparak, dizi_degiskenler02.php ad�yla kaydedin
<?php
$ogrenciler[0][adi] = "�zbay";
$ogrenciler[0][soyadi] = "Altun";
$ogrenciler[0][sinav1] = "";
$ogrenciler[0][sinav2] = "";
$ogrenciler[0][not] = "";
// Buraya Buraya ba�ka kodlar girecek
print $ogrenciler[0][adi];
?>
Bir dizi de�i�kende ka� boyut olacaksa, o kadar i�i�e array() �gesi olu�turabiliriz. Buna g�re tek boyutlu bir dizi de�i�ken sadece bir array() komutu ile ve sadece de�erler verilerek olu�turulabilir. Diyelim ki yukar�daki ��renci listemiz sadece ��rencilerin isimlerinden olu�acak. Bu durumda $ogrenciler de�i�kenine ili�kin sat�r� ��yle yazabilirdik:
$ogrenciler = array ("�zbay", "Muharrem", "Hasan", "�ahika");
PHP, b�yle tek boyutlu bir dizinin �rne�in birinci eleman�n�, "$ogrenciler[0]" ad�yla bilir. B�yle bir tek-boyutlu diziyi olu�turmak i�in PHP bize ba�ka bir kolayl�k da sa�lar: array() komutunu kullanmadan, do�ruca dizinin �gelerine de�er vermemiz m�mk�nd�r. Yukar�daki program�n sadece PHP b�l�m�n� ��yle de�i�tirerek, dizi_degiskenler03.php ad�yla kaydedin:
<?php
$ogrenciler[] = "�zbay";
$ogrenciler[] = "Muharrem";
$ogrenciler[] = "Hasan";
$ogrenciler[] = "�ahika";
// Buraya ba�ka kodlar girecek
print $ogrenciler[0];
?>
B�yle s�rayla dizi de�i�ken olu�turur veya olu�turulmu� bir dizi de�i�kene ek yaparken, de�i�kenin s�ra numaras�n� yazmazsak, PHP bunlar� kendisi s�ralar. Yukar�daki kodun da Browser penceresine "�zbay" yazd�rmas� gerekir. Mevcut tek-boyutlu bir dizi de�i�kene ek yapt���m�zda, be yeni de�erin dizinin en alt�na eklenmesini istiyorsak, s�ra numaras� yazmam�za gerek yoktur. Mevcut de�erlerden birini de�i�tirmek istiyorsak, o de�erin s�ra numaras�n� yazmam�z gerekir. Bunu denemek i�in yukar�daki kodu ��yle de�i�tirilim ve dizi_degiskenler04.php ad�yla kaydedelim:
<?php
$ogrenciler[] = "�zbay";
$ogrenciler[] = "Muharrem";
$ogrenciler[] = "Hasan";
$ogrenciler[] = "�ahika";
// Buraya ba�ka kodlar girecek
$ogrenciler[0] = "Emre";
$ogrenciler[15] = "�zbay";
print ("Dizideki 1'nci isim: $ogrenciler[0] <br>");
print ("Dizideki 2'nci isim: $ogrenciler[1] <br>");
print ("Dizideki 3'�nci isim: $ogrenciler[2] <br>");
print ("Dizideki 4'�nc� isim: $ogrenciler[3] <br>");
print ("Dizideki 5'inci isim: $ogrenciler[4] <br>");
print ("Dizideki 6'nc� isim: $ogrenciler[5] <br>");
print ("..............<br>");
print ("Dizideki 15'nci isim: $ogrenciler[15] <br>");
?>
Bu program�n Browser penceresine g�nderece�i s�rada, birinci ��renci ($ogrenci[0]) olarak bu kez �zbay de�il Emre yazd���n� g�rece�iz.
<php00017.tif>
Bunun sebebi, diziyi olu�turan ilk grup deyimden sonra,
$ogrenciler[0] = "Emre";
sat�r� ile birinci eleman�n de�erini de�i�tirmi� olduk. 15'nci elemana atama yapmakla, PHP'nin $ogrenciler dizisinde 6, 7, 8, 9,.. 14'e kadar bo� elemanlar olu�turmas�na sebep olduk.
Tek boyutlu dizileri de �li�kili Dizi olarak olu�turabilir yani de�erlere endeks ad� verebiliriz. Daha �nce kaydetti�imiz dosyada �u de�i�ikli�i yapal�m ve dizi_degiskenler05.php ad�yla kaydedelim:
<?php
$ogrenci[adi] = "�zbay";
$ogrenci[soyadi] = "Altun";
$ogrenci[sinav1] = "";
$ogrenci[sinav2] = "";
$ogrenci[not] = "";
// Buraya ba�ka kodlar girecek
print $ogrenci[adi];
?>
PHP, $ogrenci adl� de�i�kenin be� ayr� de�eri oldu�unu ve bunlar�n "adi," "soyadi," "sinav1"... oldu�unu biliyor. �imdi art�k istedi�imiz noktada bu de�i�kenin istedi�imiz de�erine, o de�erin endeks ad�n� yazarak, �a�r�da bulunabiliriz; bu de�eri yeniden verebiliriz.
Dizi de�i�kenleri kullanal�m
Yukar�daki paragrafta "..de�i�kenin istedi�imiz de�erine, o de�erin endeks ad�n� yazarak, �a�r�da bulunabiliriz.." dedi�imizi g�rm�� olmal�s�n�z. Dizi veya tekil, de�i�kenleri olu�turmam�z�n sebebi, tuttuklar� de�erleri program�m�z�n gere�i olan �ekilde ve yerde kullanmakt�r. Sadece bir de�er tutan de�i�kenleri �rne�in print() komutu ile s�k s�k kulland�k. Yukar�da dizi de�i�ken �rneklerinde de baz� de�i�kenleri ve de�erlerini �a��rd�k. Ancak dizi de�i�kenlerin de�erlerinden yararlanabilmek i�in ba�ka ara�lar da vard�r.
Her�eyden �nce dizi de�i�kenlerin b�y�kl���, boyutu bizim i�in �nem ta��yabilir. �zellikle bir veritaban� dosyas�n� okutarak olu�turaca��m�z dizi de�i�kenin ka� eleman� ve her bir eleman�n ka� �gesi bulundu�unu bilmemiz gerekebilir.
Bir dizi de�i�kenin ka� eleman� bulundu�u, o de�i�kenin count() �zelli�i sorgulanarak ��renilir. count(), dizideki eleman say�s�n� verir. �imdi bunu bir �rnekle g�relim. Daha �nce kaydetti�imiz dizi_degiskenler04.php dosyas�n� a��n ve PHP b�l�m�nde �u de�i�ikli�i yaparak dizi_degiskenler06.php ad�yla kaydedin:
<?php
$ogrenciler[] = "�zbay";
$ogrenciler[] = "Muharrem";
$ogrenciler[] = "Hasan";
$ogrenciler[] = "�ahika";
// Buraya ba�ka kodlar girecek
print ("\$ogrenciler adl� dizide ". count($ogrenciler) ." adet eleman var.");
?>
Bu program Browser penceresine dizimizde 4 eleman bulundu�unu bildirecektir. �imdi i�leri biraz karma��k hale getirelim! Yukar�daki kodun, print() sat�r�n�n yerine �u sat�rlar� ekleyerek, dizi_degiskenler06a.php ad�yla kaydelim.
print ("\$ogrenciler adl� dizide ". count($ogrenciler) ." adet eleman var.");
print ("<br><br>");
for ($sayac=1 ; $sayac <= count($ogrenciler) ; $sayac++ ) {
print ("\$ogrenciler dizisinin ". $sayac ."'nc� eleman�: " . $ogrenciler[$sayac] ."<br>");
}
Bu program� �al��t�rmadan �nce, ekledi�imiz sat�rlar� irdeleyelim. �lk print() komutunun Browser penceresine "yazd�raca��" metinde ge�en ters b�l� i�aretini hat�rl�yor olmal�s�n�z. Bu, tek veya �ift t�rnak i�ine de alm�� bile olsak, PHP'nin, bir de�i�ken ad�n� g�rd��� zaman onun yerine o de�i�kenin tuttu�u de�eri yazmas� sebebiyle, $ i�areti gibi PHP i�in �zel anlam� olan i�aretlerin anlamland�r�lmas�n� �nlemek i�in yapt���m�z ve ad�na o karakteri kurtarma veya ESCaping dedi�imiz i�lemdir. Bu i�lemle, PHP'nin anlaml� i�aret de�il de metin saymas�n� istedi�imiz karakterlerin �n�ne ters b�l� i�areti koyar�z: \" gibi. Buradaki �rnekte, bu sayede PHP "$ogrenciler" kelimesini de�i�ken ad� olarak de�il, d�z metin olarak g�r�yor. Ki, ayn� komutta ayn� kelimeyi tekrar kulland���m�zda bu kez de�i�ken ad� olarak kullan�yoruz ve bu de�i�kenin count() �gesinin de�erini ��reniyoruz. $ogrenci de�i�kenin "�zbay," "Muharrem," "Hasan" ve "�ahika" de�erleri bulundu�una g�re, bu de�i�kenin count()'u 4 olacakt�r. ("Ozbay" = 0, .. "�ahika" = 3 olmak �zere..) Bu print() komutu, Browser penceresine tahmin etti�iniz gibi "$ogrenciler adl� dizide 4 adet eleman var." yazd�racakt�r. �kinci print() sat�r� ise ekrana ardarda iki yeni sat�r i�areti g�nderecektir.
�imdi kar���k noktaya geliyoruz! Burada bir for d�ng�s� ba�l�yor. �nce d�ng�n�n ka� kez tekrar edece�ini belirleyecek olan de�i�keni tan�ml�yoruz: $sayac. Sonra bu sayac�n ka�a kadar ��kaca��n� belirliyoruz. Bu say�y�, bize yine count() veriyor. Ve tabi� for d�ng�s�n�n devam edebilmesi i�in gerekli son unsur olan, sayac�n artt�r�lmas�n� sa�layan deyim var. Program�m�z bu d�ng�n�n i�inde, yani d�rt kez, her seferinde dizinin bir eleman�n ad�n� Browser penceresine g�nderiyor. �imdi, hat�rlayacaks�n�z, dizi de�i�kenlerin elemanlar�n�n bir s�ra say�s� vard�. �rne�in "�ahika" de�eri, dizinin 3 numaral�, yani d�rd�nc� eleman�; ve bu eleman�n de�erini ekrana g�ndermek i�in �u komutu vermemiz yeterli:
print ($ogrenciler[4]);
Programda ise buradaki endeks say�s�n�, $sayac de�i�keninin o andaki de�erinden al�yoruz. D�ng�n�n her seferinde bu de�er bir artaca�� i�in bize $ogrenciler de�i�keninin o anda hangi eleman�n�n de�eri �a��rmak istiyorsak, o eleman�n endeksini vermi� olacakt�r. Ve sonu� olarak program�m�z, dizideki b�t�n de�erleri Browser'a g�nderecektir.
<php00018.tif>
Kimi zaman buradaki �rnekte oldu�u gibi, dizinin b�t�n elemanlar�n� bir for d�ng�s�yle de�il, foreach d�ng�s�yle bulmak daha kolay olabilir. K�saca belirtmek gerekirse, foreach d�ng�s�, bir dizi de�i�kenin b�t�n elemanlar� i�in, arzu etti�iniz i�i yapar. foreach d�ng�s�n� yazarken komutun ka� kere icra edilece�ini bir saya�la tutmak gerekmez; ��nk� d�ng�, ona ad�n� verdi�iniz de�i�kenin i�indeki b�t�n de�erler bitinceye kadar devam edecektir. Yukar�daki �rnekteki b�t�n print() ve for sat�rlar�n� atarak yerine �unlar� yaz�p ve dizi_degiskenler06b.php ad�yla kaydelim.
foreach ($ogrenciler as $ogrenci) {
print ("$ogrenci<br>");
}
foreach d�ng�s�, bir dizi de�i�kenin ad�n� i�inden de�er �ekilecek kaynak olarak ister; bunu "as" (olarak) kelimesi izler; sonra diziden al�nacak her bir de�eri ge�ici olarak tutacak de�i�kenin ad� verilir. Buradaki print() komutumuz, bu ge�ici de�i�kenin tuttu�u de�eri Browser'a g�n�derecektir. Bu de�er ise d�ng�n�n her ad�m�nda dizi de�i�kendeki bir de�er yani ��rencilerin listesi olacakt�r.
Dizi elemanlar�n�n farkl� �zelliklerine ili�kin de�erlere endeks ad� verdi�imiz ili�kili dizilerde ise eleman de�erlerini �a��rmak foreach d�ng�s�n�n biraz farkl� yaz�lmas�n� gerektirir. Perl'e a�ina alanlar�n bu dizi t�r�ne "hash" dendi�ini hat�rlayacaklard�r. PHP'de de Perl'�n hash t�r� de�i�kenlerinde oldu�u gibi, endeks adlar�na "anahtar" (key), bu endeksin belirledi�i de�ere ise (evet, do�ru tahmin ettiniz!) de�er (value) denir. �li�kili dizilerden de�er almak �zere foreach d�ng�s� yaz�l�rken, de�erin anahtar�n� ve de�erin kendisini iki ge�ici de�i�kene yazmam�z gerekir. Daha �nce yazd���m�z dizi_degiskenler05.php adl� dosyay� a�arak mevcut tek sat�rl�k print() kodunun yerine �unlar� yaz�n ve dizi_degiskenler07.php ad�yla kaydedin:
foreach ($ogrenciler as $anahtar=>$deger) {
print ("$anahtar = $deger<br>");
}
Bu kodu �al��t�rmadan �nce foreach d�ng�s� �zerinde k�saca dural�m: d�ng�, $ogrenciler dizisini okumaya ba�lad���nda i�inde, benzetme yerinde ise, iki s�tun, ve bir �ok sat�rlar bulacakt�r. Bu s�tunlardan birincisi, ikinci s�tundaki verinin ad�d�r; foreach, birinci s�tundaki veriyi alarak $anahtar adl� ge�ici de�i�kenin de�eri olarak atayacak; sonra ikinci s�tuna ge�ecek ve bunu alarak $deger adl� ge�ici de�i�kenin de�eri yapacakt�r. D�ng�, daha sonra print() komutunu icra edecektir. print() ise ve ge�ici $anahtar de�i�keninin de�erini, ard�ndan e�ittir i�aretini ve son olarak da ge�ici $deger de�i�keninin de�erini Browser'a g�nderecektir. print() komutunun icras� bitince, foreach, kendisine verdi�imiz $ogrenciler de�i�keninde anahtar-de�er �iftini ele almad��� sat�r kal�p kalmad���na bakacak, ve elemanlar�n t�m� bitinceye kadar bu i�lemi tekrar edecektir. Tabi�, sonu� anahtar ve de�erlerin altalta s�ralanmas� olacakt�r.
<php00019.tif>
Bir de bu b�l�m�n en ba��nda ele ald���m�z �ok elemanl� ili�kili diziler vard�. Onlar�n i�indeki de�erleri acaba nas�l alabilir ve kullanabiliriz? Tabi� yine bir d�ng� ile. Fakat bu kez, d�ng�-i�inde-d�ng� kullanmak zorunday�z. B�yle bir diziyi g�z�m�zde canland�r�rsak, belki neden iki d�ng�ye ihtiya� oldu�ununu daha iyi g�rebiliriz. G�z�m�z�n �n�ne bir tablo getirelim: dizinin her bir eleman� (bizim ��renimizde ��renciler9 bir sat�rda yer alm�� olsun; s�tunlar olarak da bu elemana ait de�erler yer al�yor. S�tun ba�l��� ise, bu de�erin endeksi olan anahtar! �imdi bu b�l�m�n ba��nda yazd���m�z dizi_degiskenler0i.php adl� dosyay� a�al�m tek sat�rl�k print() komutunun yerine �u sat�rlar� yazarak dizi_degiskenler08.php ad�yla kaydedelim:
foreach ( $ogrenciler as $ogrenci ) {
foreach ( $ogrenci as $anahtar => $deger ) {
print ("$anahtar = $deger <br> ");
}
print ("<br>");
}
K�saca irdelersek, bu kodda foreach d�ng�s�n�n �nce �ok-boyutlu de�i�kenimizin bir sat�r�n� i�indeki b�t�n anahtar+de�er �eftleri ile ele al�p, t�m�n� $ogrenci adl� de�i�kene ge�ici olarak yerle�tirdi�ini g�r�yoruz. Bu foreach d�ng�s�n�n ilk i�i yeni bir foreach d�ng�s� ba�latmak oluyor. Yeni foreach ise saz� eline al�r almaz, �nce, kendisi �ok �geli bir de�i�ken olan (��nk� i�inde bir ��renciye ait, t�m de�i�kenler ve onlar�n endeks adlar� var) $ogrenci de�i�keninin i�indeki anahtar ve de�er �iftlerini tek-tek, $anahtar ve $deger de�i�kenlerine yerle�tiriyor; sonra print() komutu ile, aralar�na e�ittir i�areti koyarak bu de�i�kenlerin de�erlerini Browser penceresine g�nderiyor. Bu d�ng� biter bitmez, ilk foreach yapt�raca�� i�lere kald��� yerden devam ediyor; ve ekrana bir yeni sat�r komutu g�nderierek, ba�a d�n�yor; bu kez �ok boyutlu dizi de�i�kenin yeni bir elemana ge�iyor. Taa ki, dizinin b�t�n elemanlar� ve elemanlar�n b�t�n �geleri bitinceye kadar.
<php00020.tif>
Bu noktada bir uyar�: Ger�ek programda bir dizinin elemanlar�na ilk ula�t���m�zda, eleman�n i�inde de�er bulunup bulunmad���n� anlamak yerinde olur. Bunu is_array() fonksiyonu ile yapabiliriz. Bu fonksiyon, dizinin i�inde de�er varsa, True/Do�ru, yoksa False/Yanl�� kar��l���n� verecektir. Buradaki �rnekte, ilk foreach sat�r�ndan hemen sonra:
is_array( $ogrenci )
sat�r�n� koyarak, dizinin o anda okunan eleman�n i�inde de�er bulunup bulunmad���n� anlayabiliriz.
Dizi De�i�kenlerin D�zenlenmesi
Dizi de�i�kenlerin daha verimli �ekilde kullan�lmas� i�in PHP bize bir tak�m ara�lar sa�lar. Bunlarla dizi de�i�kenleri birle�tirebiliriz; i�inden kesit alabiliriz, s�ralayabiliriz veya baz� elemanlar�n� silebiliriz. �imdi k�saca bu i�lemleri ele alal�m:
Dizileri birle�tirme: array_merge()
�ki veya daha fazla dizinin b�t�n elemanlar�n� birle�tirerek, ortaya yeni bir dizi ��kart�r. �rnek:
$birinci_dizi = array ( "�zbay" , "Muharrem" , "Hasan" , "�ahika" );
$ikinci_dizi = array ( "Altun" , "Ta�" , "Civelek" , "Tabak" );
$yeni_dizi = array_merge ( $birinci_dizi, $ikinci_dizi );
Bu kod ile olu�turulan $yeni_dizi isimli dizi de�i�kenin hangi elemanlara sahip oldu�unu, ��yle bir kodla g�rebilirsiniz:
foreach ( $yeni_dizi as $yeni_eleman ) {
print (" $yeni_eleman <br>");
}
�kinci dizinin b�t�n elemanlar�, birinci dizinin elemanlar�n�n arkas�na eklenmi� olmal�. array_merge() i�lemi, �ok-boyutlu ili�kili dizilere de uygulanabilir; PHP iki dizideki uyumlu-uyumsuz, yani birinde olan di�erinde olmayan b�t�n anahtar+de�er �iftlerini yeni dizide de olu�tur. (array_merge() i�leminden sonra birle�tirilen dizilerin de�i�meden kald���na dikkat edin.)
Dizilere de�i�ken ekleme: array_push()
Bir diziye yeni de�i�kenler eklemek i�in, array_push() fonksiyonuna mevcut dizinin ad�n� ve yeni de�erleri yazar�z. �rnek:
$birinci_dizi = array ( "�zbay" , "Muharrem" , "Hasan" , "�ahika" );
$yeni = array_push ($birinci_dizi, "Altun" , "Ta�" , "Civelek" , "Tabak" );
Burada $yeni adl� de�i�ken sadece $birinci_dizi adl� dizinin yeni eleman say�s�n� tutar. array_push(), kendisine ad�n� verdi�imiz dizinin i�eri�ini de�i�tirir. Yukar�daki �rnekte i�ine yeni de�erler yaz�lan dizinin elemanlar�n� g�r�nt�lemek i�in ��yle bir kod yazabiliriz:
print ("\$birinci_dizi adl� dizide $yeni_dizi adet de�i�ken var<br>");
foreach ( $birinci_dizi as $ogrenci ) {
print ("$ogrenci <br> ");
}
Dizinin ilk eleman�n� silme: array_shift()
Bir dizi-de�i�kenin ilk eleman�n� t�m�yle silmek i�in array_shift() fonksiyonunu kullan�r�z. Bu fonksiyona sadece birinci eleman� silinecek dizinin ad�n� vermek yeter. �rnek:
$birinci_dizi = array ( "�zbay" , "Muharrem" , "Hasan" , "�ahika" );
$silinen = array_shift ($birinci_dizi);
array_shift(), ad�n� verdi�iniz dizinin i�eri�ini de�i�tirir; buradaki �rnekte, $silinen adl� de�i�ken dizinin silinen birinci eleman�n de�erini tutar.
Diziden kesit alma: array_slice()
Bir dizi-de�i�kenin b�t�n elemanlar� yerine bir kesitini kullanmak istiyorsak, bunu array_slice() fonksiyonu ile yapabiliriz. Bu fonksiyona kesit al�nacak dizinin ad�, kesitin ba�lad��� yer ve ka� adet de�i�ken al�naca�� arg�man olarak verilir. �rnek
$birinci_dizi = array ( "�zbay" , "Muharrem" , "Hasan" , "�ahika", "Altun" , "Ta�" , "Civelek" , "Tabak");
$kesit = array_slice ($birinci_dizi , 3, 4);
Burada, PHP'ye $kesit adl� yeni dizi de�i�kene, $birinci_dizi adl� dizinin 3'nc� de�erinden itibaren (3 dahil) d�rt de�eri yerle�tirmesini bildiriyoruz. array_slice(), ad�n� verdi�imiz de�i�kenin i�eri�ine dokunmaz; yeni dizi de�i�ken olu�turulur.
Dizileri s�ralama: sort() ve rsort()
Bir dizinin i�indeki de�erleri alfabetik veya k���kten b�y��e do�ru s�ralamak i�in sort() fonksiyonunu kullan�r�z. �rnek:
$birinci_dizi = array ( "�zbay" , "Muharrem" , "Hasan" , "�ahika", "Altun" , "Ta�" , "Civelek" , "Tabak");
sort ($birinci_dizi);
PHP, dizideki b�t�n de�erleri A'dan Z'ye s�raya sokacakt�r. sort() fonksiyonu dizinin i�e�ini de�i�tirir. Bir diziyi Z'den A'ya veya b�y�kten k����e do�ru s�ralamak i�in de rsort() fonksiyonunu kullanabilirsiniz. (PHP4.0 T�rk�e karakterleri tan�m�yor.) Bir noktada dikkatli olmak gerekir: bu fonksiyonu ili�kili (de�erlerin anahtar� olarak endeks ad� bulunan) dizide kullan�rsan�z, PHP, anahtar de�erlerini (endeks adlar�n�) atar, yerine 0'dan itibaren rakam koyar. Bunu �nlemek i�in, ili�kili dizileri asort() veya ksort() fonksiyonu ile s�ralamak gerekir.
�li�kili dizileri s�ralama: asort() ve ksort()
�li�kili dizilerin di�er dizi de�i�kenlere g�re fark�, de�erlerinin bir de ad� bulunmas�d�r. De�erlerin adlar�na anahtar denir. Bir ili�kili diziyi de�erlerine g�re s�ralamak i�in asort() fonksiyonu kullan�l�r. �rnek:
$birinci_dizi = array ( ogr_01=>"�zbay", ogr_02=>"Muharrem" , ogr_013>"Hasan" , ogr_04=>"�ahika");
asort ($birinci_dizi);
PHP, bu diziyi de�erler itibariyle alfabetik s�raya sokacakt�r. E�er s�ran�n de�ere g�re de�il de de�erlerin anahtar�na (burada ogr_01, ogr_02 olan kelimeler) g�re yap�lmas�n� istiyorsak, ksort() fonksiyonunu kullan�r�z. �rnek:
$birinci_dizi = array ( ogr_01=>"�zbay", ogr_02=>"Muharrem" , ogr_013>"Hasan" , ogr_04=>"�ahika");
ksort ($birinci_dizi);
PHP, �imdi bu diziyi anahtarlara g�re alfabetik s�raya sokacakt�r.
Nesneler
Nesne y�nelimli (Object-oriented) programlama icad edildi�inde, geleneksel programlamaya a�ina olanlar �nce teredd�t ettiler; sonra bunun ne harika bir teknik oldu�nunu g�rd�ler ve nesnelerden vazge�mez oldular. Kabaca tan�mlarsak, nesne, kendi de�i�kenleri ve icra edece�i komutlardan olu�an fonksiyonlar� ile bir b�t�nd�r. Nesneyi bir kere tan�mlad�ktan sonra istedi�imiz kadar �rne�ini olu�turabiliriz. Bir nesnenin yapaca�� i�ten, o nesnenin metodu diye s�z ederiz. Bu a��dan bakarsan�z, programlar�m�zda nesneler sadece metodlar� i�in i�e yararlar.
Diyelim ki program�m�zda bir "��renci" nesnesi olu�turmak istiyoruz. Bu nesnenin i�inde ad�, soyad� ve notlar gibi de�i�kenler, ve bu de�i�kenlerle yap�lan bir tak�m i�ler bulunsun. ��e nesnenin tabir yerinde ise �ablonu olan class'� olu�turmakla ba�layal�m; gerisini de yapt�k�a g�relim.
Bir Nesne Olu�tural�m
Bir nesne olu�turmak i�in �nce onu tan�mlamam�z gerekir. Bunu PHP'nin class deyimini kullanarak yapabiliriz. Bir nesnenin �zellikleri (properties) ve metodlar� (methods) vard�r. �u kodu nesneler01.php ad�yla kaydedin:
<HTML>
<HEAD>
<TITLE>PHP'de Degiskenler</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<B>
<H2>
<?php
class ogrenci {
// �zellikleri tan�mlayal�m
var $adi;
var $soyadi;
var $sinav1;
var $sinav2;
var $not;
// metodlar� tan�mlayal�m
function adi_belirle ($n) {
$this->adi = $n;
}
function soyadi_belirle ($n) {
$this->soyadi = $n;
}
function sinav1_belirle ($n) {
$this->sinav1 = $n;
}
function sinav2_belirle ($n) {
$this->sinav2 = $n;
}
function not_hesapla() {
$this->not = ($this->sinav1 + $this->sinav2)/2;
print ($this->adi. " " . $this->soyadi . " i�in not ortalamas�: ". $this->not);
}
}
//Buraya ba�ka kodlar girecek
$ogr1 = new ogrenci();
$ogr1 -> adi_belirle("�ahika");
$ogr1 -> soyadi_belirle("Tabak");
$ogr1 -> sinav1_belirle(7);
$ogr1 -> sinav2_belirle(10);
$ogr1 -> not_hesapla();
?>
</H2>
</B>
</BODY>
</HTML>
Bu programda ogrenci adl� bir nesne tan�ml�yoruz; ve daha sonra bir de�i�ken ad�na new komutu ile bu nesnenin bir �rne�ini olu�turuyoruz. Nesnelerin yeni bir �rne�i veya kopyas�n� ��kartmak ifadeleri asl�nda yapt���m�z� tam anlatm�yor. Nesnenin tan�m� bir adet; her new komutu ile bu nesnenin �zelliklerine ve metodlar�na sahip yeni bir nesne yapm�� oluyoruz. Nitekim bu i�e insan�n dilini dolayan �ngilizce bir kelimeyle Instantiation (yeni bir varl���n� olu�turma) deniyor. Bu �rnekte, $ogr1 adl� de�i�ken ger�ekte, ogrenci nesnesinin tam bir �rne�i: i�inde be� de�i�ken ve alt� metod var. Nesneyi bir kere tan�mlad�ktan sonra program�n daha ileri a�amalar�nda bu istedi�imiz kadar �rne�ini farkl� isimler vererek olu�turabiliriz. �imdi �u sat�ra dikkat edelim:
$ogr1 = new ogrenci();
$ogr1 -> adi_belirle("�ahika");
Burada $ogr1'in parametrelerine nas�l de�er yazd�rd���m�z� g�r�yorsunuz. Nesnenin metodlar�ndan biri olan adi_belirle fonksiyonuna bir de�er veriyoruz: "�ahika"; nesne olu�turulurken yaz�lm�� olan bu fonksiyon ise ald��� de�eri, kendi ait oldu�u nesnenin bir de�i�kenine kaydediyor:
function adi_belirle ($n) {
$this->adi = $n;
}
Bu ve di�er fonksiyonlarda kulland���m�z "$this->" ifadesi, kendisine ula�t�r�lan de�eri bir parametre olarak kullan�yor ve "$adi" de�i�kenine yaz�yor. "this" (bu) kelimesi o anda nesnenin o anda olu�turulmakta olan �rne�ine g�ndermede bulunur. "->" i�lemcisini kullanarak, istedi�imiz nesnenin istedi�imiz metoduna veya parametresine de�er g�nderebiliriz. Bir nesnenin yeni bir �rne�ini olu�turdu�umuz zaman, bu �rne�in b�t�n parametrelerini sa�lamak veya b�t�n metodlar�n� kullanmak zorunda de�iliz.
Yukar�daki �rne�e g�re yeni �rnekler olu�turarak en az d�rt ��rencinin not ortalamas�n� hesabedebilir misiniz?
PHP ile Web programc�l��� yolunda h�zl� ad�mlarla yol al�yoruz. Bu b�l�mde g�rd���m�z dizi de�i�kenler ve nesneler, Web sayfalar�m�zda bir �ok i�i adeta otomatik hale getirecek unsurlar olarak kullan�lacak.
PHP ��ba��nda
PHP'de bir program� olu�turmaya ve program�n ak���n� kontrol etmeye yetecek kadar bilgi sahibi olduk. Bu b�l�mde, bu bilgilerimizi uygulamaya koyaca��z; ve bu arada hal� ��renmemiz gereken bir iki noktaya ayr�nt�l� olarak de�inece�iz. �zellikle metinlerin d�zenlenmesi konusuna bakmam�z ve ve D�zenli �fadeler (Regular Expressions) denen kavramla tan��mak ve bunun ara�lar�n� ��renmek zorunday�z. PHP'nin i�ba��nda olmas� demek, PHP bilgimizi HTML sayfalar�m�z� PHP ile olu�turma, Form bilgilerini derleme, bir veritaban�ndan veri alarak bunlar� sayfalar�m�zda kullanma ve ziyaret�inin verece�i bilgileri veritaban�na i�leyebilmek demektir. �imdi kollar� yeniden s�vayal�m ve PHP'yi uygulamaya koyulal�m.
Formlar
Web sunucusu ve istemcisi (Browser) aras�ndaki etkile�me ve al��veri�in nas�l i�ledi�ine ili�kin bilgilerimiz oldu�unu varsayarak, sadece Internet'te Form, bir Web sayfas�n�n ziyaret�iden veri alabildi�i ve bunlar� Web sunucusuna ula�t�rabildi�i ba�l�ca ara� oldu�unu hat�rlayal�m. Form, ziyaret�inin bizim istedi�imiz bilgilerin yan� s�ra ziyaret�inin bilgisayar�ndan Web sunucusu bilgisayara, daha bir �ok bilgiyi de beraberinde getirir. Web programc�s� ve Web tasar�mc�s� olarak bu bilgileri bilmeye daima ihtiyac�m�z var. S�z gelimi, ziyaret�imizin Browser t�r�n� ve s�r�m� belirleyerek, onu, uygun sayfaya y�nlendirmekten tutun, ziyaret�iden istedi�imiz bilgilerin Sunucu'ya ula�t���nda nerede ve hangi de�i�kende tutuldu�una kadar, gerekli bir �ok bilgi Sunucu �ievre de�i�kenleri ve Sunucu de�i�kenleri dedi�imiz dizilerde bulunur. Form tasar�m�na ve bir Form'un bilgilerini PHP ile yakalamaya ve i�lemeye ge�meden �nce Web Server'� ve bize verdi�i bilgileri daha yak�ndan tan�nam�z yararl� olur.
Bunun i�in �nce �u program� formlar01.php ad�yla kaydedin ve �al��t�r�n:
<HTML>
<HEAD>
<TITLE>PHP'de Nesneler</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<?php
foreach ($GLOBALS as $anahtar=>$deger ) {
print ($anahtar . " = " . $deger . "<br>");
}
?>
</BODY>
</HTML>
�imdi Browser penceresinde g�rd���n�z bilgileri irdeleyelim; ��nk� biraz sonra ziyaret�iden Form ile gelen verileri yakalarken ve i�lerken bu bilgilerden yararlanaca��z. (Bu program� ki�isel bilgisayar�n�zda, ki�isel Web sunucuda �al��t�r�yorsan�z, ayn� program�n ger�ek bir Unix-tabanl� Web sunucuda (Apache) nas�l sonu� verdi�ini http://www.mycgiserver.com/~ocal/formlar01.php adresinde g�rebilirsiniz. Sunucu'nun olu�turdu�u di�er de�i�kenleri ise http://www.mycgiserver.com/~ocal/php.php adresinde inceleyebilirsiniz.)
Bu programla PHP'nin daima varolan $GLOBALS dizisinin �yelerini g�r�nt�l�yoruz. $GLOBALS bir ili�kili-dizi-de�i�ken, yani de�i�ken de�erlerinin endeks ad� (anahtar�) bulunan bir dizi oldu�u i�in, i�erdi�i de�erlere adlar� ile ula�abiliriz. Bu programda, $GLOBALS'�n anahtarlar�n� $anahtar, de�erlerini ise $de�er de�i�kenine yazd�r�yoruz ve bir foreach d�ng�s� ile Brnowser penceresine g�nderiyoruz. Program� �al��t�rd���m�z sisteme ve Web sunucu program�na ba�l� olmak �zere, ekran�m�zda bir �ok de�i�ken g�rebiliriz. Bunlar aras�nda b�t�n HTTP Server programlar� i�in ortak ve Web programc�s� i�in �nemli de�i�kenler �unlard�r:
HTTP_ENV_VARS HTTP Sunucu program�n �al��makta olan PHP dosyas� i�in olu�turdu�u �evre de�i�kenlerinin yaz�l� oldu�u dizi de�i�ken. Bu de�i�kenin i�inde �u unsurlar bulunur:
HOSTNAME: Sunucunun IP adresi
SHELL: Unix sisteminde kullan�lan Shell program�
HOSTTYPE: Sunucunun ad� ve s�r�n�
OSTYPE: Sunucu'nun i�letim sistemi
HOME: �al��an program�n k�k dizini
PATH: �al��an program�n Sunucu'daki yolu
HTTP_SERVER_VARS Sunucu program�n �al��makta olan PHP dosyas�na sundu�u baz� bilgilerin bulundu�u dizi de�i�ken. Bu de�i�kenin i�inde �u unsurlar bulunur:
PHP_SELF: �al��an PHP program�n�n bulundu�u dizin ve ad�
PATH_TRANSLATED: �al��an PHP program�n�n fiziksel yolu
HTTP_GET_VARS Bir Form'dan GET metoduyla al�nan bilgilerin anahtar=de�er �iftleri olarak kaydedildi�i dizi de�i�ken
HTTP_POST_VARS Bir Form'dan POST metoduyla al�nan bilgilerin anahtar=de�er �iftleri olarak kaydedildi�i dizi de�i�ken
HTTP_USER_AGENT Ziyaret�inin bilgisayar�nda kurulu Internet Browser program�
QUERY_STRING Form ile bilgi al�rken GET metodunu kulland���m�z takdirde, Browser'�n g�nderece�i bilgilerin tutuldu�u de�i�ken
REMOTE_ADDR Ziyaret�inin bilgisayar�na ISS taraf�ndan atanm�� IP adresi
REQUEST_METHOD Form ile gelen bilgilerin g�nderildi�i metod: GET veya POST
REQUEST_URI O anda �al��makta olan PHP dosyas�n�n ad� ve varsa bu ada eklenmi� Query_String
SCRIPT_FILENAME O anda �al��makta olan PHP program�n�n dosya ad�
SCRIPT_URI O anda �al��makta olan PHP program�n�n tam URL adresi
SERVER_ADDR Sunucunun IP adresi
SERVER_PROTOCOL Sunucunun HTTP protokol�n�n s�r�m�
Form'dan GET Metoduyla Gelen Bilgiler
Ziyaret�ilerimizin ne t�r Browser kulland�klar�n� HTTP_USER_AGENT de�i�keninin de�erini alarak ve bu de�erin i�inde belirli anahtar kelimeleri aratarak bulabiliriz. Form ile gelen bilgiler, GET metodu ile al�n�yorsa, hem QUERY_STRING, hem de HTTP_GET_VARS dizisine kaydolur. POST metoduyla ald���m�z bilgileri HTTP_POST_VARS de�i�kenin de�erleri aras�nda buluruz. Bunlar� ��rendi�imize g�re, �imdi ger�ekten bir HTML Form'u yapabil ve bununla ziyaret�imizden bilgi alabiliriz.
Basit bir HTML Form'u tasarlayal�m. A�a��daki kodlar� formlar02.htm ad�lyla kaydedin:
<HTML>
<HEAD>
<TITLE>PHP'de Formlar</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<FORM ACTION="formlar02_isle.php" METHOD="GET">
Ad�n�z, Soyad�n�z: <INPUT TYPE="TEXT" NAME="adi">
<br>
Elektronik Adresiniz: <INPUT TYPE=TEXT" NAME="adres">
<br>
<INPUT TYPE="SUBMIT" VALUE="G�nder Gitsin!"> <INPUT TYPE="RESET" VALUE="Vazge�, G�nderme!">
</FORM>
</BODY>
</HTML>
Bu Form'la Web tasar�m yar��mas�na kat�lmayaca��m�za g�re, �imdilik sadece Web Sunucuya bilgi g�ndermekte kullanabiliriz. Form'un ACTION parametresine dikkat ederseniz, formlar02_isle.php adl� bir dosyan�n ad�n� g�receksiniz. Bu, ziyaret�inin G�nder d��mesini t�klamas�yla birlikte Form'un i�erdi�i bilgilerin METHOD parametresinde paz�l� olan GET y�ntemiyle Sunucu'da g�nderilece�i program�n ad�d�r. Bu sayfa, Browser'da ��yle bir g�r�nt� verecektir:
<php00021.tif>
�imdi bir an i�in ne olaca��n� d���nmeden, formu doldurun ve G�nder d��mesini t�klay�n; ve Browser'�n�zdaki hata mesaj�na ald�rmadan, URL adres kutusunda ne yazd���n� okuyun:
http://server/formlar02_isle.php?adi=Muharrem+Ta%E7&[email protected]
Bu, HTTP protokol�ne g�re GET yoluyla bilgi g�ndermekte kullan�lan y�ntemin tam bir �rne�idir: Browser, GET yoluyla bilgi g�nderece�i zaman, Form'daki b�t�n bilgileri URL-Encoding denen sistemle kodlar; Form'un alan adlar�na o alanlara ziyaret�inin yazd��� bilgileri bir e�ittir i�aretiyle ekler; bu t�r alan=girdi �iftlerinin aras�na & (ve i�areti) koyar ve g�nderir. Web sunucu, bu bilgileri al�nca, �nce kendi olu�turdu�u baz� de�i�kenlere (hem QUERY_STRING, hem de HTTP_GET_VARS dizisine) yazar ve sonra URL hanesinde ad� yaz�l� olan programa (sayfaya) verir. �imdi bizim bu bilgilerin g�nderildi�i PHP program�n� kendisine verilecek bu bilgileri i�lemeye haz�r �ekilde yazmam�z gerekir. �u a�a��daki kodlar� formlar02_isle.php ad�yla kaydedin:
<HTML>
<HEAD>
<TITLE>PHP'de Formlar</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<?php
print ("Say�n <b>$adi</b>\n\n");
print ("<p>Elektronik adresiniz: <b>$adres </b></p>\n\n");
?>
</BODY>
</HTML>
�imdi, Browser'�n�zda formlar02.htm sayfas�n� yeniden a��n, Form'u doldurun ve g�nderin. A��lacak sayfa, Form'un g�nderec�ii bilgileri alacak ve kendi g�r�nteleyecektir.
<php00022.tif>
Fakat burada g�rd���n�z gibi Sunucu'nun ziyaret�iden gelen bilgileri depolad��� dizileri kullanmad�k. Bunu yaparken, GET ile gelen bilgiler kendisinde verildi�inde PHP program�n�n alan adlar�n� de�i�ken ad�, bunlar�n kar��s�nda yaz�l� olan verileri de bu de�i�kenin de�eri saymas�ndan yararland�k. Fakat isteseydik, bu de�i�kenleri, Sunucu'nun olu�turdu�u dizilerden de alabilirdik. �imdi hem Form'umuzu geli�tirelim; hem de bu kez okuma i�ini Sunucu dizisinden yapal�m.
�nce Form'umuzu de�i�tirelim ve formlar03.htm ad�yla kaydedelim:
<FORM ACTION="formlar03_isle.php" METHOD="GET">
Ad�n�z, Soyad�n�z: <INPUT TYPE="TEXT" NAME="adi">
<BR>
Elektronik Adresiniz: <INPUT TYPE=TEXT" NAME="adres">
<BR>
Hangi notunuzu ��renmek istiyorsunuz?
<BR>
<SELECT NAME="hangi_not">
<OPTION>--L�tfen se�iniz--
<OPTION>S�nav 1
<OPTION>S�nav 2
<OPTION>Ortalama
</SELECT>
<BR>
<INPUT TYPE="SUBMIT" VALUE="G�nder Gitsin!"> <INPUT TYPE="RESET" VALUE="Vazge�, G�nderme!">
</FORM>
Yeni Form'da yeni bir HTML unsuruna yer verdi�imizi ve SELECT..OPTION etiketi ile ziyaret�iye bir se�im imkan� verdi�imizi g�r�yorsunuz. �imdi, bu Form'un g�nderece�i bilgileri i�leyecek PHP program�n� yazal�m. A�a��daki kodlar� formlar03_isle.php ad�yla kaydedelim:
<HTML>
<HEAD>
<TITLE>PHP'de Formlar</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<?php
foreach ($HTTP_GET_VARS as $anahtar=>$deger ) {
print ("<b>$anahtar = $deger <br>\n");
}
?>
</BODY>
</HTML>
Demi�tik ki, Web sunucu, bir istemci Browser'dan kendisine GET y�ntemiyle yollanan Form bilgilerini $HTTP_GET_VARS adl� dizi de�i�kende tutar. Yine daha �nce g�rm��t�k ki dizi de�i�kenlerin i�inde ya say� ya da isim olarak bir anahtar ve bu anahtar�n temsil etti�i bir de�er vard�r. Burada, $HTTP_GET_VARS de�i�keninin anahtar ve de�erlerini $anahtar ve $deger de�i�kenlerine => operat�r�n�n yard�m�yla, bir foreach d�ng�s� i�inde at�yoruz. D�ng� kullanmam�z�n sebebi, dizi de�i�kenin i�inde birden fazla anahtar=de�er �ifti bulunmas� ihtimali bulunmas�; d�ng� olarak da foreach kullanmam�z�n sebebi dizide ka� adet anahtar=de�er �ifti bulundu�unu bilmememizdir.
<php00023tif>
Form sayfas�n�n g�nderdi�i bilgilerin nas�l derlenip toplan�p URL-koduyla Sunucuya g�nderildi�ini, Form'un G�nder d��mesini t�klad���m�zda Browser'�n URL adres hanesinde ilen bilgilerin g�r�lecektir. Buradaki �rnekte bu bilgi (HTTP b�l�m�n� ve URL kodlar�n� kald�rarak):
adi=�ahika+Tabak&[email protected]&hangi_not=S�nav+1
�eklindedir. Bu bilgi, sunucu taraf�ndan $HTTP_GET_VARS dizi de�i�keninin i�ine yaz�ld���na g�re, daha �nce g�rd���m�z gibi dizi de�i�kenlerin anahtarlar�n� ve bu anahtarlar�n temsil etti�i de�erleri bir d�ng� i�inde $anahtar ve $deger de�i�kenlerine atarsak, daha sonra bu de�i�kenlerin de�erlerini Browser penceresine g�ndermemiz m�mk�n olur.
//////////////////////////////KUTU/////////////////
URL Kodlar�
HTTP protokol�ne g�re, temel ASCII listesi i�inde yer almayan karakterler, ve tabi� bu arada sadece T�rk�e'de baz� di�er alfabelerde bulunan harfler, bir Form'da yer ald��� taktirde, Browser taraf�ndan URL �emas�na g�re kodlanarak g�nderilir. Ger�i bir �ok HTTP sunucu program�bu karakterlere tan�yabilir ve bir dosyaya yazarken do�ru �ekilde yazabilirler; ama bu �evirme i�leminin bazen program yard�m�yla yap�lmas� gerekebilir. Bizim i�in �nemli karakterler ve URL kodlar� ��yle:
� = %FC
� = %DC
� = %F6
� = %D6
� = %FD
� = %DD
� = %F0
� = %D0
� = %FE
� = %DE
� = %E7
� = %C7
% = %25
& = %26
[ = +%5B
] = %5D
{ = %7B
} = %7D
? = %3F
= = %3D
/////////////////////KUTU
B�TT�////////////
�imdi biraz dizi-de�i�ken i�ine dizi-de�i�ken koyal�m! Yani ziyaret�inin g�nderece�i bilgiler, buradaki gibi SELECT..OPTION etiketinde yapaca�� sadece bir unsur se�imi olmas�n da �oklu-se�im olsun. HTML bilgilerinizi yoklarsan�z, bunu SELECT etiketini MULTIPLE parametresi ile yapabildi�imizi hat�rlayacaks�n�z. Biraz �nceki kaydetti�imiz dosyan�n sadece Form b�l�m�n� a�a��daki gibi geli�tirerek, formlar03a.htm ad�yla kaydedelim:
<FORM ACTION="formlar03a_isle.php" METHOD="GET">
Ad�n�z, Soyad�n�z: <INPUT TYPE="TEXT" NAME="adi">
<BR>
Elektronik Adresiniz: <INPUT TYPE=TEXT" NAME="adres">
<BR>
Hangi notunuzu ��renmek istiyorsunuz?
<BR>
<SELECT NAME="hangi_not[]" MULTIPLE>
<OPTION>S�nav 1
<OPTION>S�nav 2
<OPTION>Ortalama
</SELECT>
<BR>
<INPUT TYPE="SUBMIT" VALUE="G�nder Gitsin!"> <INPUT TYPE="RESET" VALUE="Vazge�, G�nderme!">
</FORM>
Burada, HTML'in SELECT.. OPTION etiketlerini kullanarak, ziyaret�imizden hangi s�nav notunu ��renmek istedi�ini bize bildirmesini istiyoruz. Dikkat etti�iniz gibi, bu kez Form, elde edece�i verileri formlar03a_isle.php program�na yollamak istiyor. Form'daki <SELECT NAME="hangi_not[]" MULTIPLE> sat�r�na da dikkat ettiniz mi? Bu sat�r�n �zelli�i, daha �nceki SELECT..OPTION etiketinden farkl� olarak ziyaret�inin �oklu se�me yapmas�na imkan veriyor; ve elde edilecek de�eri "hangi_not[]" alan�n�n de�eri olarak bildiriyor. HTTP ileti�im ilkelerine g�re �oklu-se�im halinde se�ilen OPTION de�erleri Sunucu'ya ayn� alan ad�n�n kar��s�na yaz�larak g�nderilir. Formumuzun g�nderece�i bilgi yuma��n� sat�rlar haline getirirsek (HTTP b�l�m�n� atar ve URL kodlar�n� ��zersek) bunu g�rebiliriz:
adi=�ahika Tabak
hangi_not[]=S�nav 1
hangi_not[]=S�nav 2
hangi_not[]=Ortalama
Kendisine b�yle bir bilgi yuma�� gelen Server, bunun t�m�n� $HTTP_GET_VARS dizi de�i�keninin i�ine yazacakt�r. Ba�ka bir deyi�le, bu dizi de�i�ken ��ok-boyutlu �ok-elemanl� ili�kili-dizi oldu�u i�in, i�inde rahat�a ayn� isimde de�i�kenlere farkl� endeks say�s� verecektir. Fakat sorun PHP'nin, bu dizinin i�inden de�i�kenleri almas�nda ortaya ��kacak ve endeks ismi ayn� olan de�i�kenler sorun olacakt�r. Bunu de�i�kenin endeks ad� olarak kullan�lacak kelimenin yan�na k��eli parantez koyarak ��z�yoruz. PHP bu ad� g�r�nce, bunun �ok-elemanl� bir dizi de�i�ken olaca��n� anlayacakt�r.
E�er bu formu, formlar03_isle.php program�na g�nderseniz (bunu nas�l yapabilirsiniz?), "hangi_not" de�i�keninin de�eri olarak Browser penceresinde "array" kelimesinin belirdi�ini g�rebilirsiniz. ��nk� PHP a��s�ndan bu de�i�ken bir dizidir ve i�inde anahtar=de�er �iftleri vard�r. Daha �nce anahtar=de�er �iftlerini ge�ici de�i�kenlere atay�p bir d�ng� ile yazd�rm��t�k. �imdi, PHP kodumuzu bu duruma uygun hale getirelim. Biraz �nce yazd���m�z Form i�leme program�n�n sadece PHP b�l�m�n� ��yle de�i�tirerek, formlar03a_isle.php ad�yla kaydedelim:
<?php
foreach ($HTTP_GET_VARS as $anahtar=>$deger ) {
if ( gettype ($deger ) == "array" ) {
print ("$anahtar == <br>\n");
foreach ( $deger as $yeni_degerler )
print (".. $yeni_degerler<br>");
}
else {
print ("<b>$anahtar = $deger <br>\n");
}
}
?>
PHP'nin gettype() fonksiyonunu daha �nce g�rm�� ve bir de�i�kenin t�r�n� anlamaya yarad���n� ��renmi�tik. Burada $HTTP_GET_VARS de�i�keninden ald���m�z de�erlerden herhangi birinin ger�ekten bir de�i�ken de�eri mi, yoksa bir dizi (array) mi oldu�unu gettype() ile anlayabiliriz. E�er de�er olarak kar��m�za "array" kelimesi ��karsa, bunu kendi i�inde anahtar ve de�er olarak b�lebilir ve herbirini ayr� ayr� g�r�nt�leyebiliriz. E�er $HTTP_GET_VARS de�i�keninden ald���m�z de�er, dizi de�il de ger�ekten bir de�i�ken ise (else) do�ruca bu de�eri ve anahtar�n� yazd�racakt�r. Sonu� ise dizi-de�i�ken i�indeki dizi-de�i�kenin de�erlerinin tek tek g�r�nt�lenmesi olacakt�r.
<php00024.tif>
Form'dan POST Metoduyla Gelen Bilgiler
HTML Form etiketinin METHOD parametresinin de�eri GET olabildi�i gibi POST da olabilir; ve HTTP sunucusu bu y�ntemle gelen bilgileri $HTTP_POST_VARS dizi-de�i�keninde tutar. Yukar�daki �ok-se�meli Form'un FORM etiketini ��yle de�i�tirerek, formlar03b.htm ad�yla kaydedelim:
<FORM ACTION="formlar03a_isle.php" METHOD="POST">
Ayn� �ekilde son Form i�leme program�m�zda da sadece �u de�i�ikli�i yapal�m:
foreach ($HTTP_POST_VARS as $anahtar=>$deger ) {
Bu dosyay� da formlar03b_isle.php ad�yla kaydedelim. HTML sayfas�n� a�arak formu doldurur ve g�nderirseniz, sonucun metod olarak GET kullanan Form'dan hi� farkl� olmad���n� g�receksiniz. ��nk� PHP program� bu Form'un g�nderdi�i bilgilerin $HTTP_POST_VARS de�i�kenine yaz�ld���n� biliyordu. $HTTP_POST_VARS da PHP a��s�ndan i�inde anahtar=de�er �iftleri olan bir dizi-de�i�kendir; bu de�i�kenin de�erlerine de t�pk� daha �nce oldu�u gibi eri�iriz.
HTTP a��s�ndan GET ile POST'un tek fark� gelen de�erlerin nerede nas�l tutuldue�undan ibaret de�ildir. GET y�nteminde, bir Browser'�n sunucuya g�nderebilece�i verinin uzunlu�u, Sunucunun ayarlar�na ba�l� olmak �zere, s�n�rl�d�r. Oysa POST ile alaca��m�z veri miktar�, sadece sunucunun bulundu�u bilgisayar�n sabit disk alan�yla s�n�rl�d�r. (Tabi� bu g�n�m�zde s�n�rs�zd�r, anlam�na geliyor!) Bir ba�ka fark, Browser'�n GET yoluyla g�nderdi�i verilerin (ve bu arada ziyaret�inin parola olarak yazd�klar�nda ekrana y�ld�z olarak ��kan metinler dahil) t�m�, sunucuya, URL-kodlanm�� metin olarak, Browser'�n URL adres hanesine de yaz�lmas�d�r. Bir �ok kullan�c� i�in bu bir g�vensizlik belirtisi say�l�r. Bu iki unsur Formlar�m�zda metod olarak GET yerine POST kullanman�n daha yerinde oldu�unu g�sterir.
Tedbirli Web programc�l���, �zellikle birden fazla tasar�mc� ve programc�n�n birlikte �al��t��� ve Formlarda hangi y�ntemin tercih edildi�ini bilmenin kolay olmad��� projelerde, Form bilgisi i�leyen PHP programlar�m�zda Form'da hangi metod kullan�lm�� olursa olsun, i�lyeyici program�n iki duruma da elveri�li olmas�n� sa�lamakt�r. S�zgelimi son yazd���m�z Form i�leme program�m�z� ��yle de�i�tirir ve formlar03c_isle.php ad�yla kaydedersek, ve Form i�eren HTML sayfas�n� bu program� veri g�nderecek �ekilde de�i�tirirsek (nas�l?), her iki metodla g�nderilen verileri i�leme yetene�ine sahip bir program elde etmi� oluruz.
<?php
$form_bilgisi = ( isset($HTTP_POST_VARS ) )
? $HTTP_POST_VARS : $HTTP_GET_VARS;
foreach ($form_bilgisi as $anahtar=>$deger ) {
if ( gettype ($deger ) == "array" ) {
print ("$anahtar == <br>\n");
foreach ( $deger as $yeni_degerler )
print (".. $yeni_degerler<br>");
}
else {
print ("<b>$anahtar = $deger <br>\n");
}
}
?>
Form ile i�lemciyi Birle�tirelim
�u ana kadar yapt���m�z b�t�n Form �rneklerinde, Form'un bulundu�u HTML sayfas� ile bu Form'un g�nderece�i verileri i�leyen PHP program� iki ayr� belge halinde idi. Bu, buradaki �rneklerde oldu�u gibi, ziyaret�inin verdi�i bilgileri sadece Br�owser penceresine yazd�ran bir e�itim �al��mas� i�in belki uygun; ama ger�ek Web sitelerimizde ziyaret�ilerimizin verece�i bilgileri �o�u zaman sadece onlar�n Browser pencerelerinde g�stermekle kalmay�z, fakat bu bilgileri ya elektronik posta yoluyla kendimize yollar�z, ya da sunucuda bir d�zyaz� veya veritabas� dosyas�na i�leriz. Bu ve di�er ama�larla yapaca��m�z Form i�eren HTML sayfalar�, asl�nda PHP program�m�z�n bir i�inde yer alabilir; ya da ba�ka bir deyi�le, Form'umuz ziyaret�inin verece�i bilgileri kendi bulundu�u PHP program�na g�nderebilir!
Bu karma��k ifadeyi bir �rnekle a�al�m. Yukar�da yapt���m�z son HTML sayfas� ile ve PHP program�n� ��yle birle�tirelim; ve bunu formlar04.php ad�yla kaydedelim:
<?php
if ( isset ( $HTTP_POST_VARS )) {
print ("<HTML>\n");
print ("<HEAD>\n");
print ("<TITLE>PHP'de Formlar</TITLE>\n");
print ("<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-8859-9\">\n");
print ("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1254\">\n");
print ("</HEAD>\n");
print ("<BODY>\n");
foreach ($HTTP_POST_VARS as $anahtar=>$deger ) {
if ( gettype ($deger ) == "array" ) {
print ("$anahtar == <br>\n");
foreach ( $deger as $yeni_degerler )
print (".. $yeni_degerler<br>");
}
else {
print ("<b>$anahtar = $deger <br>\n");
}
}
print ("</BODY>\n");
print ("</HTML>\n");
}
else {
print ("<HTML>\n");
print ("<HEAD>\n");
print ("<TITLE>PHP'de Formlar</TITLE>\n");
print ("<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-8859-9\">\n");
print ("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1254\">\n");
print ("</HEAD>\n");
print ("<BODY>\n");
print ("<FORM ACTION=\"$PHP_SELF\" METHOD=\"POST\">\n");
print (" Ad�n�z, Soyad�n�z: <INPUT TYPE=\"TEXT\" NAME=\"adi\">\n");
print ("<BR>\n");
print (" Elektronik Adresiniz: <INPUT TYPE=\"TEXT\" NAME=\"adres\">\n");
print ("<BR>\n");
print (" Hangi notunuzu ��renmek istiyorsunuz? \n");
print ("<BR>\n");
print ("<SELECT NAME=\"hangi_not[]\" MULTIPLE>\n");
print ("<OPTION>S�nav 1 \n");
print ("<OPTION>S�nav 2 \n");
print ("<OPTION>Ortalama \n");
print ("</SELECT>\n");
print ("<BR>\n");
print ("<INPUT TYPE=\"SUBMIT\" VALUE=\"G�nder Gitsin!\">\n");
print ("<INPUT TYPE=\"RESET\" VALUE=\"Vazge�, G�nderme!\">\n");
print ("</FORM>\n");
print ("</BODY>\n");
print ("</HTML>\n");
}
?>
Bu dosyan�n t�m�yle PHP program� oldu�una dikkat ettiniz, tabi�? Program a��ld���nda sunucunun $HTTP_POST_VARS dizi-de�i�keninin bir de�er i�erip i�ermedi�ini bir if deyiminin i�inden bir de�i�kenin i�eri�i olup olmad���n� anlamam�za yarayan isset () fonksiyonu ile yap�yoruz. Bu �art do�ru ise, yani $HTTP_POST_VARS dizi-de�i�keni bir de�er i�eriyorsa, program, foreach d�ng�s�n�n i�inde bu de�i�kenin i�indekileri almaya ve Bro�wser penceresinde g�r�nt�lemeye ba�l�yor. Bu �art do�ru de�ilse, yani $HTTP_POST_VARS dizi-de�i�keni hen�z bir de�er i�ermiyorsa, if deyiminin birinci b�l�m�n� i�indeki hi� bir kod icra edilmiyor ve prgram else deyimine s��r�yor. Program�n else b�l�m� ise daha �nceki HTML kodlar�m�z� i�eren bir dizi print() fonksiyonu yerine getiriyor; yani Browser'a i�inde Form bulunan HTML sayfas�n� yazd�r�yor. Burada FORM etiketine dikkat edelim:
print ("<FORM ACTION=\"$PHP_SELF\"METHOD=\"POST\">");
Form'un ACTION parametresinde bir PHP program�n�n ad� yerine "$PHP_SELF" de�i�ken ad�n� g�r�yoruz. Bu, bu b�l�m�n ba��nda ele ald���m�z gibi, sunucunun bu PHP program�na sa�lad��� �evre de�i�kenlerinden biridir ve o anda �al��makta olan PHP program�n�n dosya ad�n� i�erir. (Bizim �rne�imizde bu de�i�kenin de�eri nedir?)
/////////////////KUTU/////////////////
Dosya "��kartma"
Internet'ten hep dosya "indiririz!" Bir sunucuya, Web ziyaret�isi olarak g�nderebildi�imiz tek �ey ise, Formlara yazd���m�z yaz�lard�r! Oysa HTML'in INPUT INPUT etiketinin �ok az kullan�lan TYPE="file" parametresi ziyaret�iye Web sunucusuna dosya g�nderme (upload) imkan� sa�lar. HTTP protokol� buna imkan vermekle birlikte Browser'lar bu imkan� kullanmaya ileri s�r�mlerinde kavu�tular. PHP4, ziyaret�ilerimizin sitemize dosya g�ndermeleri halinde, bu dosyalar�n y�netimine ayr�ca kolayl�k sa�layan de�i�kenlere sahiptir. �nce �u dosyay�, dosya_gonder.php ad�yla kaydedin:
<HTML>
<HEAD>
<TITLE>PHP'de Dosya G�nderme</TITLE>
<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-8859-9\">
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1254\">
</HEAD>
<?php
$dosya_dizin = "/inetpub/wwwroot/";
$dosya_url = "http://server/";
if ( isset ( $dosya_gonder )) {
print ("<b>Yol:</b> $dosya_gonder<br>\n");
print ("<b>Ad�:</b> $dosya_gonder_name<br>\n");
print ("<b>Boyut:</b> $dosya_gonder_size<br>\n");
print ("<b>T�r:</b> $dosya_gonder_type<br>\n");
copy ( $dosya_gonder, "$dosya_dizin/$dosya_gonder_name" )or die ("Dosya kopyalanam�yor!");
if ( $dosya_gonder_type == "image/gif" ||$dosya_gonder_type == "image/pjpeg" ) {
print ("<img src=\"$dosya_url/$dosya_gonder_name\"><p>\n\n");
}
}
?>
</BODY>
<FORM ENCTYPE="multipart/form-data" ACTION="<?php print $PHP_SELF?>" METHOD="POST">
<INPUT TYPE="hidden" NAME="MAX_FILE_SIZE" VALUE="951200">
<INPUT TYPE="file" NAME="dosya_gonder"><BR>
<INPUT TYPE="SUBMIT" VALUE="Dosya Yolla!">
</FORM>
</BODY>
</HTML>
Bu programda <INPUT TYPE="file" NAME="dosya_gonder"> etiketinde kulland���m�z NAME parametresine verdi�imiz de�er, ziyaret�imizin g�nderece�i dosyan�n sunucu taraf�ndan kaydedilece�i ge�ici dizinin tam yolunun yaz�laca�� de�i�kenin ad� olacakd�r. PHP, bu dosya ile ilgili her t�rl� bilgiyi bu adla kaydedektir. PHP, ziyaret�iden bir dosya ba�ar�yla aktar�ld��� anda otomatik olarak bu isimden yararlanarak �u de�i�kenleri olu�turur:
$dosya_gonder Ge�ici kay�t dizini yolu (UNIX'te /tmp/phpXXX, Windows'da Windows/TEMP0phpXXX. Burada XXX yerine ziyaret�ilerin g�nderdi�i dosyalar�n s�ra numaras�n� g�receksiniz.)
$dosya_gonder_name Ziyaret�inin g�nderdi�i dosyan�n ad�.
$dosya_gonder_size Ziyaret�inin g�nderdi�i dosyan�n boyutu.
$dosya_gonder_type Ziyaret�inin g�nderdi�i dosyan�n t�r�
PHP ayr�ca bu bilgileri $HTTP_POST_FILES dizi-de�i�keninde de tutar.
Yukardaki programda �u iki de�i�ken �ok �nemlidir:
$dosya_dizin = "/inetpub/wwwroot/";
$dosya_url = "http://server/";
$dosya_dizin ad�yla olu�turdu�umuz de�i�kene verece�imiz de�er, ziyaret�inin g�nderece�i dosyan�n kopyalanaca�� klas�r�n ad� olarak kullanlacakt�r. S�zgelimi Windows ortam�nda buraya ki�isel Web sunucunun varsay�lan klas�r�n�n ad�n� yazabilirsiniz. Ziyaret�inin g�nderece�i dosya bir GIF bi�iminde grafik dosyas� ise bunu Browser'da g�r�nteleyece�imiz i�in, bu dizinin Web'e a��k olmas�, ba�ka bir deyi�le bizim Web sunucumuzun eri�ebilece�i bir dizin olmas� gerekir. Nitekim, $dosya_url de�i�kenine de�er olarak bu klas�r�n URL adresini veriyoruz. Bu iki de�i�keni ger�ek Web sunucu i�in yazaca��m�z zaman, bizim sunucumuzun varnayd��� fiziksel klas�r ad�n� ve yolunu bulmam�z gerekir. Bunu daha �nce yazd���m�z php.php veya formlar01.php programlar�n� sitemizde �al��t�rarak bulabiliriz. (Nas�l?) S�zgelimi, http://www.mycgiserver.com/~ocal/ adresindeki sitenin fiziksel adresi ile bu adresin URL'ini dikkate alarak bu iki de�i�keni yazm�� olsayd�k, �unu yazacakt�k:
$dosya_dizin = "/wwwroot/mycgiserver.com/members/uNhM13/";
$dosya_url = "http://www.mycgiserver.com/~ocal/";
Bu uygulamay� kendi sunucunuzda yapmak isterseniz, mutlaka bu iki de�i�keni do�ru yazman�z gerekir. http://www.mycgiserver.com/~ocal/ dosya_gonder_server.php program� ile bir dosya g�nderme (upload) i�leminin sonucu ��yle:
<php00025.tif>
//////////////////KUTU
BITTI//////////
Dosya ��lemleri
Web program�c�s� olarak ziyaret�inin bize g�nderece�i bilgileri yakalamay� ��rendik. �imdilik sadece ziyaret�inin Browser'�na geri g�nderdi�imiz bu bilgileri, sunucu taraf�ndan �e�itli i�lemlerde kullanabiliriz. Bu i�lemlerin ba��nda dosya girdi/��kt� i�lemleri gelir. Ba�ka bir ifade ile ziyaret�iden ald���m�z bu bilgileri sunucuda bir dosyaya yazd�rabiliriz. Bu b�l�mde PHP ile sunucuda yapabilece�imiz dosya i�lemlerine bakaca��z. Tabi� dosya i�lemleri dendi�inde sadece ziyaret�iden ald���m�z bilgileri bir dosyaya yazd�rmakla yetinmeyece�iz; PHP programlar�m�za sunucuda bir dosyada bulunan bilgileri okumas�n� da ��retece�iz.
Harici Dosya (include)
PHP programlar�m�zda bilmemiz gereken ilk dosya i�lemi, bir PHP program�na, kendi d���ndaki dosyay�, tabir yerinde ise, okutmak ve i�indekileri aynen al�p, g�r�nt�lemesini sa�lamakt�r. Bunu include komutu ile yapar�z. Bu komut, kendisine ad� verilen d�zyaz� dosyas�n�n i�eri�ini aynen bu komutun bulundu�u noktaya "yazar." Bu yolla bir PHP program�na s�k kulland���n�z bir metni veya program par�as�n� dahil edebilirsiniz. Bir g�venlik �nlemi olarak bu t�r dosyalar�n uzant�lar�n�, sunucu ve Browser'lar�n tan�d�� MIME t�rlerine ait uzant�lardan farkl� yaparsan�z, ziyaret�iler �ans eseri de olsa bu dosyalar� do�ruca edinme imkan� bulamazlar. Bir �rnek yapal�m. �nce �u metni, harici_dosya01.x ad�yla ve d�zyaz� bi�iminde kaydedin (Windows ortam�nda Notepad'i kullan�yorsan�z, dosya ad� uzatmas� olarak .x harfinden sonra .txt harflerini ekledi�ine dikkat edin!):
"Ben harici bir dosyan�n i�indeki yaz�y�m.. Beni bir PHP program� al�p buraya getirdi! Kendisine te�ekk�r ederim"
Sonra, �u program� dosya_ekle01.php ad�yla kaydedin, ve Browser'da a��n:
<HTML>
<HEAD>
<TITLE>PHP'de Harici Dosya Ekleme</TITLE>
<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-8859-9\">
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1254\">
</HEAD>
<?php
include ("harici_dosya01.x");
print ("\n<p> Ben zaten bu program�n�n i�inde olan bir yaz�y�m. Ba�tan beri burada oldu�uma �ok memnununum.. Harici dosyaya ho�geldin diyorum!</p>");
?>
</BODY>
</BODY>
</HTML>
Buradaki include komutu biraz �nce yazd���m�z harici dosyay� alacak, i�eri�ini aynen kendi bulundu�u noktada, PHP'nin olu�turaca�� HTML dosyas�na katacakt�r. Bu program� �al��t�rd���n�zda g�r�nt� ��yle olacakt�r:
<php00026.tif>
Bu g�r�nt�y� ald���n�z s�rada Browser'�n�zda kayna�� g�r�nt�lerseniz, iki metnin adeta birle�tirilmi� oldu�unu g�receksiniz. Fakat d��ardan PHP program�na sadece d�z metin eklemeyiz; program veya fonksiyon da ekleyebiliriz. Harici dosyada �u de�i�ikli�i yaparak, harici_dosya02.x ad�yla kaydedin.
<?php
print ("Ben de harici dosyay�m.!<br>");
print ("Ama ben hesap da yapar�m.. �rne�in iki iki daha ". (2 + 2). " eder!");
?>
Haric� dosya okuyan program� da program� i�inde, okunacak dosya ad�n� d�zelttikten sonra dosya_ekle02.php ad�yla kaydedin; ve �al��t�r�n.
<php00027.tif>
Haric� dosyam�zda yer alan ...iki iki daha ". (2 + 2). " eder!"); �eklindeki ifadenin programa gelirken "..iki iki daha 4 eder!" �ekline gelmesinin izah�, PHP'nin d��ar�dan ald��� dosyan�n i�inde PHP program� oldu�unu g�rd��� anda, bu dosyan�n i�eri�ini metin olarak de�il, program olarak ele almas�d�r. Bu yolla, PHP programlar�m�za bir de�erin d�nmesini de sa�layabiliriz. Haric� dosyam�zda �u de�i�ikli�i yapal�m ve harici_dosya03.x ad�yla kaydedelim:
<?php
$sonuc = ( 2 + 2 );
return $sonuc;
?>
Bu sat�r bakal�m programa dahil olacak m�?
Sonra, program metninde �u de�i�likli�i yaparak, dosya_ekle03.php ad�yla kaydedin ve �al��t�r�n:
<?php
$donen_sonuc = include("harici_dosya03.x");
print ("\n<p> Harici dosyadan d�nen sonu�: $donen_sonuc </p>");
?>
<php00028.tif>
Haric� dosyam�z�n i�indeki program, return komutu ile sadece kendi i�inde elde etti�i sonucu, onu �a��ran programa verdi; ve bu sonucu alan program�m�z, sadece kendi i�indeki bir de�i�kenin de�erini Browser'a g�nderdi�i halde, bu de�er haric� dosyadan al�nm�� oldu.
Haric� dosyalar�n include yoluyla PHP programlar�m�za kat�lmas�, �zellikle bir sitenin bir �ok program�nda s�k s�k kullan�lan metinlerin ve hesaplamalar�n bir kere yaz�lmas�n� ve tek sat�rla �a�r�lmas�n� sa�lad��� i�in kolayl�k sa�lar ve hata ihtimalini azalt�r.
//////////////KUTU//////////////
include mu, require m�?
PHP4.0 ile, include komutu gibi i�leyen ancak ondan farkl� olarak kendisini �a��ran programa de�er veremeyen require komutu da kullan�labilir hale geldi. ��inde bir hesaplama bulunmayan veya kendisini �a��ran dosyaya bir return komutu ile bir de�er d�nmesini sa�lamas� beklenmeyen dosyalar� require komutu ile de ana program�m�za dahil edebiliriz.
/////////////////KUTU
B�TT�//////////
include ile alaca��m�z dosyalar�n ad�n� PHP program�n�n olu�turmas�n� sa�layarak kimi zaman pogramlar�m�za dinamizm sa�lamam�z m�mk�nd�r. S�zgelimi bir men� maddesinin t�klanmas�yla harekete ge�en bir Javascript fonksiyonunun, ziyaret�inin gidece�i sayfaya g�nderece�i de�eri include komutuna dosya ad� olu�turmakta kullanabiliriz. Bazen include komutuna dosya ad� olu�turmakta program i�indeki d�ng�lerden yararlan�n�z. �rnek:
for ( $i = 1 ; $i <= 3 ; ++$i) {
include ("dosya0" . $i . ".x");
}
Haric� dosyalar�m�z�n adlar�n�n dosya01.x, dosya02.x ve dosya03.x olmal� halinde, bu d�ng� s�ras�yla her �� dosyay� da �a��racak ve altalta ana programa dahil edecektir.
Dosyalar hakk�nda bilgi
PHP'de yukar�da ele ald���m�z include ve require komutlar� ve biraz sonra de�inece�imiz dosya okutma ve yazd�rma i�lemleri dolay�s�yla bir dosyan�n varl��� veya yoklu�u, ya da bir dosyaya ait sand���m�z ismin bid klas�re ait olmas�, program�m�z�n sa�l�kl� i�leyebilmesi a��s�ndan b�y�k �nem ta��r. PHP bu ama�la bize bir ka� kullan�ma haz�r fonksiyon sa�l�yor. Burada k�saca bu fonksiyonlara ve nas�l kullan�ld�klar�na de�inelim:
Dosya var m�? file_exits()
Bir dosyan�n var olup olmad���n� denetleyen bu fonksiyon, dosya varsa true/do�ru, yoksa false/yanl�� sonucunu verir. �rnek:
if ( file_exits ( "bir_dosya.txt" ) )
print ("Dosya var!");
Dosya yoksa, program "Dosya var!" yazmadan yoluna devam edecektir.
Dosya m�, dizin mi? is_file() ve is_dir()
Kimi zaman klas�rler de t�pk� dosyalar gibi adland�r�labilir. Bir dizinde g�rd���m�z ismin ger�ekten bir dosyaya ait olup olmad���n� bu fonksiyonla s�nar�z. S�nama do�ru, yani isim bir dosyaya ait ise fonksiyon true/do�ru, de�ilse false/yanl�� sonu� verir. �rnek:
if ( is_file ( "bir_dosya.txt" ) )
print ("Bu bir dosyad�r!");
�sim bir dosyaya ait de�ilse program "Bu bir dosyad�r!" yazmadan yoluna devam edecektir. S�namay� ismin bir klas�re ait ait olup olmad���na bakrarak da yapar�z. Bu durumda is_dir() fonksiyonunu kullan�r�z. isim bir dizine aitse fonksiyon true/do�ru, de�ilse false/yanl�� sonu� verir. �rnek:
if ( is_dir ( "/bir_isim" ) )
print ("Bu bir dizindir!");
�sim bir dizine ait de�ilse program "Bu bir dizindir!" yazmadan yoluna devam edecektir.
Dosya okunabilir mi? is_readable()
Programda kullanmaya karar vermeden �nce bir dosyan�n eri�ilebilir ve PHP taraf�ndan okunabilir olup olmad���n� s�nayan bu fonksiyon, dosya okunabilir ise true/do�ru, de�ilse false/yanl�� sonu� verir. �rnek:
if ( is_readable ( "bir_dosya.txt" ) )
print ("Bu dosya okunabilir!");
Dosya okunabilir de�ilse program "Bu dosya okunabilir!" yazmadan yoluna devam edecektir. (Unix ortam�nda varl���n� g�rebildi�imiz her dosyan�n okuma izni bulunmayabilir.)
Dosya yaz�labilir mi? is_writable()
Programda kullanmaya karar vermeden �nce bir dosyan�n yaz�labilir olup olmad���n� s�nayan bu fonksiyon, dosya yaz�labilir ise true/do�ru, de�ilse false/yanl�� sonu� verir. �rnek:
if ( is_writable ( "bir_dosya.txt" ) )
print ("Bu dosyaya yaz�labilir!");
Dosya yaz�labilir de�ilse program "Bu dosyaya yaz�labilir!" yazmadan yoluna devam edecektir. (Unix ortam�nda varl���n� g�rebildi�imiz hatta okuyabildi�imiz her dosyan�n yazma izni bulunmayabilir.)
Dosya �al��t�r�labilir mi? is_executable()
PHP program�nda kimi zaman sunucunun kullanmam�za izin verdi�i haric� programlar� �al��t�r�z; PHP program�m�z�n d�zg�n i�lemesi bu harici programa ba�l� olabilir. B�yle bir program� �al��t�rmaya karar vermeden �nce bir dosyan�n �al��t�r�labilir olup olmad���n� s�nayan bu fonksiyon, dosya �al��t�r�labilir ise true/do�ru, de�ilse false/yanl�� sonu� verir. �rnek:
if ( is_executable ( "bir_dosya" ) )
print ("Bu dosya �al��t�r�labilir!");
Dosya �al��t�r�labilir bir program de�ilse PHP program� "Bu dosya �al��t�r�labilir!" yazmadan yoluna devam edecektir. (Unix ortam�nda varl���n� g�rebildi�imiz her pprogram dosyas�n�n �al��t�rma izni bulunmayabilir.)
Dosya boyutu: filesize()
Ad�n� verdi�imiz dosyan�n boyutunu byte olarak bildirir: �rnek:
print ("Dosyan�n boyutu:");
print filesize( "bir_dosya.txt" );
Dosyaya son eri�im tarihi: fileadate(), filemtime() ve filectime()
Ad�n� verdi�imiz dosyaya son eri�im tarihini bildirir. ne var ki bu bilgi Unix'in "epoch" bi�imindedir: �rnek:
print ("Dosyan�n son eri�im tarihi:");
$dosya_tarihi = fileadate( "bir_dosya.txt" );
print ( " $dosya_tarihi " );
E�er bu dosyan�n son eri�im tarihi 28 Temmuz 2000, Cuma 24:00:00 ise, PHP, Browser penceresine 964731600 yazacakt�r. Bu komutun �retti�i bilgiyi, date() fonksiyonu ile anla��labilir hale getirebiliriz:
print ("Dosyan�n son eri�im tarihi:");
$dosya_tarihi = fileadate( "bir_dosya.txt" );
print date("D d M Y G:i:s H", $dosya_tarihi );
Bu kez PHP Browser penceresine 28 Jul 2000 242:00:00 00 yazd�racakt�r. Tarih verilerinin date() fonksiyonu ile bi�imlendirilmesini daha sonra ayr�nt�l� ele alaca��z.
filemtime(), bir dosyan�n son de�i�tirildi�i tarihi; filectime(), ise olu�turuldu�u tarihi, yine Unix Epoch bi�iminde bildirir; bu verinin anla��l�r bi�imde g�r�nt�lenmesi i�in PHP'nin date() fonksiyonu kullan�l�r.
Dosyalar olu�turma ve silme
PHP ile yapabilece�imiz �nemli dosya i�lemlerinin ba��nda olmayan bir dosyay� olu�turmak ve olan bir dosyay� silmek gelir. PHP'nin dosya olu�turma komutu touch() fonksiyonudur. Bu fonksiyona olu�turulmas��n istedi�imiz dosyan�n ad�n� vermemiz gerekir. �rnek:
<?php
$dosya_dizin = "/inetpub/wwwroot/";
touch ("$dosya_dizin/yeni_belge.txt");
print ("yeni_belge adl� bir dosya olu�turuldu!");
?>
</BODY>
</HTML>
Bu program� ki�isel Web sunucuda denerken yeni dosyan�n olu�turulaca�� dizin olarak "/" i�aretiyle sadece k�kdizini belirtirseniz, dosya C: diskinde k�kdizinde olu�turulur. Bu program� ger�ek sunucuda �al��t�rabilmek i�in yazma/okuma izni bulunan ve Web sunucunun eri�ebilece�i bir dizinin ad�n� vermeniz gerekir. �rne�in:
<?php
$dosya_dizin = "/wwwroot/mycgiserver.com/members/uNhM13Qnm/";
touch ("$dosya_dizin/yeni_belge.txt");
print ("yeni_belge adl� bir dosya olu�turuldu!");
?>
Bu komutla olu�turaca��n�z dosya i�i bo� bir metin dosyas� olacakt�r. E�er belirtti�iniz dizinde bu ad� ta��yan bir dosya varsa, PHP dosyan�n i�eri�ine dokunmayacak, fakat dosyan�n eri�im ve de�i�im tarihlerini de�i�tirecektir.
PHP ile mevcut bir dosyay� silmek i�in unlink() fonksiyonunu kullan�r�z. Bu fonksiyon da silinecek dosyan�n ad� ile birlikte yolunu ister. �rnek:
<?php
$dosya_dizin = "/wwwroot/mycgiserver.com/members/uNhM13Qnm/";
unlink ("$dosya_dizin/yeni_belge.txt");
print ("yeni_belge adl� dosya silindi!");
?>
Bu komut Windows sistemlerinde i�lemeyebilir.
Dosya a�ma
PHP'de bir dosyan�n i�eri�ini alarak sayfalar�m�zda kullanma veya bir dosyan�n i�eri�ini de�i�tirmek gibi i�lemler i�in �nce dosyan�n a��lm�� olmas� gerekir. Bunu ger�ekle�tiren fopen() fonksiyonudur. Bu fonksiyonla bir dosyay� okumak ('r'), yazd�rmak ('w') veya ek yapmak ('a') i�in a�abiliriz. Bu fonksiyon dosyan�n ba�ar�yla a��lmas� halinde bir tamsay� verecektir. PHP programlar�m�zda, a��lan dosyan�n mutlata ona i�aret eden bir de�i�kene (file pointer) ba�l� olmas� gerekir; daha sonra bu dosya ile ilgili b�t�n i�lemleri bu i�aret de�i�keni ile yapar�z. �rnek:
$dosya = fopen( "bir_dosya.txt" , 'r' );
PHP, bu dosyay� sadece okumak amac�yla a�acak ve fonksiyondan d�nen de�eri $dosya de�i�kenine atayacakt�r. Olmayan bir dosyay� a�mak istedi�imiz zaman PHP hata mesaj� verir. Bir dosyay� yazmak amac�yla a�aca��m�z zaman, bu kodu ��yle yazar�z:
$dosya = fopen( "bir_dosya.txt" , 'w' );
Olmayan bir dosyay� yazmak amac�yla a�mak istedi�imizde PHP �nce bu dosyay� olu�turur. Bir dosyaya ek yapmak istedi�imiz zaman ise kodumuz �u �ekilde yaz�l�r:
$dosya = fopen( "bir_dosya.txt" , 'a' );
Olmayan bir dosyay� ek yapmak amac�yla a�mak istedi�imizde PHP hata mesaj� verir.
//////////////////KUTU///////////////
Bir Fonksiyonu durdurmak i�in: �l!
Bir PHP fonksiyonunun kendisinden beklenen i�i yapamamas� halinde orac�kta durdurulmas�n� die() komutu sa�lar. "�l!" anlam�na gelen bu fonksiyona ekranda g�r�nt�lenmesini istedi�imiz bir metni parametre olarak verebiliriz. Bu b�l�mdeki �rnekler bu komutla birlikte ��yle yaz�labilir:
$dosya = fopen( "bir_dosya.txt" , 'a' ) or die ("Dosya a��lam�yor!") ;
////////////////////KUTU
B�TT�//////////////
Bu komutu ki�isel Web sunucusunda denerken, dosyan�n a��laca�� dizinin yolunu belirtmemiz gerekir. �rne�in:
<?php
$dosya_dizin = "/inetpub/wwwroot/";
if ($dosya = (fopen ("$dosya_dizin/bir_dosya.txt" , 'r') ) ) {
print ("Dosya a��ld�!");
}
else {
print ("Dosya a��lamad�!");
}
?>
PHP, bu dosyay� a�t���nda Browser penceresinde dosyan�n a��ld���n� belirten mesaj� g�r�nt�lecektir. Bu i�lemi Internet'teki bir Web sunucuda uygulayabilmek i�in yazma/okuma izni bulunan ve Web sunucunun eri�ebilece�i bir dizinin ad�n� vermeniz gerekir. �rne�in:
<?php
$dosya_dizin = "/wwwroot/mycgiserver.com/members/uNhM13Qnm/";
if ($dosya = (fopen ("$dosya_dizin/bir_dosya.txt" , 'r') ) ) {
print ("Dosya a��ld�!");
}
else {
print ("Dosya a��lamad�!");
}
?>
A�t���m�z bir dosya ile yapt���m�z b�t�n i�lemler bittikten sonra, dosyan�n kapat�lmas� gerekir. Dosya kapatma i�lemini fclose() fonksiyonu yapar. Bu fonksiyona parametre olarak dosya ad�n� de�il, dosyan�n i�aret�isi olan de�i�kenin ad�n� veririz. �rnek:
fclose ( $dosya );
Dosya okuma: fgets(), fread() ve fgetc()
A�t���m�z bir dosyan�n i�indeki yaz�lar� �o�u zaman program�m�za sat�r sat�r okuturuz. PHP'de bir dosyan�n i�eri�ini sat�r sat�r okutmam�z� fgets() fonksiyonu sa�lar. Bu fonksiyona daha �nce a��lm�� olan dosyan�n i�aret de�i�kenin ad�n� ve okunmas�n� istedi�imiz asgari byte �l��s�n� parametre olarak veririz. fgets() fonksiyonu verdi�imiz uzunluk �l��s�ne ula�madan �nce dosyada bir yeni sat�r i�areti g�r�rse, veya dosyan�n sonuna ula��rsa, okumaya son verir. Bu fonksiyonu �o�u zaman bir d�ng�n�n i�inde kullan�r�z. Ancak d�ng�n�n hata vermemesi i�in, PHP'nin dosyan�n sonuna ula�t���nda d�ng�y� durdurmam�z gerekir. fgets() fonksiyonunun okuyaca�� sat�r� bir fonksiyona de�er olarak verebilir ve daha sonra bu de�eri programlar�m�zda kullanabiliriz. �rnek:
<?php
$dosya_dizin = "/inetpub/wwwroot/";
if ($dosya = (fopen ("$dosya_dizin/bir_dosya.txt" , 'r') ) ) {
print ("Dosya a��ld�!<br>");
}
else {
print ("Dosya a��lamad�!");
}
while ( ! feof ($dosya ) ) {
$satir = fgets ( $dosya, 1024 ) ;
print ("$satir<br>");
}
fclose ($dosya);
?>
Bu program ki�isel Web sunucuda �nce varolan bir dosyay� a��yor; ve bu dosyan�n i�aret�isi olarak $dosya de�i�kenini kullan�yor. Daha sonra bir while() d�ng�s� i�inde bu de�i�keni ve 1 KB (1024 byte) �l��s�n� parametre olarak vererek fgets() fonksiyonu ile dosyadan bir sat�r okutuyoruz. fgets() fonksiyonundan d�nen bir sat�rl�k metni, burada $satir de�i�kenine at�yoruz; ve daha sonra print() fonksiyonu ile bu sat�r� Browser penceresine g�nderiyoruz. Bu i�lemi Internet'teki bir Web sunucuda uygulayabilmek i�in yazma/okuma izni bulunan ve Web sunucunun eri�ebilece�i bir dizinin ad�n� vermeniz gerekir. Bu i�lemin i�inde yap�ld��� while() d�ng�s�n�n devam �art� olarak kulland���m�z ifadede yer alan feof() fonksiyonu bir dosyan�n dosya-sonu (end-of-file) durumuna ula��p ula�mad���n� s�nar. PHP, her dosyan�n sonunda yer alan eof (Ctrl-z, ^z) i�aretine eri�ti�i anda feof() fonksiyonu do�ru/true de�erini verir. while() d�ng�s�, feof() do�ru de�ilken devam etmek �zere kurulmu� oldu�u i�in, dosya sonuna ula�t���m�zda d�ng� duracakt�r. Okuma i�lemini durabilen bir d�ng�ye ba�lamazsak, fgets() PHP'nin bir program�n sona ermesi i�in verilmi� varsay�lan s�resi doluncaya kadar dosyay� okumak isteyecektir.
Kimi zaman dosyalar�m�z�n i�eri�ini sat�r-sat�r okutmak yerine, kendi tayin edece�imiz uzunlakta par�alar halinde okutmak isteriz. Bunu, fread() fonksiyonu ile sa�lar�z. �rnek:
<?php
$dosya_dizin = "/inetpub/wwwroot/";
if ($dosya = (fopen ("$dosya_dizin/bir_dosya.txt" , 'r') ) ) {
print ("Dosya a��ld�!<br>");
}
else {
print ("Dosya a��lamad�!");
}
while ( ! feof ($dosya) ) {
$paragraf = fread ( $dosya, 1024 ) ;
print ("$paragraf<br>");
}
fclose ($dosya);
?>
fread() fonksiyonu da daha �nce a��lm�� olan dosyan�n i�aret de�i�kenin ad�n� ve okunmas�n� istedi�imiz asgari byte �l��s�n� parametre olarak al�r. fread() fonksiyonu verdi�imiz uzunluk �l��s�ne ula�madan �nce dosyada bir yeni sat�r i�areti g�r�rse, veya dosyan�n sonuna ula��rsa, okumaya son verir. Bu fonksiyondan yararlan�rken, verdi�iniz uzunluk �l��s�n�n, almak istedi�iniz metin par�as�na uygun oldu�unu s�namal�s�n�z. fread(), bu �l��ye ula�t���nda okumay� keser. Buradaki �rne�i 1024 byte �l��s�n� de�i�tirerek ve mesela 1, 2, 3 yaparak deneyebilir ve b�ylece verece�iniz �l��n�n okunan metnin uzunlu�unu nas�l tayin etti�ini g�rebilirsiniz.
//////////////////KUTU///////////////////
fseek() ile �l�� belirleme
PHP'nin dosya i�leminde kullabilece�iniz bir di�er fonksiyonu fseek() ad�n� ta��r. Daha �nce a��lm�� olan dosyan�n i�aret de�i�kenin ad�n� ve ve program�n bu metin i�inde z�plamas�n� istedi�iniz noktan�n dosyan�n ba��ndan itibaren byte de�erini parametre olarak alan bu fonksiyon ile, bir dosyan�n i�innde istedi�imiz yere gitme imkan� vard�r. �rnek:
<?php
$dosya_adi = "/inetpub/wwwroot/bir_dosya.txt";
if ($dosya = (fopen ($dosya_adi , 'r') ) ) {
print ("Dosya a��ld�!<br>");
}
else {
print ("Dosya a��lamad�!");
}
$dosya_boyut = filesize($dosya_adi);
$olcu = (int) ($dosya_boyut / 2 );
while ( ! feof ($dosya) ) {
$paragraf = fread ( $dosya, $olcu) ;
print ("$paragraf<br>");
}
fclose ($dosya);
?>
Burada, okutulacak dosyan�n boyutunun yar�s�n� atad���m�z $olcu de�i�kenini, okutulacak metnin �l��s� olarak kullan�yoruz. Bu durumda PHP, dosyay� iki paragraf halinde g�r�nt�leyecektir.
/////////////////////KUTU
B�TT�///////////////
Dosyalar�m�z�n i�eri�ini sat�rlar veya belirli �l��de par�alar halinde de�il de, tek-tek karakter olarak okutmak i�in fgetc() fonksiyonundan yararlan�r�z. Bu fonksiyon, daima 1 byte �l��s�nde (bir karakter) metin okuyabilece�i i�in, parametre olarak sadece daha �nce a��lm�� olan dosyan�n i�aret de�i�kenin ad�n� al�r. �rnek:
<?php
$dosya_adi = "/inetpub/wwwroot/bir_dosya.txt";
if ($dosya = (fopen ($dosya_adi , 'r') ) ) {
print ("Dosya a��ld�!<br>");
}
else {
print ("Dosya a��lamad�!");
}
while ( ! feof ($dosya) ) {
$karakter = fgetc ( $dosya ) ;
print ("$karakter<br>");
}
fclose ($dosya);
?>
Burada fgetc() fonksiyonundan d�nen de�eri (yani dosyadan okunan bir karakteri), $karakter de�i�kenine at�yoruz ve daha sonra print() fonksiyonu ba karakteri ve HTML'in sat�r b�lme kodu olan <br> i�aretini Browser penceresine g�nderiyor. Program� bu �ekliyle s�narsan�z, dosyadaki metnin tek karakter olarak Browser penceresinin soluna dizildi�ini g�receksiniz. Program� <br> kodunu silerek �al��t�r�rsan�z, bu kez dosyadaki metinde var olan sat�r sonu i�aretlerinin de kald�r�ld���n� ve metnin bir paragraf o�larak g�r�nt�lendi��ini g�rebilirsiniz.
Dosyaya yazma ve ek yapma: fwrite() ve fputs()
Bir dosyaya yazma veya ek yapma, PHP a��s�ndan ayn� i�lemdir; sadece dosyalar�n a��l���nda fark vard�r. Hat�rlayacaks�n�z, bir dosyay� yazmak amac�yla a�mak i�in:
$dosya = fopen( "bir_dosya.txt" , 'w' ) or die ("Dosya a��lam�yor!") ;
ek amac�yla a�mak i�in ise
$dosya = fopen( "bir_dosya.txt" , 'a' ) or die ("Dosya a��lam�yor!") ;
kodunu yazmam�z gerekir. Dana sonra yap�lacak yazma ve ekleme i�lemlerinin fark�, 'w' parametresi ile a��lan dosyaya yazma i�lemi en ba��ndan ba�lar ve devam eder; 'a' parametresi ile a�a�lan dosyaya yazma i�lemi ise en sondan ba�lar ve devam eder.
PHP'nin bir dosyaya metin yazd�rma fonksiyonlar� olan fwrite() ve fputs() ayn� bi�imde yaz�l�r ve ayn� i�levi yerine getirirler; aralar�nda kesinlikle fark yoktur. �rnek:
<?php
$dosya_adi = "/inetpub/wwwroot/bir_dosya.txt";
$dosya = fopen ($dosya_adi , 'w') or die ("Dosya a��lamad�!");
$metin = "Bu sat�r dosyaya yaz�lacak: Merhaba D�nya!\n";
fwrite ( $dosya , $metin ) ;
fputs ( $dosya , "Bu sat�r ise sonradan eklenecek\n" ) ;
fclose ($dosya);
?>
Bu program� �al��t�rd���n�zda, bir_dosya.txt adl� dosyada mevcut b�t�n i�erik silenecek ve yerini $metin de�i�keninin i�erdi�i "Bu sat�r dosyaya yaz�lacak: Merhaba D�nya!" yaz�s� ile "Bu sat�r ise sonradan eklenecek" c�mlesi alacakt�r. Her iki metnin sonunda da yeni sat�r i�areti bulundu�una dikkat edin. Bu programda dosya a�ma k�omutundaki 'w' parametresini siler, yerine 'a' yazarsan�z, bu metinlerin dosyan�n i�eri�ine eklendi�ini g�rebilirsiniz.
/////////////////////KUTU///////////////////
Kullan�mdaki dosyay� kilitleyin!
Web sunucusundaki dosyalar�m�zla sadece bir ki�i i�lem yap�yor olsa idi, bir sorun olmazd�; ne var ki, bir Web sitesine ayn� anda birden fazla ki�i eriyebilir ve dosyalarla i�lem yapan programlar� �al��t�r�yor olabilir. Bu, PHP'nin dosya i�lemlerine engel olabilir. Bu sebeple, i�lem i�in a�aca��m�z bir dosyay�, �nce kilitlemek yerinde bir �nlem say�l�r. Bunu, flock() fonsiyonu ile yapar�z; bu fonksiyona kilitlemek istedi�imiz dosyan�n i�aret de�i�keninin ad�n� ve kilit t�r�n� belirten endeks say�s�n� parametre olarak yazar�z. �rnek:
<?php
$dosya_adi = "/inetpub/wwwroot/bir_dosya.txt";
$dosya = fopen ($dosya_adi , 'w') or die ("Dosya a��lamad�!");
flock ( $dosya , 2); // dosyay� kilitle
$metin = "Bu sat�r dosyaya yaz�lacak: Merhaba D�nya!\n";
fwrite ( $dosya , $metin ) ;
fputs ( $dosya , "Bu sat�r ise sonradan eklenecek\n" ) ;
flock ( $dosya , 3); //dosyay� kilidini a�
fclose ($dosya);
?>
Bu fonksiyon ile kullanabilece�imiz endeks parametreleri �unlard�r:
1 Payla��m Di�er proseslerin dosyay� payla�malar�na imkan verir
2 Tam Di�er proseslerin dosyaile i�lem yapmas�na engel olur
3 Serbest Dosyan�n 1 veya 2 olan kilidini kald�r�r
Bir dosya, herhangi bir PHP program� taraf�ndan kilitlendi�i anda, ayn� dsyay� daha sonra kilitlemeye kalkan di�er programlar kendilerinden �nce konulmu� kilide sayg� g�sterirler.
////////////////KUTU
B�TT�/////////////////////
Dizinlerle ��lemler
PHP ile sunucuda, Web dizini olarak kulland���m�z alanda yeni dizinler olu�turabiliriz, silebiliriz, ve bunlar hakk�nda bilgi edinebiliriz. Bu i�lemleri Web sunucuda yapabilmek i�in Web dizininde okuma ve yazma izni bulunmas� gerekir.
Dizin i�eri�ini listeleme: opendir() ve readdir()
Belirtti�iniz bir dizindeki t�m dosya ve alt-dizin adlar�n� bir liste, hatta ili�kilendirilmi� hypertext (k�pr�, link) listesi olarak sunabilmek i�in �nce dizini i�eri�ini okuyabilmek i�in opendir() fonksiyonu ile a�mak, sonra da i�indeki bilgileri readdir() fonksiyonu ile edinmek gerekir. readdir() fonksiyonu dizinin i�indeki alt-dizin ve dosyalar�n adlar�n� s�rayla, tek-tek okur. Bu fonksiyondan gelen bilgileri bir de�i�kene atayarak ve bir d�ng� i�inde yazd�rarak, dizin listesi ��kartabiliriz. �rnek
<?php
$dizin_adi = "./";
$dizin = opendir ($dizin_adi);
while ( gettype ( $bilgi = readdir( $dizin ) ) != boolean ) {
if ( is_dir( "$dizin_adi/$bilgi" ) )
print " [Dizin] " ;
print ("<A href=\"$dizin_adi/$bilgi\">$bilgi</A><br>\n");
}
closedir ($dizin);
?>
Ki�isel Web sunucuda s�nama amac�yla �al��t�rabilmek i�in dizin ad� olarak bu dosyan�n i�inde bulundu�u dizini verebiliriz. opendir() fonksiyonu da okunmak amac�yla a�aca�� dizine i�aret eden bilgiyi bir de�i�kene yazmak zorundad�r; bu i�aret de�i�kenine burada $dizin ad�n� veriyoruz. $dizin de�i�keninin i�aret etti�i dizini okuyan readdir() fonksiyonundan d�nen bilgileri ise $bilgi de�i�kenine yaz�yoruz. readdir() fonksiyonu dizin bilgisini okuman�n�n sonuna vard���nda, bir dosya ve dizin ad� yerine do�ru veya yanl�� �eklinde bir mant�ksal (boolean) de�er verecektir; buradaki while d�ng�s� $bilgi de�i�keninin t�r�n� gettype() fonksiyonu ile s�rekli s�nayarak, hen�z dizin ve dosya ad� edinildi�i s�rada bu bilgileri print() fonksiyonuna verecektir. Bu bilginin bir dizine ait olup olmad���n� is_dir() fonksiyonu ile s�nayan if d�ng�s� ise bilgi bir dizine aitse, bu bilgnin ba�taraf�na "[Dizin]" kelimesini yazd�racakt�r. (Bu program� geli�tirerek, �nce dizinleri, sonra dosyalar� yazabilen bi�ime getirmek m�mk�nd�r. Bunun bir �rne�i bu kitap���� �rnek kod dosyalar� aras�nda dizin_oku01a_server.php ve dizin_oku01a_pws.php aad�yla bulhabilirsiniz.)
Dizin olu�turma: mkdir()
PHP programlar�m�z gerekti�inde sunucunun yazma yetkisi verdi�i Web'e a��k k�k ve alt-dizinlerde yeni dizinler olu�turabilir. Bunu, mkdir() fonksiyonu ile yapar�z. Bu fonksiyona olu�turulacak dizinin ad� ve 8 tabanl� (octal) say� cinsinden ve �n�ne bir s�f�r konarak dizinin okuma/yazma/�al��t�rma izinlerini belirten parametre verilir. �rnek:
mkdir ("deneme", 0777);
Burada yer alan 0777, bu dizinin herkes i�in okuma ve yazma izni oldu�unu g�sterir. Bu parametre sadece Unix i�letim sisteminde �al��an sunucular i�in ge�erlidir.
Dizin silme: rmdir()
PHP programlar�m�zda gerekti�inde sunucunun yazma yetkisi verdi�i Web'e a��k k�k ve alt-dizinlerde mevcut dizinleri silebiliriz. Bunu, rmdir() fonksiyonu ile yapar�z. Bu fonksiyona olu�turulacak dizinin ad� parametre verilir. �rnek:
rmdir ("deneme");
Bir Dosya ��lemi �rne�i: Konuk Defteri
B�ylece PHP ile "i� yapmak" i�in gerekli ara�lar�m�za bir yenisini ekledik. Art�k PHP programlar�m�zdan sabit diskteki dosyalara ula�may� ve dosyalarla �al��may� biliyoruz. Buraya kadar ��rendiklerimizi bir PHP program� �zerinde uygulayabiliriz. Bunun i�in birlikte bir konuk defteri yapal�m.
Diyelim ki konuk defterimize sadeceziyaret�imizin ad�n�, elektronik posta adresini ve k�sa bir mesaj�n� isteyece�iz. �yle bir sayfa yapal�m ki; ziyaret�i bu sayfay� ilk kez a�t���nda, yani hen�z Form'dan sunucuya bir veri gelmemi� dolay�s�yla $HTTP_POST_VARS dizi de�i�kenin i�inde de�er bulunmad��� s�rada, program�m�z bu durumu belirleyerek ziyaret�iye konuk defteri Form'nu sunmal�; ziyaret�i formu doldurup g�nder d��mesini t�klad��� zaman program�m�z bir yandan ziyaret�inin g�nderdi�i bilgileri kendisine g�sterir ve te�ekk�rlerimizi aktar�rken, di�er yandan da bu bilgileri bir d�zyaz� program� girmeli. Bu s�rada ziyaret�imize isterse defterimizdeki di�er mesajlar� okuma imkan� da sunabilmeliyiz. Biraz uzunca olan �u program� kd_01.php ad�yla kaydedelim. (Bu dosyay�, kitap����n �rnek kodlar aras�nda bulabilirsiniz; fakat bu al��t�rmay� bir d�z yaz� program� ile buradaki �rnek ifadeler ve alan/de�i�ken adlar�n� de�i�tirerek tekrar etmeniz yerine olur:
<?php
if ( isset ( $HTTP_POST_VARS )) {
// Form dolduruldmu� ise
echo ("
<HTML>
<HEAD>
<TITLE>PHP'de Misafir Defteri</TITLE>
<meta http-equiv='content-type' content='text/html; charset=ISO-8859-9'>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1254'>
</HEAD>
<BODY>
<P><font size='3' class='s4' face='Arial, Helvetica'>
");
Program�m�z�n buraya kadar olan b�l�m�, if ile $HTTP_POST_VARS dizi de�i�keninde de�er bulunup bulunmad���na ili�kin s�naman�n olumlu sonu� vermesi halinde uygulanan b�l�m�ne dahil. Burada dikkatini echo() fonksiyonu ile birden fazla sat�r yazd�rd���m�z �ekmi� olmal�. echo(), fonksiyonuna Browser penceresine g�nderece�imiz de�erleri �ift-t�rnak i�inde yazaca��m�z i�in, HTML etiketlerinin �ift-t�rnak gerektiren etiketlerinde tek t�rnak kulland���m�za dikkat edin. if s�nav�n�n olumlu sonucuna ili�kin b�l�m� yazmaya devam edelim:
$dosya_adi = "mesajlar.txt";
if (file_exists("$dosya_adi")) {
$yazilacak_dosya = fopen($dosya_adi,'a');
}
else {
$yazilacak_dosya = fopen($dosya_adi,'w');
}
foreach ($HTTP_POST_VARS as $anahtar=>$deger ) {
$yeni_anahtar = strtoupper($anahtar);
print ("$yeni_anahtar: $deger<br>");
$metin = "$yeni_anahtar: $deger<br>";
fputs($yazilacak_dosya, $metin);
}
fputs($yazilacak_dosya, date("D d M Y h:i:s"));
fputs($yazilacak_dosya, "<br>\n");
fputs($yazilacak_dosya, "<center>
<img src='nokta.gif' width=100% height=1 border=0></center>\n");
fclose($yazilacak_dosya);
Konuk defteri program�m�zHTML i�in gerekli temel etiketleri �rettikten sonra bu b�l�mde veritaban� dosyas� olarak kulland���m�z mesajlar.txt isimli dosyan�n bulunup bulunmad���n� s�n�yor; dosya varsa ek yapmak i�in ('a'),dosya yoksa yazmak i�in ('w'), dosyay� a��yoruz. Sonra, $HTTP_POST_VARS dizi-de�i�kenine Form'dan gelmi� olan anahtar=de�er �iftlerinin her birini (yani, Browser'dan gelen �rne�in "adi" de�i�keni ve bunun de�eri olan ismi) �nce print() ile ziyaret�inin Browser'�na, sonra da fputs() ile biraz �nce a�t���m�z veritaban� dosyas�na yazd�r�yoruz. Fakat burada bundan �nce Form'dan k���k harf olarak gelen de�i�ken adlar�n� (anahtarlar�) strtoupper() fonksiyonu ile b�y�k harfe �eviriyoruz.�imdilik bu fonksiyonun �zerinde durmay�n; biraz sonra metin d�zenleme ve d�zenli ifadeler konusuna gelece�iz. Ancak bu s�rada ziyaret�ilerin mesajlar�n� daha sonra g�zel g�r�ntelemek i�in aralar�na �izgi olarak kullanmak �zere bir resim dosyas�n� IMG etiketi ile yerle�tirdi�imize de dikkat edin. Bu grafik d�syas�n�n eni-boyu 1 piksel oldu�u halde burada ziyaret�inin Browser penceresinin eni kadar geni�leterek �izgi �retmi� oluyoruz! Evet, koda devam:
echo ("
<HTML>
<HEAD>
<TITLE>PHP'de Misafir defteri</TITLE>
<meta http-equiv='"content-type' content='text/html; charset=ISO-8859-9'>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1254'>
</HEAD>
<BODY>
<P><font size='3' class='s4' face='Arial, Helvetica'>
<center><img src='nokta.gif' width=100% height=1 border=0></center>
Say�n: $adi<br>
Defterimi imzalad���n�z i�in te�ekk�r ederim</P>
<p>Ana Sayfaya D�nmek i�in <A HREF=\"index.htm\"> t�klay�n</A><BR>
Mesajlar� okumak i�in<A HREF=\"mesajlar.php\"> t�klay�n</A>
</BODY>
</HTML>
");
}
Program�m�z�n bu b�l�m�nde, ziyaret�iye te�ekk�r ediyoruz; ve isterse di�er mesajlar� okumak �zere t�kllayaca�� k�pr�y� sa�l�yoruz. Mesajlar�n �ok uzamas� halinde bu k�pr�y� bir sayfan�n �st�nde, bir de alt�nda vermekte yarar var. �imdi, program�m�z�n Form doldurulduktan sonra i�leyen b�l�m�n� yazm�� olduk. Taa en ba�ta yapt���m�z $HTTP_POST_VARS dizi-de�i�keninin de�er i�erip i�ermedi�ine ili�kin s�naman�n olumsuz olmas� halinde, pr�ogram�m�z, i�e buradan ba�layacakt�r:
else {
echo ("
<HTML>
<HEAD>
<TITLE>PHP'de Formlar</TITLE>
<meta http-equiv='"content-type' content='text/html; charset=ISO-8859-9'>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1254'>
</HEAD>
<BODY>
<FORM ACTION=\"$PHP_SELF\" METHOD=\"POST\">
<P><font size='3' face='verdana, Arial, Helvetica'>
Defteri imzalamadan okumak i�in <a href='mesajlar.php'>
buray� t�klay�n</a></FONT></P>
<P><font size='3' face='Arial, Helvetica'>
Ad�n�z, Soyad�n�z: <br><INPUT TYPE=\"TEXT\" NAME=\"adi\"><BR>
Elektronik Adresiniz: <br><INPUT TYPE=\"TEXT\" NAME=\"adres\"><BR>
Mesaj�n�z:<BR>
<TEXTAREA NAME=\"mesaj\" ROWS=10 COLS=30 WRAP=virtual></TEXTAREA>
<BR><BR><BR>
<INPUT TYPE=\"SUBMIT\" VALUE=\"Defteri imzala!\">
<INPUT TYPE=\"RESET\" VALUE=\"T�m�n� sil!\">
</FORM>
</BODY>
</HTML>
");
}
?>
Bu b�l�mde �ift-t�rnak i�aretlerini de�i�tirmek yerine, bunlar� ESC karakteri ile �zel i�aret de�il, metin olarak ele al�nacak hale getirdik. Program�m�z burada yine echo() ile d�z ve basit bir HTML Formu olu�turuyor. Program�n ak�� plan�n� anlam�� olmal�s�n�z: ziyaret�i �nce Form'u dolduracak ve g�nder d��mesini t�klayacak.
<php00029.tif>
Bu ACTION, Form'da INPUT alanlar�ndaki de�erleri POST y�ntemiyle yine kendisine g�nderecek; b�ylece PHP, program� yeniden �al��t�r�rken, bu kez en ba�taki �art�n yerine geldi�ini (yani $HTTP_POST_VARS dizi-de�i�keninin de�er i�erip i�ermedi�ine ili�kin s�naman�n olumlu sonu� verdi�ini) g�rerek, i�e ba�tan ba�tan ba�layacakt�r. Bu, INPUT etiketinin alanlar�ndan olu�turulan de�i�kenlerden yararlanarak, ziyaret�iye bize ula�t�rd��� bilgileri ve bizim te�ekk�r mesaj�m�z� yollamaktan ibarettir.
<php00030.tif>
Program bu �ekliyle ne g�venlik �nlemlerine sahip, yani k�t�niyetli ki�ilerin INPUT alanlar�na k�t� niyetli kodlar yazmalar� halinde bunlar� ay�kl�yor; ne de ziyaret�inin bo� Form g�nderip g�ndermedi�ini s�n�yor. Bu gibi i�leri, PHP ile metin d�zenlemeyi ��rendikten ve D�zenli �fadeler denen kavram� ile tan��t�ktan sonra yapaca��z.
Metin D�zenleme ve D�zenli �fadeler
Web programlar�m�zda bir ziyaret�inin bize ula�t�rd��� Form bilgilerini ve bir veritaban� dosyas�ndan ald���m�z ham verileri yeniden d�zenlememiz gerekir. PHP bunu yapabilmek i�in bize 50'den fazla fonksiyon sa�lar. Bunlardan s�k kullanmam�z gerekenleri ele alaca��z. Daha sonra, �zellikle Unix i�letim sistemine, Perl veya Javascript diline a�ina olanlar�n hat�rlayaca�� D�zenli �fadedeler denen metin ve s�ralan�� (pattern) e�le�tirme ara�lar�n�n �zerinde duraca��z. Bu iki ara�la, elimize ald���m�z berhangi metne istedi�imiz bi�imi vermek veya metnin i�inden istedi�imiz b�l�m� hemen hemen tamamen se�ip bi�imlendirmek ve kullanmak m�mk�n olur.
Temel Alfan�merik Fonksiyonlar�
PHP'nin metin olarak g�rd��� de�i�kenlere alfan�merik (String) t�r� de�i�kenler ad�n� vermi�tik. PHP'nin alfan�merik fonksiyonlar�, bu t�r de�i�kenlerin de�erlerinin i�inden bir b�l�m� alma, atma veya de�i�tirme imkan� sa�lar. Programlar�m�zda s�k kullanaca��m�z bir ka� fonksiyonu ele alal�m. Bu fonksiyonlar�n tam listesini bu kitap����n �rnek kodlar� aras�nda alfa_fonksiyonlar.htm adl� dosyada bulabilirsiniz. (A�a��daki �rnekler de alfa_fonksiyonlarXX.php adl� dosyalarda bulunabilir.)
substr()
Bir alfan�merik de�i�kenin de�erinin veya bir metnin tan�mlad���n�z b�l�m�n� verir. �kisi zorunlu, biri se�meli �� parametre ile kullan�l�r. Yaz�l���:
substr($degisken, ba�la, [boyut] );
Burada, $degisken yerine i�inden bir b�l�m� se�mek istedi�iniz metni tutan de�i�kenin ad�n�; ba�la yerine se�me i�leminin ba�layaca�� karakterin ba�tan itibaren ka��nc�dan sonra oldu�unu ve isterseniz boyut yerine de se�ilmesini istedi�imiz karakter say�s�n� yazar�z. Ka� karakter se�ilece�ini g�steren boyut parametresini yazmazsan�z, PHP de�i�kenin veya metnin sonuna kadar se�er. �rnek
$secilen = substr ("abcdef", 1);
Burada $secilen de�i�keninin de�eri "bcdef" olacakt�r; ��nk� birinci karakterden sonra se�ime ba�lat�yoruz ve se�imin boyutunu belirlemiyoruz. PHP, verdi�imiz metnin sonuna kadar se�ecektir.
$degisken = "Olumsuz d���nce ve mekanizmalar �zerine olumlu �eyler bina edilemez!";
$secilen = substr ($degisken, 8, 20);
Burada ise se�ime 8'nci karakterden sonra ba�lad���m�z ve 20 karakterlik se�im yap�lmas�n� belirtti�imiz i�in se�ilen de�er "d���nce ve mekanizma" olacakt�r.
Ba�lan�� olarak verdi�iniz say� negatif ise (�n�nde - i�areti varsa) se�im i�lemine de�i�kenin sonundan itibaren ba�lan�r. Yukar�daki substr() fonksiyonunu:
$secilen = substr($degisken, -9);
�eklinde yazarsak, d�nen de�er, "edilemez!" olacakt�r.
trim()
Bir alfan�merik de�i�kenin de�erinin ba� ve son taraf�ndaki bo�luklar� atar. Yaz�l���:
trim($degisken);
Bu fonksiyon de�i�ken de�erinin veya metnin ba��ndaki ve sonundaki "\n", "\r", "\t", "\v", "\0", ve aral�k i�aretini bo�luk sayar. �rnek:
$degisken = "\0 Olumsuz d���nce ve mekanizmalar �zerine olumlu �eyler bina edilemez!\n\r\t";
$secilen = trim ($degisken);
Burada se�ilen metinde, ba�taki bo�luk, sondaki yeni sat�r, sat�r ba�� ve sekme karakterleri olmayacakt�r.
chr()
Parametre olarak ASCII de�erini belirtti�imiz karakteri sa�lar. �rnek:
echo (chr(34);
Bu komutla Browser penceresinde �ift-t�rnak i�areti g�r�nt�lenir.
ord()
Parametre olarak yazd���n�z karakterin ASCII de�erini sa�lar. �rnek:
echo (ord("A");
Bu komutla Browser penceresinde 65 rakam� g�r�nt�lenir. bu fonksiyonun ba�l�ca kullan�m alan�, bir de�i�kenin de�erini arzu etti�imiz bir karakterin ACSII koduyla kar��la�t�rmak olabilir. �rne�in:
if ( ord($karakter) == 60 { // karakter "<" i�areti ise
$karakter = "" ;
}
koduyla, bir Form'dan gelen verileri karakter-karakter s�nayabilir ve i�inde normal olarak bulunmamas� gereken, zararl� kod par�as� olmas� ihtimali bulunan karakterleri ay�klatabiliriz.
strlen()
Bir alfan�merik de�i�kenin de�erinin ka� karakter i�erdi�ini bildirir. Yaz�l���:
strlen($degisken);
Bu fonksiyondan d�nen de�er tam say�d�r; aritmetik i�lemlerde kullan�labilir. �rne�in, ziyaret�inin bir INPUT alan�na yazd��� yaz�n�n uzunlu�unun arzu etti�imiz �l��lere uygun olup olmad���n� s�namakta bu fonksiyondan yararlanabiliriz:
if ( strlen($degisken) > 30 { // girilen de�er 30 karakterden uzun ise
echo ("L�tfen 30 karakterden uzun yazmay�n�z!);
}
printf() ve sprintf()
Bu fonksiyonlar� bir de�i�keni bi�imlendirmekte kullan�r�z. Birincisinin elde etti�i sonu� ziyaret�inin Browser penceresine g�nderilir; ikincisin elde etti�i sonu� ise de�er olarak d�ner. �nce bu fonksiyonlarla kullanabilece�imiz bi�im parametrelerini s�ralayal�m:
% Y�zde i�areti. Yan�nda bi�im parametresi gerekmez.
b De�i�ken tamsay� olarak i�lem g�r�r ve ikili say� olarak d�ner.
c De�i�ken tamsay� olarak i�lem g�r�r ve ASCII de�erinin kar��l��� olan karakter olarak d�ner.
d De�i�ken tamsay� olarak i�lem g�r�r ve ondal�k say� olarak d�ner.
f De�i�ken kesirli say� olarak i�lem g�r�r ve kesirli say� olarak d�ner.
o De�i�ken tamsay� olarak i�lem g�r�r ve sekiz-tabanl� (octal) say� olarak d�ner.
s De�i�ken alfan�merik olarak i�lem g�r�r ve alfan�merik olarak d�ner.
x De�i�ken tamsay� olarak i�lem g�r�r ve 16 tabanl� (hexadecimal) say� olarak d�ner. (Harfler, k���k harf olur).
X De�i�ken tamsay� olarak i�lem g�r�r ve 16 tabanl� (hexadecimal) say� olarak d�ner. (Harfler, b�y�k harf olur).
Her iki fonksiyonun da kullan�l�� bi�imi ayn�d�r:
printf( "bi�im" , $degisken1, $degisken2, ... "metin" );
Burada "bi�im" yerine yukar�daki bi�im parametlerini yazar�z. Bi�im parametrelerinin �n�ne y�zde i�areti konur; en fazla be� belirleyici �zellik alabilir. Yukar�daki t�r belirten bi�imlendirme parametlerine ek olarak di�er �zellikler ��yle s�ralan�r:
Doldurma karakteri: tek t�rnak ve onu izleyen bir karakterden olu�ur.
Hizalama: Eksi i�aretinin varal��� yaz�n�n sola, yoklu�u ise sa�a hizalanma anlam�na gelir.
En az-en �ok uzunluk: Say�-nokta-say� (�rne�in 40.40 gibi) yaz�l�r; birinci say� azam�, ikinci say� asgar� uzunlu�u belirtir.
Bu �� �zelli�e bir �rnek verelim.Bir de�i�kenin de�erinin sonuna yanyana yeteri kadar nokta konarak uzunlu�unun 40 karaktere ��kart�lmas�n� �u deyimle sa�lar�z:
$degisken = " �yilik �zerine " ;
printf( "%'.-40.40s" , $degisken);
Burada "%'.-40.40s" �eklindeki bi�im komutu, Browser penceresinde �u g�r�nt�y� olu�turur:
"�yilik
�zerine.........................."
Burada "�yilik �zerine" de�eri 14 karakter oldu�u i�in, sonuna 26 adet nokta eklenmi� ve b�t�n de�er sola hizalanm�� olacakt�r. �u komut ise iki de�i�kenin de�erini ve verece�imiz bir metni ayn� sat�ra yazd�racakt�r:
$degisken1 = " �yilik �zerine " ;
$degisken2 = " �yilik �zerine " ;
$metin = "<br>\n" ;
printf( "%'.-40.40s%'.2d%s" , $degisken1, $degisken2, $metin);
Bu komut Browser penceresinde �u g�r�nt�y� olu�turur:
"�yilik
�zerine..........................86"
Burada ekledi�imiz ikinci "%'.2d" �eklineki bi�im komutu ile, ikinci de�i�kenin de�eri, en az s�f�r en �ok iki adet nokta ile doldurulmak ve sa�a hizalanarak ondal�k say� olarak g�r�nt�lenmek �zere bi�imlendiriliyor. ���nc� bi�im komutu olan "%s" ise ���nc� de�i�kenin sadece alfan�merik olarak muamele g�rmesini sa�l�yor. Bi�im komutlar�n�n aras�nda bo�luk bulunmamas�, ait olduklar� de�i�ken de�erlerinin de aralar�na bo�luk konmamas�na sebep oluyor. ���nc� de�i�kenin etkisini, ka��t �zerinde g�remiyoruz; ancak bu Browser penceresinde bundan sonra gelecek unsurlar�n bir sat�r a�a�� kaymas�n� sa�layacakt�r.
D�rd�nc� bi�im �zelli�i, ondal�k say�lar�n virg�lden (veya nokdtadan) sonra ondal�k b�l�m�n�n ka� hane olaca��n� belirler. Bunu da bir �rnekle g�relim:
$degisken = " 124 " ;
printf( "De�eri (ABD) $%.2f" , $degisken);
Bu bi�imlendirme komutu da Browser penceresine �u yaz�y� yazd�r�r:
De�eri (ABD)
$124.00
number_format()
T�r� say� olan de�i�ken de�erlerini bin-basamaklar� �eklinde bi�imlendirmekte kullan�l�r. Parametre olarak say� i�eren de�i�kenin ad�n�, ondal�k b�l�m�n ka� haneli olaca��n�, ondal�k hanesini ve binler basamaklar�n� ay�rmakta kullan�lacak karakteri kabul eder. �rnek:
$degisken = 1234567890.1234567890 ;
echo (number_format($degisken, 4 chr(44) , ".") ); //chr(44)=virg�l
Bu deyimle 1234567890.1234567890 �eklindeki de�er, Browser penceresine "1.234.567.890,1235" �eklinde yazd�r�lacakt�r.
Tarih ve Saat D�zenleme
PHP'nin tarih ve zaman bilgisini kullanmam�z� sa�layan getdate() fonksiyonunun yan� s�ra, elde etti�imiz bilgileri �ok daha esnek bi�imlendirmemizi sa�layan date() fonksiyonu da s�k kullan�l�r. Bu fonksiyon �a�r�ld��� yerde bize Unix sisteminin Epoch zaman-tarih damgas�n� verir. Bu verinin bi�imlendirilmesi i�in �e�itli parametreler vard�r. Bu parametreler, g�n adlar�n�n dili ve tarihlerin yaz�l��� bak�m�ndan Web sunucusunun bulundu�u bilgisayardaki b�lgesel ayarlara g�re sonu� verir.
date() $tarih date( bi�imlendirme_parametreleri );
Burada bi�imlendirme_parametleri yerine �unlar� yazabilirsiniz:
a 12 saat esas�na dayanan Anglo-Sakson sistemlerinde ��leden �nce ("am") veya ��leden sonra ("pm") i�aretinin verilmesini sa�lar.
A Ayn� i�aretlerin b�y�k harfle yaz�lmas�n� sa�lar.
d �ki haneli g�n say�s�, tek haneli g�nlerin �n�ne s�f��r konur: "01" - "31"
D �� haneli g�n ad� k�satmas�: "Cum"
F Uzun ay ad�: "Ocak"
h 12 saatlik sistemde saat: "01" - "12"
H 24 saatlik sistemde saat: "00" - "23"
g 12 saatlik sistemde tek haneli saatlerin �n�ne s�f�r konmadan saat: "1" - "12"
G 24 saatlik sistemde tek haneli saatlerin �n�ne s�f�r konmadan saat: "0" - "23"
i Dakika: "00" - "59"
j Tek haneli say�lar�n �n�ne s�f�r konmadan g�n say�s� "1" - "31"
l (k���k L harfi) Uzun g�n ad�: "Cuma"
L Art�k y�l olup olmad���na ili�kin Boolean (do�ru/yanl��) de�i�ken. Art�k y�l ise 1, de�ilse 0.
m Tek hanelilerin �n�ne s�f�r konarak ay say�s�: "01" - "12"
n Tek hanelilerin �n�ne s�f�r konmadan ay say�s�: "1" - "12"
M K�salt�lm�� ay ad�: "�ub"
s Saniye: "00" - "59"
S �ngilizce ('nc� anlam�na) 2 karakter ek: "th", "nd"
t Belirtilen ay�n g�n say�s�; "28" - "31"
w Haftan�n g�n say�s�: "0" (Pazar veya Pazartesi) - "6" (Cumartesi veya Pazar)
Y D�rt haneli y�l: "2000"
y �ki haneli y�l "00"
z Y�l�n g�n say�s�: "0" - "365"
�rnek:
print (date ("l dS of F Y h:i:s A"));
Browser penceresine �ngilizce b�lgesel ayarlar yap�lm�� bir bilgisayara kurulu Web sunucusunda: "Sunday 30th of July 2000 07:51:08 AM" yazd�r�r.
print (date ("l, d F Y g:i:s"));
Browser penceresine T�rk�e b�lgesel ayarlar yap�lm�� bir bilgisayara kurulu Web sunucusunda: "Pazar, 30 Temmuz 2000 07:51:08" yazd�r�r.
date() ve mktime() fonksiyonlar�n� birlikte kullanarak ge�mi� veya gelecek tarihleri bulma imkan� de vard�r. �rnek:
$yarin = mktime (0,0,0,date("m") ,date("d")+1,date("Y"));
$gecen_ay = mktime (0,0,0,date("m")-1,date("d"), date("Y"));
$gelecek_lyl = mktime (0,0,0,date("m"), date("d"), date("Y")+1);
D�zenli �fadeler
Unix i�letim sistemini geli�tirenlerin bili�im teknolojisine kazand�rd��� bir di�er de�er bi�ilemez ara� olan D�zenli �fadeler (Regular Expressions), belki de i�aretlerinin karma��kl��� sebebiyle programc�lar�n fazla dokunmak istemedikleri bir aland�r. Bu kavramla daha �nce tan��m�� olmayanlara, CGI veya Javascript kodlar�nda g�rd�kleri,
^.+@.+\\..+$
i�aretlerinin, D�zenli �fade i�lemlerine ait oldu�unu belirtilim. Bu i�aretler ve onlar�n aras�na koydu�umuz karakter �rnekleri ile, PHP'nin arad���m�z bir metnin karakterlerinin hangi dizili�, s�ralan�� konumunda oldu�una bakarak, bize o metni bulmas�n� sa�lar�z; ya bu metni kullan�r�z, sileriz veya de�i�tiririz. Dolay�s�yla, D�zenli �fade demek, bir dizili�, s�ralan�� bi�imi demektir. D�zenli �fade olu�turarak, PHP'ye "��te buradaki gibi s�ralanm�� karakterleri bul!" demi� oluruz. D�zenli �fade, PHP'ye verdi�imiz s�ralan��a uygun metnin nerede ve ka��nc� kez bulunmas�n� istedi�imizi de belirtir. Ayr�ca, bu ifade ile, PHP'nin buldu�u metni (veya metinleri) ne yapmas�n� istedi�imizi de s�yleriz.
E�le�tirme deyimleri ve i�aretler
PHP'nin karakter ve s�ralan�� e�lemede kullan�lan d�zenli ifade komutlar�n� k�saca ele alal�m; sonra bunlar� kullanmam�za imkan veren fonksiyonlar� g�relim.
^hakk
"hakk" ile ba�layan b�t�n kelimeleri bulur. ^i�areti, onu izleyen karakterin sadece alfan�merik de�i�kenin ba��nda olmas� gerekti�ine i�aret eder. Bu deyimle, "Hakk� �cal bug�n buradayd�!" veya "Hakk�d�r hakka tapan, milletimin istikl�l!" e�le�ebilir; fakat "Analar�n hakk� �denmez!" e�le�mez; ��nk� PHP a��s�ndan ^i�aretinin anlam�, "Ba�lang�c�nda 'hakk' karakterlerinin s�ralan�yla ayn� s�ralan��taki alfan�merik de�eri bul!" demektir.
edilemez$
Bu deyim ise PHP'ye "edilemez" ile biten b�t�n kelimeleri bulur. S�zgelimi, "K�t�mser insan�n y�kseli�inden bahsedilemez" c�mlesi bu deyimle bulunabilir; fakat sonunda nokta oldu�u i�in ".. edilemez." diye biten hi� bir c�mle bu deyimle e�le�emez.
^hakk�$
PHP, ba��nda ^ i�areti, sonunda $ i�areti bulunan kararter s�ralan���n�, aynen arar; yani bu deyim, birinci �rnekteki �� c�mleyi de bulamaz.
hakk
Bu deyim ise her �� c�mleyi de buldurur; ��nk� ���nde de bu d�rt karakter bu s�ralan��la mevcuttur. PHP'nin D�zenli �fadeleri, b�t�n rakam ve harfleri e�le�tirebilir. Fakat sorun, �zel karakterlerde ��kar. S�zgelimi, sekme i�areti, sat�r sonlar�nda yeni-sat�r/sat�rba�� i�areti, gibi �zel karakterleri, ancak �nlerine Escape i�areti olan ters b�l� i�aretini koyarak buluruz.
/////////////////////KUTU/////////////////////
D�zenli �fadelerde �zel Karakterler
[\b] Geri (Backspace) karakterini bulur.
\b Belirtilen karakterle s�n�rlanan kelimeyi bulur: k\b, "hak m�cadelesi" ifadesindeki birinci k'y� bulur; ��nk� bu harf, bir kelime s�n�rlay�c�d�r.
\B Belirtilen karakterle s�n�rlanmayan kelime yoksa, ba�layan� bulur: k\Bi, "�� ki�i" ifadesindeki 'ki'yi bulur.
\cX X yerine yazaca��m�z kontrol karakterini bulur. �rne�in, \cA, Ctrl+A'y�, \cZ ise Ctrl+Z'yi bulur.
\d 0'dan 9'ya kadar bir rakam� bulur: IE\d, her ikisi de herhangi bir rakamla biten "IE5" ve "IE4" de�erlerini ikisini de bulur,
\D Herhangi bir ondal�k i�aretini bulur.
\f Form-feed (ka��t ��kart) karakterini bulur.
\n Newline (yeni sat�r) karakterini bulur.
\r Return (sat�rba��) karakterini bulur.
\s Bo�luk (space) bulur.
\S Yatay ve d��ey sekme, ka��t-��kart, yeni sat�r, sat�rba�� ve bo�luk d���ndaki herhangi bir karakteri bulur.
\t Yatay sekme (Tab) karakterini bulur.
\v D��ey sekme karakterini bulur.
\w Herhangi bir harf, rakam veya alt-�izgiyi bulur.
\W Harf, rakam ve alt-�izgi d���ndaki karakteri bulur.
\xHex Verilen 16 tabanl� (Hexadecimal) say�ya uygun Escape karakterini bulur. �rne�in, \n25, % i�aretini bulur.
///////////////////////KUTU
B�TT�///////////
Bu arada noktalama i�aretlerini aratt�r�rken, �nlerine ters b�l� i�areti koymak gerekir. Ters b�m� i�aretini de yine �n�ne ters b�l� i�areti koyarak (\\) artt�rabilirsiniz.
Karakter Gruplar�
PHP'nin D�zenli �fadeleri'nde kolayl�k sa�layan ve mesela ziyaret�inin bir Form'da bir INPUT etiketine verdi�i yan�t�lar�n i�inde olmamas� veya olmamas� gereken karakterleri bulmam�za imkan veren karakter gruplar� olu�turma y�ntemini de kullanabiliriz. S�zgelimi b�t�n sesli hafleri aratmak i�in ��yle bir karakter grubu olu�turabiliriz:
[OoUu��AaOoEe�Ii�]
Karakter gruplar�n� k��eli parantez i�inde yazar�z. Bu deyimle, PHP, i�inde herhangi bir sesli harf bulunan b�t�n de�erleri e�le�tirecektir. Bu y�ntemden yararlanarak, �u gruplar� kullanabiliriz:
[a-z] Herhangi bir k���k harfi bulur.
[A-Z] Herhangi bir b�y�k harfi bulur.
[a-zA-Z] Herhangi bir b�y�k veya b�y�k harfi bulur.
[0-9] Herhangi bir rakam� bulur.
[0-9\.\-] Herhangi bir rakam�, noktay� veya kesme �izgisini bulur.
[ \f\r\t\n] Herhangi bir Form-feed (ka��t ��kart), Newline (yeni sat�r), Return (sat�rba��) karakterini veya bo�lu�u (space) bulur.
S�zgelimi, bir alfan�merik de�er k�mesinde b3, u2, n9 gibi birincisi k���k harf, ikincisi rakam olan iki karakterlik dizileri bulmak istiyorsak, arama grubunu ��yle kurar�z:
^[a-z][0-9]$
Bu deyim PHP'ye, a'da z'ye k���k harfle ba�layan, (^i�areti aranan unsurun de�erin ba��nda olmas� gerekti�ini s�yl�yor) ve sonunda 0'dan 9'a bir rakam bulunan kelimeleri bulmas�n� s�yleyecektir. PHP, bu kelimenin sadece iki harfli olmas�na dikkat edecektir; ��nk� grubumuzun bir ba�� ve bir de sonu belirlendi�ine g�re, �� karakterli de�erlerin bulunmas� imkan� yoktur.
^i�areti k��eli parantez i�inde grup deyimi olu�tururken kullan�l�rsa, bu olumsuzluk anlam� ta��r. S�zgelimi, iki rakaml� ancak birinci karakteri rakam olmayan fakat ikinci karakteri rakam olan de�erlerin bulunmas� i�in �u deyim gerekir:
^[^0-9][0-9]$
Burada en ba�taki ^i�areti "ba��nda" demektir; ancak hemen arkas�ndan gelen grupta "rakam olmayan" demi� oluyoruz; ikinci grup ve sonundaki $ i�areti ile "rakamla biten" anlam�na geliyor. Deyimde sadece ba� ve sonu g�steren iki e�le�tirme unsuru bulundu�una g�re bu deyim, "ba��nda rakam olmayan, sonunda rakam olan iki karakterli de�erleri" bulmaya yarayacakt�r. Bu deyim s�z gelimi 13'� bulmayacak, fakat u2'yi bulacakt�r. Bu y�ntemle �u gruplar� yapabiliriz:
[^a-z] K���k harf olmayan herhangi bir harfi bulur.
[^A-Z] B�y�k harf olmayan herhangi bir harfi bulur.
[^\\\/\^] \ , / veya ^ d���nda herhangi bir karakteri bulur.
[^\"\'] �ift ve tek t�rnak d���nda herhangi bir karakteri bulur.
Grup olu�turmada kulland���m�z �zel karakterler de vard�r. �rne�in nokta i�areti (.), yeni sat�r ba�lang�c� olmayan herhangi bir karakter anlam�na gelir. Dolay�s�yla,
^.0$
deyimi yeni sat�rla ba�lamayan ve s�f�r ile biten herhangi iki karakterli de�eri bulacakt�r.
PHP'nin kullan�lmaya haz�r �zel D�zenli �fade e�le�tirme gruplar� da vard�r:
[[:alpha:]] Herhangi bir harf
[[:digit:]] Herhangi bir rakam
[[:alnum:]] Herhangi bir harf veya rakam
[[:space:]] Herhangi bir bo� karakter
[[:upper:]] Herhangi bir b�y�k harf
[[:lower:]] Herhangi bir k���k harf
[[:punc:]] Herhangi bir noktalama i�areti
[[:xdigit:]] Herhangi bir Hexadecimal karakter. [0-9a-fA-F]
Karakter e�le�tirmede tekrar say�s� da bir �zellik olarak kullan�labilir. Tekrar say�s� belirtmek i�in s�sl� parantez ({}) kullan�r�z. �rnekler:
^a{4}$ ��inde sadece d�rt adet k���k a harfi bulunan kelimeleri se�: aaaa.
^a{2,4}$ ��inde sadece iki �� veya d�rt adet k���k a harfi bulunan kelimeleri se�: aa, aaa, aaaa gibi
^a{2, } �ki veya daha fazla k���k a harfi bulunan kelimeleri se�: haar, haaar, haaaar gibi. Bu deyim "har" kelimesini se�mez.
\t{2} Ardarda iki sekme i�aretini bul
.{2} Herhangi �ift karakteri bul: aa, &&, == gibi
^\-{0,1}[0-9]{1,}$ Negatif veya pozitif herhangi bir tam say�y� bul
^[0-9]{1,}$ Pozitif herhangi bir tam say�y� bul
Bu t�r deyim olu�turma i�lemleri giderek karma��kla�abilir. �rne�in:
^\-{0,1}[0-9]{0, }\.{0,1}[0-9]{0, }$
Bu karma��k deyim asl�nda sadece "Negatif veya pozitif bir ondal�k (double) de�eri bul," anlam�na geliyor. K�saca irdelersek, aranan degerin s�f�r veya bir kere tekrarlanan bir kesme �izgisiyle ba�layabilece�ini ("S�f�r veya bir kere" demek, olsa da olur, olmasa da anlam�na geliyor!) bunu s�f�r veya daha fazla kere tekrarlanan bir rakam�n izleyebilece�ini, onu da s�f�r veya bir kere tekrarlanan bir nokta i�areti ile sonunda s�f�r veya daha fazla kere tekrarlanan herhangi bir rakam�n izleyebilece�ini s�ylemi� oluyoruz.
PHP bu t�r karma��k ifadelerin hatas�z yaz�lmas�n� sa�layan k�sayollara sahiptir. Bunlar� s�ralayal�m:
? {0,1} anlam�na gelir. Kendisinden �nce yer alan unsurun en az s�f�r en �ok bir kere tekrar edilmesi gerekti�ini (olmayabilece�ini ama olursa en fazla bir kere olabilece�ini) belirtir.
* {0, } anlam�na gelir. Kendisinden �nce yer alan unsurun s�f�r veya daha fazla kere tekrar edilmesi gerekti�ini (t�m�yle opsiyonel oldu�unu) belirtir.
+ {1, } anlam�na gelir. Kendisinden �nce yer alan unsurun en az bir veya daha �ok kere tekrar edilmesi gerekti�ini (bulunmas�n�n zorunlu oldu�unu) belirtir.
Bu k�sa-yollar� kullanarak, yukar�daki karma��k ifadeleri basitle�tirelim:
^[a-zA-Z0-9_]+� En az bir harf veya rakam veya alt�izgi i�eren herhangi bir kelime
^[0-9]+� Herhangi bir pozitif tamsay�
^\-?[0-9]+� Herhangi bir tamsay�
^\-?[0-9]*\.[0-9*$]+� Herhangi bir kesinli (double) say�
Bir D�zenli �fade'nin yaz�l���nda birden fazla arama-s�ralan�� deyimine yer verebiliriz. Bunu yapmam�z� sa�layan | i�aretidir. �rne�in,
\.com|\.co\.uk
ifadesi ile, ya ".com" ya da ".co.uk" de�erlerinin bulunmas�n� sa�layabiliriz. Burada | i�areti "veya" kelimesi gibi d���nebilirsiniz.
D�zenli ifadeler yoluyla INPUT etiketinden gelen de�erleri incelerken hata yapmak kolayd�r. Bunun i�in kendi ifadelerinizi mutlaka s�e�itli olas�l�klara kar�� s�namal�s�n�z. Bu b�l�m�n ba��nda �rnek olarak verdi�imiz D�zenli �fade'yi hat�rl�yor musunuz?
^.+@.+\\..+$
�rne�in bu ifade, ziyaret�inin elektronik posta adresini yazmas� gereken bir INPUT etiketinin sa�lad��� de�erin ger�ekten elektronik adres bi�imi ta��y�p ta��mad���n� s�nar. Ba�taki ^ ve nokta i�aretleri ile art� i�areti de�erin �n�nde bo�luk olmamas�n� sa�l�yor; @ i�areti ise de�erin i�inde @ bulunmas� gerekti�ine i�aret ediyor. Tekrar eden nokta ve art� i�aretleri "ne kadar olursa olsun ve ne olursa olsun" anlam�na geliyor. Bunu izleyen nokta karakterini g�steren (\.) i�aret buralarda bir de ger�ekten nokta olmas� gerekti�ini ve bunu izleyen nokta ve art� tekrar "ne olursa olsun, ne kadar olursa olsun" anlam�n� ta��yor. Ba�ka bir deyi�le, arad���m�z de�erin "herhangi bir �ey" @ "herhangi bir �ey daha" . "bir�eyler daha" �eklinde oldu�unu belirtmi� oluyoruz. Ne var ki deyimi�inde iki nokta veya iki @ i�areti olan veya @ i�areti ile nokta aras�nda bir �ey bulunmayan veya @ veya noktadan �ncesi ya da sonras� bo� olan b�t�n de�erleri safd��� etmeye yetmeyecektir. S�zgelimi bir ziyaret�imiz "@@@@.@@@" yazarsa, bu deyim bu de�eri ge�erli bir elektronik adres sayacakt�r.
PHP programlar�m�zda ziyaret�ilerimizin verdi�i de�erleri �e�itli bak�mlardan s�namak ve se�mek m�mk�nd�r; ancak hi� bir zaman yaz�lanlar�n do�rulu�unu garanti edemeyiz. Fakat �zellikle bir metinde bulunmamas� gereken i�aretlleri PHP'ye aratabiliriz. Bunu D�zenli �fade Fonksiyonlar� sa�lar.
D�zenli �fade Fonksiyonlar�
Yukar�da ��rendi�imiz D�zenli �fade yazma tekniklerini, PHP'nin bize sa�lad��� be� fonksiyonda parametre olarak kullan�r�z. PHP'nin ayr�ca Perl-tarz� d�zenli ifade fonksiyonlar� da vard�r. Bu fonksiyonlardan, ya bize bir boolean (do�ru/yanl��) de�er d�ner; ya da fonksiyon istedi�imiz i�i yaparak vard��� sonu�lar� verdi�imiz de�i�kene yazar. Biz, daha sonra bu de�ere bakarak veya de�i�kenin de�erlerini kullanarak, PHP program�m�z�n ak���n� kontrol edebiliriz. Burada ele alaca��m�z fonksiyonlara ili�kin �rneklerde, daha �nceki b�l�mlerde olu�turdu�umuz konuk defteri program� ile Web ziyaret�ilerimizin sunucuya g�nderece�i bilgileri do�rulamaya ve muhtemel zararl� kodlardan ay�klamaya �al��aca��z.
ereg() ve eregi()
PHP'nin temel D�zenli �fade Fonksiyonu, ereg(), aratt���m�z karakter s�ralan��� bulundu�u taktirde do�ru, bulamad��� taktirde yanl�� kar��l��� bir de�er verir. Fonksiyonu ��yle yazar�z:
$bir_degisken = ereg("e�le�tirilecek_s�ra" , $kaynak , $yeni_de�i�ken);
Fonksiyonun arad���m�z e�le�tirmeyi yapmas� halinde, buradaki $bir_degisken'in de�eri true/do�ru, yapamamas� halinde false/yanl�� olacakt�r. E�le�tirme s�ras�n�n nas�l olu�turuldu�unu yukar�da g�rd�k; bu ifadelerden i�imize uygun olan� buraya t�rnak i�inde yazar�z. $kaynak, e�le�tirilecek s�ralaman�n i�inde aranaca�� de�eri tutan de�i�kendir. Fonksiyonun bir di�er becerisi, e�er e�le�tirilecek s�ralamay� gruplar halinde verirsek, kaynakta yapaca�� e�le�tirme olursa, buna uygun de�erleri bir dizi de�i�kene yazabilmesidir; istersek bir parametre olarak bu yeni de�i�kenin almas�n� istedi�imiz ad� veririz; b�ylece e�le�tirme sonucu bulunan de�erler kaydedilmi� olur.
eregi(), aynen ereg() fonksiyonu gibi �al���r; sadece e�le�tirece�i de�erlerde b�y�k-harf/k���k-harf fark� g�zetmez.
Daha �nceki b�l�mde olu�turdu�umuz ve kd_01.php ad�yla kaydetti�imiz konuk defteri program�n�n ak�� plan�n�, ziyaret�inin Form'a yazd��� ve sunucuda $HTTP_POST_VARS dizi-de�i�keninde tutulan de�i�kenlerinden elektronik posta adresi ilge ilgili olan� ger�ekten i�inde en az bir @ i�areti ile en az bir adet nokta i�ip i�ermedi�ine bakarak s�nayabiliriz. B�yle bir s�nama i�in gerekli kod ��yle olabilir:
if (eregi("^.+@.+\\..+$", $adres, $email)) {
}
else {
$hata = "Elektronik posta adresinizde bir hata var!<br>";
echo $hata;
include("kd_hata_halinde.htm");
exit;
}
Program, bu �rnekte $adres de�i�keninde kay�tl� de�erin i�inde arad��� s�ralamay� bulursa, e�le�en de�eri $email adl� yeni bir de�i�kene yazacak ve if s�nav�n�n sonucu do�ru olacakt�r. Bu s�ralamaya uygun bir de�er bulunamazsa, if s�nav� else deyimine atlayacak ve bir hata mesaj� �retilerek, bu program durdurulacakt�r. (Burada, yapt��� hayat� d�zeltmesi yani ge�erli bir elektronik posta adresi vermesini sa�layan yeni sayfan�n, include komutu ile ziyaret�iye g�nderildi�ine dikkat edin. Bu program�n yeni bi�imi kitap����n �rnek kodlar� aras�nda kd_02.php ad�yla bulunabilir.)
ereg_replace() ve eregi_replace()
G�rd���m�z gibi, ereg() aratt���m�z karakter s�ralan��� bulundu�u taktirde do�ru, bulamad��� taktirde yanl�� kar��l��� verdikten sonraduruyor! Oysa kimi zaman aratt���m�z ve bulunan de�erin ba�ka bir de�ierle de�i�tirilmesi gerekebilir. Bunun i�in ereg_replace() ve eregi_replace() fonksiyonlar�n� kullan�r��z:
ereg_replace("e�le�tirilecek_s�ra" , yeni_metin , $kaynak);
Fonksiyonun arad���m�z e�le�tirmeyi bulursa, bu de�erin yerine verdi�imiz yeni metni koyacakt�r; yeni metni bir de�i�kenin de�eri olarak da verebiliriz. Uygulama �rne�i i�in yine konuk defteri �rne�ine d�nelim. Ziyaret�ilerimiz kimi zaman yanl��l�kla, kimi zaman pek de iyi niyet sonucu olmadan, kendilerinden bekledi�imiz isim, adres ve mesaj yerine sunucu veya ba�ka ziyaret�ilerin Browser programlar� taraf�ndan kod gibi alg�lanacak metinler yazabilirler. PHP'de g�venlik b�l�m�nde bu konuda daha ayr�nt�l� bilgi bulacaks�n�z. Burada sadece bu t�r zararl� metinlerin genellikle programlarda bulunmas� gereken karakterler i�erdi�ini s�ylemekle yetinelim. Bu t�r karakterlerin ba��nda < ve > i�aretleri bulunur! Dolay�s�yla, biz de ziyaret�imizden gelecek verilerin yaz�ld��� de�i�kenlerin de�erlerinde bu i�aretleri aratabilir ve bunlar� i�i bo� bir alfan�merik de�er ile de�i�tirebilir; yani silebilir. Zararl� olabilecek kodlar�n aras�nda daha bir �ok karakter bulunabilir; ancak Script diliyle yaz�lmas� gereken bu kodlardan < ve > i�aretlerini kald�r�lmas� kodlar� i�lemez hale getirece�i i�in, �u a�a��daki �rnek yeterli olabilir:
$adi = ereg_replace("<","",$adi);
$adi = ereg_replace(">","",$adi);
$adres = ereg_replace("<","",$adres);
$adres = ereg_replace(">","",$adres);
$mesaj = ereg_replace("<","",$mesaj);
$mesaj = ereg_replace(">","",$mesaj);
Burada ereg_replace() fonksiyonu, ziyaret�iden gelecek �� de�i�kenin de�erlerinde < ve > i�aretlerini aramakta onlar�n yerine i�i bo� bir metin ("") yazmaktard�r. (Bu �rne�i i�eren konuk defteri, bu kitap����n �rnek kodlar� aras�nda kd_03.php ad�yla bulunabilir.)
split()
D�zenli �fade ile �al��an bu fonksiyon, verece�imiz e�le�tirme s�ralamas�n� s�n�rlay�c� olarak kullanarak, belirtece�imiz de�erde buldu�u de�er par�alar�n� ay�r�r ve bunlar� ayr� ayr� bir dizi de�i�kenin elemanlar� olarak kaydeder. Bu fonksiyonu ��yle yazar�z:
$yeni_dizi_de�i�ken = split("e�le�tirilecek_s�ra" , $kaynak, s�n�r_say�s�);
Fonksiyon, arad��� s�ralamay� bulamazsa, false/yanl�� sonucunu verir. Burada s�n�r say�s� olarak verece�imiz rakam, olu�turulacak yeni dizi de�i�kene en fazla ka� eleman yaz�lmas�n� istedi�imizi g�sterir. Bu say�y� vermezsek, PHP yeni dizi de�i�kenin gerekti�i kadar elemana sahip olmas�n� sa�lar. Bir �rnek vererek, bu fonksiyonu nas�l kullanibilece�imizi g�relim:
<?php
$metin = "�nsan s�z�yle kendini g�sterir, davran��lar�yla ruh halini aksettirir.";
$aranan = " ";
$yeni_dizi_de�i�ken = split($aranan, $metin);
foreach ($yeni_dizi_de�i�ken as $eleman) {
print "$eleman <br>";
}
?>
Bu programda PHP, $metin de�i�keninin i�erdi�i de�erde $aranan de�i�keninin i�erdi�i de�eri, yani bo�lu�u, e�le�tirilecek unsur olarak kullanacak ve $metin de�i�keninin de�erini bo�luklar�ndan par�alara ay�racakt�r. Ayr�l�cak her yeni par�a, $yeni_dizi_de�i�ken adl� de�i�kenin elemanlar� olarak atanacakt�r. Program�n geri kalan k�sm� ise, bu yeni dizinin elemanlar�n� g�r�nt�lemekterdir.
sql_regcase()
��inde b�y�k harf-k���k harf ayr�m� olan bir de�eri b�y�k harf-k���k harf ayr�m� olmayan D�zenli �fadeler haline �evirir. Bu fonksiyon bizden D�zenli �fade almaz, tersine D�zenli �fade olu�turur. �rnek:
<?php
$metin = "S�zler";
echo(sql_regcase($metin);
?>
Bu program, Browser penceresine �u metni yazd�r�r:
[Ss][��][Zz][Ll][Ee][Rr]
PHP ile Veritaban�
PHP�yi bir veritaban�ndan veri �ekecek, bunlarla HTML etiketlerinin i�eri�ini olu�turacak ve ziyaret�imizden alaca��m�z bilgileri bir veritaban�na i�leyecek i�lemleri ��renebilecek kadar biliyoruz art�k. Bu kitap����n ba� taraf�ndaki kurma i�lemlerini birlikte yapt�ysak, �u anda PHP programlar�n� geli�tirdi�iniz ki�isel bilgisayardaki ki�isel Web sunucusunda MySQL s�r�c�leriniz ve veritaban� y�netim program�n�z �al���yor olmal�. Bir kere daha tekrar etmek gerekirse, PHP ile veritaban�na dayanan sayfalar yapmak i�in mutlaka ve sadece MySQL s�r�c�lerini kullanmak gerekmez. Bunun yerine s�zgelimi Microsoft�un ODBC s�r�c�lerini kullanabilirsiniz. Ancak Web sitenize evsahipli�i yapan firman�n size ODBC deste�i verip vermedi�ini ��renmeniz gerekir. Asl�nda ayn� �ekilde, evsahibi firman�n MySQL deste�i verip vermedi�ini de ��renmek zorundas�n�z. (PHP ile MS-ODBC s�r�c�lerini kullanabilmek i�in Andrew Stopford�un ASP Today sitesinde http://www.asptoday.com/articles/20000202.htm adresindeki yaz�s�nda daha geni� bilgi bulunmaktard�r.)
Web sitemizde, HTML sayfalar�m�z� ve PHP programlar�m�z� neden veriya dayal� hale getirmeliyiz? Bu sorunun cevab�, "Ba�ka t�rl� elde edilemeyecek bir otomasyon, ziyaret�ilerimizle ger�ek anlam�yla etkili biral��veri� sa�lamak i�in!" diye yan�tlayabiliriz. Yukar�da, bir PHP program�n�n ziyaret�iden Frm ile alaca�� bilgileri, yine kendisine g�nderebilece�ini ve bu bilgileri i�leyebilece�ini g�rd�k. PHP program�m�z�n bu bilgileri bir veritaban�na i�ledi�ini ve ziyaret�i bir ba�ka sayfaya gitmek istedi�inde o sayfan�n i�eri�inin, ziyaret�inin birka� saniye �nce yapt��� tercihlere g�re belirlendi�ini d���n�n. Bir ba�ka �rnek, Web sitemizdeki sayfalarda yer alan unsurlar�n g�ncelle�tirilmesi i�in her g�ncelle�tirmede �ok say�da program� yeniden yazmak veya sayfay� yeniden yapmak zorunlu�u varsa, bu program ve sayfalar�n i�eriklerini bir veritaban�ndan al�yor olmas� halinde, sadece veritaban�n� g�ncelle�tirmekle onlarca, belki de y�zlerce, HTLL ve PHP belgesini yeniden yazm�� gibi olabiliriz.
Bu b�l�mde �nce bir �rnek veritaban� dosyas� haz�rlayaca��z; daha sonra bunun i�indeki verileri PHP program� ile sayfalar�m�za kataca��z. Bu dizinin ikinci kitab�nda Unix/Linux sistemlerinde veritaban� uygulamalar� �zerinde daha geni� duraca��z. Burada Wind�ows sisteminde bir MySQL uygulamas�n� ele almakla yetinece�iz.
MySQL Veritaban�
Ger�i bu kitap����n konusu kendisi ba�l� ba��na bir dil olan SQL de�il, ama burada sadece MySQL program� ile veritaban� olu�turmakla kalmayal�m, bir anlamda SQL diline de �ok k�sa bir giri� yapal�m. SQL �ook geni� bir dildir. Burada yapabilece�imiz giri� ancak ilk al��t�rmama�z� yapmam�za yetebilir.
SQL, (Structured Query Language, Yap�sal Sorgu Dili) veritaban� end�strisinin standart dilidir. Fakat 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 daemon olarak �al���r ve arzu eden programa, bildirece�i (ve eri�im hakk� bulunan) veritaban� dosyas�ndan veri �ekerek, sunar. Bir veritaban�nda farkl� say�da tablolar olabilir. 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.
//////////////////KUTU////////////////
mySQL veri t�rleri
MySQL'de bir �ok veri t�r� olu�turulabilir. Ancak Web programlar� a��s�ndan �nemli olan bir ka�� ve �zellikleri ��yle saralanabilir:
INT Tamsay�: -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.
/////////////////KUTU
B�TT�//////////////
MySQL'de bir tablo olu�turmak i�in gerekli CREATE TABLE komutu ��yle kullan�l�r:
CREATE TABLE uyeler (adi VARCHAR(30), soyadi VARCHAR(30), �ye_no INT ) ;
Bu komutla, "uyeler" isimli �� s�tunlu bir tablo olu�turulur: birinci ve ikinci 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. Bu komutla olu�turulan tabloya INSERT INTO komutuyla veri girebilirsiniz:
INSERT INTO uyeler (adi, soyadi, uye_no) VALUES ('Muharrem','Ta�','1234')
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.
MySQL veritaban�ndan bilgi edinmek i�in SELECT komutunu kullan�r�z:
SELECT * FROM uyeler ;
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. Diyelim ki yukard�da olu�turdu�umuz tablonun sadece "adi" ve "soyardi" s�tunlar�ndaki bilgileri almak isteseydik, bu komutu ��yle yazacakt�k:
SELECT adi soyadi FROM uyeler ;
Bir veritaban�ndaki bilgilerin yenileriyle de�i�tirilmesini, yani veritaban� dosyas�n�n g�ncelle�tirilmesini UPDATE komutu sa�lar. Bu komutu kullanarak veritaban�m�zdaki baz� kutucuklar�n i�indeki bilgileri de�i�tirebiliriz. Veritaban� dosyalar�n� g�ncelle�tirme zorunlu�u bulunmas� ise bize veritaban� tasar�m�n�n �ok �nemli oldu�unu g�sterir. �rne�in:
UPDATE uyeler SET adi = "�ahika" ;
Bu komut, veritaban�ndaki b�t�n sat�rlarda, birinci s�tundaki de�erleri "�ahika" olarak de�i�tirmekle sonu�lan�rd�. Amac�m�z bu ise, sorun de�il; ancak �o�u kez 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�lememiz gerekir. Veritaban� dosyam�z� olu�tururken, her kayd�n di�er kay�tlarda olmayan (unique) bir s�tun (bunu da veritaban� tekni�indeki terimle s�ylersek. alan) bulunmal�d�r, ki MySQL'e yap�lacak de�i�ikli�in tam yerini s�yleyelim. �rne�in
UPDATE uyeler SET adi = "�ahika" 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 alan� bulunan, iyi d���n�lm�� bir veritaban�ndan se�im yapmak da kolay olur. �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.
Bir MySQL veritaban�ndaki kayd� silmek i�in DELETE komutunu kullan�r�z:
DELETE FROM uyeler WHERE uye_no = 1234;
Vveritaban�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.
Bu komutlar�n MySQL'in DOS komut i�lemcisi ile komutsat�r�ndan yap�laca��n� belirtmemiz gerekir. Bunu yapabilmek i�in MySQL Server'�n Windows'da �al��t�r�lmas� gerekir. MySQL'in payla��m s�r�m�n� kullanmak i�in Windows sistemlerinde mysqld-shareware.exe program�n� �al��t�rman�z gerekir. Bunun i�in DOS komut istemcisi penceresinde "C:/mysql/bin" dizinine giderek, �u komutu vermemiz yeter:
mysqld-shareware
MySQL s�r�c�lerinizin ki�isel Web sunucusunda ba�ar�yla �al��t���na, kitap����n ba� taraf�nda belirtti�imiz k���k al��t�rmay� yaparak emin olduktan sonra ger�ek bir veritaban� dosyas� yazabiliriz.
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. Bu dosyaya, i�indeki verileri al�p veritaban�na boca edece�imiz i�in, Dump dosyas� denir.
A�a��daki metni MySQL program�n�n kurulu oldu�u dizindeki /bin/ alt-dizinine (muhtemelen c:\mysql\bin) veri.dump ad�yla kaydedin (Notpad kullan�yorsan�z, dosya ad�na .txt eklendi�ine dikkat edin!)
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 , 'Sahika' ,'Tabak' ,'PCLife Dergisi, Istanbul' , 'Yazar');
INSERT INTO calisanlar VALUES (2 , 'Muharrem' , 'Tac' , 'I��k 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 maddesinin i�aretsiz olmas�na dikkat edin. Daha sonra yine DOS komut istemcisi penceresinde MySQL program�n�n dizininde /bin alt-dizinine gidin ve �u komutu yaz�n:
mysqladmin -u root create veri
MySQL veri adl� veritaban�n�n oluu�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 yapacakat�r. Bunu, �u komutla yapabiliriz:
mysql �u root veri < veri.dump
��lerin yolunda gidip gitmedi�ini c:\mysql\data dizininde veri adl� bir klas�r olu�turuldu�unu kontrol ederek anlayabiliriz. Bu klas�r�n i�inde calisanlar.frm, calisanlar.isd ve calisanlar.ism ad�nda dosyalar bulunmas� gerekir.
PHP-MySQL �li�kisi
B�ylece, MySQL ile bir veritaban� dosyas� olu�turma i�lemi bitmi� oldu. bir PHP program� yazarak bu veritaban�ndaki kay�tlar� okutabiliriz. Bunu yapmadan �nce yine h�zl� �ekilde PHP-MySQL ili�kisinini sa�layan fonksiyonlara g�zatal�m.
PHP programlar�m�zda veritaban�ndan yararlanabilmek i�in program�n �nce Web sunucusu arac�l���yla veritaban� dosyas� ile ba�lant� kurmas� gerekir. Ba�ka bir deyi�le, PHP program�n�n veri ile aras�nda bir yol a�mas� gerekir. MySQL a��s�ndan ise bu ba�lant�, veri sunucusunda yeni bir oturum a��lmas� anlam�na gelir. �ki program aras�ndaki bu ili�kiyi PHP'nin mysql_connect() fonksiyonu yapar. Bu fonksiyonun alabilece�i �� parametre vard�r:
$veri_yolu = mysql_connect ("localhost" , "root" , "parola" );
Burada "localhost" yerine MySQL program�n�n par�as� olarak �al��t��� sunucunun ad� yaz�l�r. "root" bu MySQL sunucusunda a��lacak oturumun kimin ad�na a��laca��n� belirter. "root" kelimesi, sunucunun y�netici olarak oturum a��laca�� anlam�na gelir: "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. 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("kara-murat", "root");
if ( ! $veri_yolu) die ("MySQL ile veri ba�lant�s� kurulam�yor!);
Burada veri sunucusunun bulundu�u Web sunucusunun ad�n�n "kara-murat" oldu�una, ve ooturumun "root" yetkileriyle a��ld���na dikkat edin. �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.
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 �ekimde 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� biraraya 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. A�a��daki program�, veri_01.php ad�yla kaydedelim:
<HTML>
<TITLE>PHP ile Veri �rnegi</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<?php
$veri_yolu = mysql_connect("kara-murat", "root");
if ( ! $veri_yolu ) die ("MySQL ile veri ba�lant�s� kurulam�yor!");
mysql_select_db("veri" , $veri_yolu)
or die ("Veritaban�na ula��lam�yor!" . mysql_error() );
$sonuc = mysql_query("SELECT * FROM calisanlar",$veri_yolu);
printf("Ad�: %s<br>\n", mysql_result($sonuc,0,"adi"));
printf("Soyad�: %s<br>\n", mysql_result($sonuc,0,"soyadi"));
printf("Adresi: %s<br>\n", mysql_result($sonuc,0,"adres"));
printf("G�revi: %s<br>\n", mysql_result($sonuc,0,"pozisyon"));
?>
</BODY>
</HTML>
Burada, mysql_connect() fonksiyonu ile "kara-murat" isimli sunucuda root ad�na MySQL sunucu ile ba� kurduktan sonra mysql_select_db() fonksiyonu ile bu ba�� kullanarak veri isimli veritaban�ndan veri �ekece�imizi bildiriyoruz. Daha sonra mysql_query() fonksiyonu ile bu veritaban�ndaki �calisanlar� isimli tablodan �her�eyi� se�iyoruz ve se�ilenleri $sonuc dizi-de�i�keninde topluyoruz. $sonuc de�i�kenin de�erlerini g�r�nt�lemek i�in PHP'nin �zel bir fonksiyonu olan mysql_result() fonksiyonu kullan�yoruz. Burada metin bi�imlendirmekte yararland���m�z printf() fonksiyonunu daha �nce tan�m��t�k.
<php00031.tif>
mysql_query() fonksiyonu, PHP'nin SQL dilini kullahnarak veritaban� i�lemleri yapmas�n� sa�layan ba�l�ca arac�d�r. Yukar�da k�saca de�indi�imiz b�t�n SQL komutlar�yla yazaca��m�z b�t�n "query" deyimlerini bu fonksiyon ile icra ettirece�iz. mysql_result() ise SQL de�il, Data Manipulation Language (DML) denen ba�ka bir veri-bi�imlendirme dilinin inceliklerinden yararlanmam�z� sa�lar. Burada $sonu� de�i�keninde veritaban� kay�t bi�iminde tutulan verileri PHP'nin ve dolay�s�yla HTML'in anlayaca�� bi�ime �eviren bu fonksiyondur.
�imdi bu program� biraz geli�tirilim ve daha �nce kendi kendine bilgi veren Form �rne�imizi buraya uygulayal�m; ancak bu kez, ziyaret�imizin verece�i bilgileri veritaban�na ekleyelim; ve kendi ad�n�n veritaban�na eklendi�ini sayfadaki tabloyu g�ncelleyerek bildirelim. �nce �u program�, veri_02.php ad�yla kaydedelim:
<?php
// Form doldurulduktan sonra program buradan ba�l�yor
if ( isset ( $HTTP_POST_VARS )) {
$veri_yolu = mysql_connect("server", "root");
if ( ! $veri_yolu ) die ("MySQL ile veri ba�lant�s� kurulam�yor!");
mysql_select_db("veri" , $veri_yolu) or die ("Veritaban�na ula��lam�yor!" . mysql_error() );
$ekle = mysql_query("INSERT INTO calisanlar ( adi , soyadi , adres , pozisyon ) VALUES ('$adi', '$soyadi', '$adres', '$pozisyon' )", $veri_yolu );
echo ("
<HTML>
<HEAD>
<TITLE>PHP'de Veritaban�</TITLE>
<meta http-equiv='content-type' content='text/html; charset=ISO-8859-9'>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1254'>
");
$sonuc = mysql_query("SELECT * FROM calisanlar", $veri_yolu);
echo ("
<TABLE>
<TR>
<TD><B>Uzman�n Ad�</B></TD>
<TD><B>�al��t��� Yer</B></TD>
<TD><B>G�revi</B></TD>
</TR>
\n");
while ($satir = mysql_fetch_row($sonuc)) {
printf("<TR><TD>%s %s</TD><TD>%s</TD></TD><TD>%s</TD></TR>\n", $satir[1], $satir[2], $satir[3], $satir[4]);
}
echo ("
</TABLE>\n
<p><B>Te�ekk�r ederiz.</B></P>
<A HREF='index.php'>Ana sayfaya d�nmek i�in t�klay�n�z</A>
");
}
// program ilk kez a��l�yorsa buradan ba�layacak
else {
echo ("
<HTML>
<HEAD>
<TITLE>PHP'de Veritaban�</TITLE>
<meta http-equiv='content-type' content='text/html; charset=ISO-8859-9'>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1254'>
</HEAD>
<BODY>
<p><B>Mevcut �yelerimiz</B></P>
");
$veri_yolu = mysql_connect("server", "root");
mysql_select_db("veri", $veri_yolu);
$sonuc = mysql_query("SELECT * FROM calisanlar", $veri_yolu);
echo ("<TABLE>
<TR>
<TD><B>Uzman�n Ad�</B></TD>
<TD><B>�al��t��� Yer</B></TD>
<TD><B>G�revi</B></TD>
</TR>
\n");
while ($satir = mysql_fetch_row($sonuc)) {
printf("<TR><TD>%s %s</TD><TD>%s</TD></TD><TD>%s</TD></TR>\n", $satir[1], $satir[2], $satir[3], $satir[4]);
}
echo ("
</TABLE>\n
<p></p>
<p><B>Siz de aram�za kat�lmak ister misiniz?</B></P>
<FORM ACTION='$PHP_SELF' METHOD='POST'>
<TABLE>
<TR><TD>Ad�n�z: </TD><TD><INPUT TYPE='TEXT' NAME='adi'></TD></TR>
<TR><TD>Soyad�n�z: </TD><TD><INPUT TYPE='TEXT' NAME='soyadi'></TD></TR>
<TR><TD>�� Yeriniz: </TD><TD><INPUT TYPE='TEXT' NAME='adres'></TD></TR>
<TR><TDALIGN='left'>G�reviniz: </TD><TD><INPUT TYPE='TEXT' NAME='pozisyon'></TD></TR>
<TR><TD ALIGN='center'><INPUT TYPE='SUBMIT' VALUE='Defteri imzala!'></TD><TD ALIGN='center'><INPUT TYPE='RESET' VALUE='T�m�n� sil!'></TD></TR>
</TABLE>
</FORM>
</BODY>
</HTML>
");
}
?>
Program, ilk kez �al��t���nda, �al��maya ikinci yar�s�ndaki else() deyiminden itibaren icra ediliyor; ziyaret�ilerimize mevcut �yelerimizin listesini veriyor ve �ye olmak isteyip istemedi�ini soruyor. Arzu edenin �ye olabilmesi i�in gerekli Form'u da sunuyoruz.
<php00032.tif>
Program�n her iki b�l�m�nde de veri okuyan ve bunu g�r�nt�leyen, yani program�n canal�c� noktas�, mysql_fetch_row() fonksiyonudur. PHP'nin DML ara�lar�ndan olan bu fonksiyonun marifeti, bir veritaban�ndan elde edilen sonucu sat�r-sat�r okumas�d�r. Nitekim, burada bu fonksiyondan d�nen de�eri $satir ad�n� verdi�imiz dizi-de�i�kene yaz�yoruz ve sonra printf() bu dizinin elemanlar�n� s�rayla Browser penceresine g�nderiyor. (Burada oldu�u gibi $sat�r de�i�kenin i�inde ka� ka� s�tun oldu�unu bildi�imiz durumlarda printf() fonksiyonunu d�ng�s�z kullanmak m�mk�nd�r. Ancak veritaban�n�n s�tun say�s�n� bilmiyorsak bunu s�zgelimi count($satir) yoluyla ��renip, bu bilgiyle bir for d�ng�s� kurmak yerinde olur.
Program�n iki b�l�m� aras�ndaki tek fark, $HTTP_POST_VARS dizi-de�i�keninin bir de�er tutmas� halinde (yani ziyaret�i sayfay� a�t���nda kar��s�na ��kan Form'u doldurdu�u ve g�nderdi�i zaman) �al��an birinci b�l�m�nde, mysql_query() fonksiyonunun bu kez veritaban� dosyas�na ziyaret�inin verdi�i bilgileri i�lemek �zere farkl� bir SQL deyimi i�ermesidir. Nas�l yaz�ld���n� daha �nce ele ald���m�z bu fonksiyon "calisanlar" tablosundaki d�rt alana elimizdeki d�rt de�i�kenin de�erlerini SQL'in INSERT komutuyla ekliyor.
<php00032.tif>
PHP'nin MySQL ile yapabilece�imiz veritabayn� y�netimi i�in 20'ye yak�n fonksiyonu vard�r; MySQL de bu fonksiyonlar yard�m�yla �ok say�da i� yapabilir. Bu konuda ayr�nt�l� bilgiyi MySQL ve PHP'nin Internet sitelerin yan� s�ra, http://hagen.let.rug.nl/~s0367672/pm_lin_e.htm adresinde bulabilirsiniz.
Bu konuya son verirken, Form �rne�indenden farkl� olarak yukar�daki veritaban� �rne�inde ziyaret�inin girece�i bilgilerle ilgili g�venlik �nlemleri al�nmad���na dikkatinizi �ekerim.
PHP'de G�venlik
G�n�m�zde Internet'te ne kadar g�venlik �nlemi al�nsa, yeridir. Sadece iyi niyetli olmayan ki�ilere kar�� de�il, fakat daha �ok ne yapt���n� tam bilmeyen Web ziyaret�ilerini de d���nmek ve PHP programlar�n�z�n g�venli�ini artt�rmak zorundas�n�z.
Internet�te iyiniyetli olunmaz. Ac�, ama ger�ek. Internet�e i�ine zararl� kod yerle�tirilebilecek bir Form koyarsan�z, emin olmal�s�n�z ki, birisi bu zararl� kodu koyacakt�r. Sadece k�t�niyetli ki�ilerin size s�z gelimi elektronik posta adresi veya mesaj g�r�n�m�nde zararl� kod g�ndermesini �nlemek i�in de�il, fakat normal kullan�c�lar�n yapabilecekleri s�radan hatalar� yakalamak ve d�zeltmek i�in de �nlem alman�z gerekir.
Server g�venli�i son derece �nemli bir konu olmakla birlikte, bunu sa�lamak genellikle tasar�mc�n�n sorumlulu�unda de�ildir. Bununla birlikte sayfalar�m�z�n ve veritaban�m�z�n g�venli�i ve Web uygulamalar�m�z�n do�ru i�lemesi bizden sorulur.
Bir form ile sizin sayfalar�n�za veya veritaban�n�za ne gibi zararlar verilebilir? Bu zararlar�n ba��nda, en hafifinden sizin sayfan�z� ba�ka yere y�nlendirmek gelebilir. K�t�niyetin �l��s� artt�k�a bu, Server program�n�n a��klar�ndan yararlanarak, Server�daki dosyalar� de�i�tirmeye veya tahrip etmeye kadar gidebilir. Normal ziyaret�i hatalar� aras�nda ise s�zgelimi elektronik posta adresini iki @ i�aretiyle yazmaktan tutun, bu i�areti koymamaya, metktubun gidece�i bilgisayar�n adresini eksik yazmaya kadar uzanan bir dizi yanl��l�k bulunabilir. Ziyaret�iler formu eksik doldurabilirler. Bu gibi eksiklikler ve yanl��l�klar� daha sonra d�zeltmek zaman kayb�na yol a�ar. Kimi zaman eksik doldurulmu� bir Form, bu bilgilerin ula�t�r�laca�� programda hataya yol a�abilir. Bu sebeple, �zellikle Form yoluyla al�nan bilgilerin denetimi ve do�rulat�lmas� �artt�r.
Bir Form�un i�erdi�i bilgilerin denetimi ve do�rulanmas� iki yerde yap�labilir: istemci-taraf�nda, sunucu-taraf�nda. �stemci taraf�nda, yani ziyaret�iye g�nderece�imiz HTML sayfas�n�n i�inde yer alan kodlarla yapaca��m�z denetim-do�rulama, h�zl� �al���r; ve ziyaret�i ile sunucu aras�nda ileti�im kurulmadan �nce yap�l�r; b�ylece ziyaret�inin s�zgelimi g�nder d��mesini t�klad�ktan sonra �ok beklemesi gerekmez. Ne var ki bu y�ntemde denetim-do�rulama kodu ziyaret�iye g�nderilmi�tir; k�t� niyetli ki�i neyi denetledi�inizi g�recek ve isterse bu denetimi kald�racak size zararl� kod par�ac�klar� g�nderebilecektir. Denetimin sunucu taraf�nda yap�lmas�, belki biraz daha fazla zaman harcamay� gerektirir, fakat g�venlik a��s�ndan daha etkili olabilir. Elektronik posta adresi do��rulama ve mesajlar�n i�inden zararl� kodlar� ay�klama y�ntemlerinden D�zenli �fadeler b�l�m�nden s�z ettik. Orada ele alad���m�z �rnek kodlar geli�tirilerek ziyaret�ilerin girdilerinde daha s�k� aramalar yap�labilir.
Parola ve SSL
PHP gibi, kendisi ziyaret�inin Browser'�na g�nderilmeyen bir dille, sitelerimi parola ile korumak m�mk�n ve kolayd�r. Sitenize sadece sizin verece�iniz parola ile girilmesini istiyorsan�z, ana sayfan�n ��yle ba�lamas� yeter:
<?php
if (!isset($parola) || $parola != "gizli_kelime") {
?>
<FORM ACTION="parola_igir.php" METHOD="POST">
Parola: <INPUT NAME="parola" TYPE"password"><BR>
<INPUT TYPE="submit">
</FORM>
<?php
}
else {
// Buraya gizlenen sayga girecek
?>
PHP ayr�ca mevcut hemen hemen b�t�n sunucu kullan�c� kimlik do�rulama protokolleri ile uyumludur; ve sunucu y�netimi ile ili�ki kurularak daha karma��k kullan�c� kimlik do�rulama y�ntemleri uygulanabilir. Bu y�ntemler aras�nda Secure Socket Layer (SSL) y�ntemlerini, ve OpenSSL ve ModSSL teknikleri sayabiliriz.
T�rnak ��areti Sorunu
PHP4.0'� tasarlayanlar, �zellikle zararl� kodlar� gizlemekte k�t�niyetli ki�ilerin yararland��� tek ve �ift t�rnak i�aretlerinin sisteme zarar vermesini �nlemek amac�yla, ziyaret�i girdilerindeki t�rnak i�aretlerinin otomatik olarak Escape karakteri ile zarars�z hale getirilmesini sa�lam�� bulunuyorlar. Buna g�re bir ziyaret�i bir forma s�z gelimi "PHP'nin yararlar�" yazacak olursa bu "PHP\'nin Yararlar�" haline d�necektir. Kimi zaman �irkin g�r�nse de bu, bir sitenin g�venli�i i�in �nemli bir kazan�t�r.
Bu sistemin i�leyebilymesi i�in sunucu y�netiminin PHP kurulumu s�ras�nda php.ini dosyas�nda gereken d�zenlemeyi yapm�� olmas� gerekir. Bunun yap�lmad��� durumlarda, programc� olarak siz, PHP'nin de�i�kenlerin de�erlerinde gerekti�inde tersb�l� i�areti uygulamas�n�, bu de�i�keni addslashes() fonksiyonu ile birlikte kullanarak ��z�mleyebilirsiniz. �rnek:
$yeni_degisken = addslashes($eski_degisken)
Bu dizinin ikinci kitab�nda g�venlik konusuna daha geni� yer verece�iz.
PHP Kaynaklar�
G�venlik dahil, PHP konusunda ba�vurulacak kaynaklar�n bir k�sm� ��yle s�ralan�yor. Ayr�ca bu kitap����n �rnek kodlar� aras�nda, PHP Hosting Companies Search the Directory.htm adl� belgede ��k say�da kurum ve firmas�n listesini bulabilirsiniz:
http://www.php.net/FAQ.php
http://www.php.net/manual/config-odbc.html
http://www.techdevelopers.com
http://www.lilali.net
http://www.sqlcourse.com/
ttp://www.apache.org/info/apache_users.html
W/O: 0
W/O: 145821
W: 167316