You are on page 1of 110

T.C.

CELAL BAYAR NVERSTES TURGUTLU MESLEK YKSEKOKULU BLGSAYAR TEKNOLOJS VE PROGRAMLAMA

PHP DERS NOTU

Seval ZBALCI seval.ozbalci@bayar.edu.tr MANSA 2003

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:1

PHP
nsz............................................................................................................................... 5 PHP Destei veren sitelerle ilgili not:..........................................................6 PHP'ye Giri ...................................................................................................................... 7 PHP ve Veritaban...................................................................................8 PHP ve Web Sunucusu............................................................................9 Unix/Linux Sistemleri ...............................................................................10 Linux'ta program derlediniz mi? ................................................................10 Gvenli socket ve Internet Eriimi Katman.................................................13 Windows-PWS ve IIS ...............................................................................14
IIS 4.0 ve 5.0......................................................................................................................................... 15

Browser Yetenek Dosyas: Browscap.ini .....................................................15


PWS 4.0................................................................................................................................................ 15

Windows'da Apache! ................................................................................16 Windows'da MySQL .................................................................................16 PHP'nin Yap Talar .......................................................................................................... 21 PHP programn durdurmak ....................................................................21 Deikenler ............................................................................................21 Veri Trleri .............................................................................................22 Tr Deitirme ........................................................................................23 Fonksiyon...............................................................................................23 Escape ....................................................................................................25 Drt yararl fonksiyon ............................................................................29 lemciler (Operatrler) .........................................................................30 Bir Arttrmak veya Azaltmak iin ...............................................................32 Sabit Deerler ........................................................................................34 Tarih ve saat Verisi.................................................................................35 PHP'de Program Denetimi.................................................................................................. 36 if Deyimi.................................................................................................36 switch deyimi .........................................................................................37 switch iin ksa yol...................................................................................39 Dngler ................................................................................................39 while dngs.........................................................................................39 do..while ................................................................................................40 for dngs ............................................................................................41 foreach ...................................................................................................41

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:2

Dngy sona erdirmek iin: break ...........................................................41 Dngy srdrmek iin: continue ............................................................42 Fonksiyonlar ..................................................................................................................... 43 Fonksiyon Tanmlama ve arma ..........................................................43 Fonksiyona varsaylan deer verebiliriz .................................................47 Deikenlerin kapsam: global ve static .................................................49 Dizi-Deikenler, Nesneler ............................................................................................... 52 Dizi Deiken Oluturalm ......................................................................52 Dizi deikenleri kullanalm ...................................................................55 Dizi Deikenlerin Dzenlenmesi ...........................................................58 Dizileri birletirme: array_merge() ............................................................58 Dizilere deiken ekleme: array_push() .....................................................58 Dizinin ilk elemann silme: array_shift() ....................................................59 Diziden kesit alma: array_slice() ...............................................................59 Dizileri sralama: sort() ve rsort()..............................................................59 likili dizileri sralama: asort() ve ksort() ...................................................59 Bir Nesne Oluturalm ............................................................................60 PHP banda ................................................................................................................... 63 Form'dan GET Metoduyla Gelen Bilgiler ..................................................64 URL Kodlar ............................................................................................67 Form'dan POST Metoduyla Gelen Bilgiler................................................69 Form ile ilemciyi Birletirelim ...............................................................70 Dosya "kartma" ...................................................................................72 Harici Dosya (include) ............................................................................74 include mu, require m?..........................................................................76 Dosyalar hakknda bilgi ..........................................................................76 Dosya var m? file_exits().........................................................................76 Dosya m, dizin mi? is_file() ve is_dir() ......................................................76 Dosya okunabilir mi? is_readable() ............................................................77 Dosya yazlabilir mi? is_writable() .............................................................77 Dosya altrlabilir mi? is_executable() .....................................................77 Dosya boyutu: filesize() ...........................................................................77 Dosyaya son eriim tarihi: fileadate(), filemtime() ve filectime() ...................77 Dosyalar oluturma ve silme ..................................................................78 Dosya ama ............................................................................................79 Bir Fonksiyonu durdurmak iin: l! ........................................................79 Dosya okuma: fgets(), fread() ve fgetc() ...............................................80

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:3

fseek() ile l belirleme........................................................................81 Dosyaya yazma ve ek yapma: fwrite() ve fputs()...................................83 Kullanmdaki dosyay kilitleyin! ..............................................................83 Dizinlerle lemler..................................................................................84 Dizin ieriini listeleme: opendir() ve readdir() ...........................................84 Dizin oluturma: mkdir() ..........................................................................84 Dizin silme: rmdir() .................................................................................85 Bir Dosya lemi rnei: Konuk Defteri ..................................................85 Metin Dzenleme ve Dzenli fadeler ................................................................................ 89 substr() .................................................................................................89 trim() ....................................................................................................90 chr()......................................................................................................90 ord() .....................................................................................................90 strlen() ..................................................................................................90 printf() ve sprintf() ..................................................................................90 number_format() ....................................................................................92 Eletirme deyimleri ve iaretler ............................................................93 Dzenli fadelerde zel Karakterler .......................................................94 Karakter Gruplar ...................................................................................94 Dzenli fade Fonksiyonlar....................................................................96 ereg() ve eregi() .....................................................................................97 ereg_replace() ve eregi_replace() .............................................................97 split() ....................................................................................................98 sql_regcase()..........................................................................................99 PHP ile Veritaban.............................................................................................................. 100 mySQL veri trleri ..................................................................................101 PHP'de Gvenlik ................................................................................................................ 108 Parola ve SSL .........................................................................................108 Trnak areti Sorunu .............................................................................109 PHP Kaynaklar.......................................................................................110

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:4

nsz
Rasmus Lerdorf, tarihin ilk dnemlerinde yani Internet'in henz yayld 1990'larn ortalarna doru i aryordu; hayat yksn bir kiisel sayfada yaynlamak ve bavuraca yerlere bu sayfann adresini verebileceini dnd. Fakat o dnemde zellikle niversitelerin Unix alarnda kurulan Web Sunucularda kiisel sayfa yapmak kolay deildi. Rasmus, kendisi iin hazrlad yazlmn Web'e aina olmayanlar starafndan da kolayca kullanabileceini dnd. Bu yazlmn byke bir blm Perl dilinden alnmt. Adna Personal Home Page (Kiisel Ana Sayfa) dedii bu programn ok tutulmas zerine Rasmus Lerdorf, Internet Sitesi kuran herkesin birinci gn deilse bile ikinci gn farkna vard ihtiyac, yani bir form yoluyla ziyaretiden gelen bilgileri ilemeyi salayan ekleri yazd ve programn ad PHP/FI (Form Interpreter/Form Yorumlayc) oldu. Kimileri programn bu srmne PHP2 adn takt; ve bu ad, programn ok deimesine ve gelimesine ramen uzun sre deimeden kald. Rasmus Lerdorf, 1995'in ortalarnda, Zeev Suraski, Stig Bakken, Shane Caraveo ve Jim Winstead ile bir grup kurdu ve PHP'yi Perl'den dn alma rutinlerle i yapan bir paket olmaktan kartp, Nesne-Ynelimli (Object-Oriented) bir programlama dili haline getirdi. Bu grup, bugn PHP4 ad verilen bu dili gelitirmekte ve yeni ilevsellikler kazanmas iin srekli almaktadr. PHP, Linux gibi, Ak Sistem kurallarna tabidir; isteyen programda istedii deiiklii yapabilir; ancak bu deiiklikten para kazanamaz ve yapt deiiklikleri isteyen herkese aklamak zorundadr. Linux'un nmzdeki yllarda en ok kullanlan iletim sistemi olaca yolundaki bilgiler kukusuz en ok Linus Torvalds' artt. Linux'un bu baarsndaki en nemli anahtar nokta olan ak kaynak gelitiriliyor ve dnyann heryerinden yazlm gelitiricilerin desteini alyor olmas. Ayn baary Web yazlm gelitirme dili PHP de gsteriyor. PHP bundan iki yl ncesine kadar ad duyulmam basit bir dildi. Ancak imdi gerek performans gerek destek asndan dier Web yazlm gelitirme dilleri ile kolayca yaryor; hatta bunlar fazlasyla geiyor. Hemen her trl iletim sistemiyle alyor olmas da cabas. PHP, her trl veritabanyla sorunsuz alyor olmasyla ve Zend derleyicisiyle daha da yaygnlk ve g kazanacak. PHP ve ak kaynak olarak gelitirilmeye balanan MySQL'in birlikte kullanldklarnda yakaladklar etkinlik binlerce Dolar verilerek alnan veritaban ve uygulama dilleriyle yarmann tesinde farklara sahip. Trkiye'de PHP olduka yeni kullanlmaya baland. Dnyadaki PHP kullanclarnn tercih ettikleri PHP editr PHPed'i bir Trk'n gelitirmi olmas, hepimize hakl bir gurur veriyor. Ayrca http://www.php.org.tr adresindeki oluum ok ksa srede Trkiye'de PHP'nin layk olduu yeri alacan gsteriyor. Bu kitap PHP'nin 4'nc srmne gre yazdk. Burada verdiimiz rnekleri uyguladnzda beklenen sonucu alamazsanz, nce sizin sisteminizde kurulu PHP'nin srmn kontrol etmelisiniz. Bu kitapktaki rnek kodlar PC Life dergisinin Internet sitesinde, http://www.pclife.com.tr/........../php_kodlar.zip adresinde bulabilirsiniz. Ayrca bu kitapktaki kodlarn tmnn gerek bir Web sunucuda nasl ilediini grmek iin http://www.mycgiserver.com/~ocal/ adresine bakabilirsiniz. Bununla birlikte bir programlama dilinin incelikleri, ancak kodlarnz kendiniz yazarsanz renilebilir. rnek kodlardan, ancak kendi yazdnz kodlar beklediiniz sonucu vermedii taktirde, karlatrma amacyla yararlanmalsnz. Sizi biraz da buna zorlamak iin yer yer konular bu kodlarn yazld varsaym ile ele alacam. Bugne kadar PHP programlarrna .php3 uzatmasn vermek adeta gelenek halini almt; ancak PHP'nin 4'nc srmyle birlikte, konfigrasyon ve INF dosyalar, yaplandrma srasnda iletim sistemlerine ve Web sunucularna varsaylan deer olarak sadece .php

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:5

uzatmasn tanmasn bildiriyorlar. PHP programlarnza bundan baka uzatmalar verecekseniz, Linux'ta Apache konfigrasyon dosyasn, Windows'da ise Registry kaytlarn deitirmeniz gerekir. ki blm olarak sunacamz PHP kitapnn birinci blmnn yazlmasnda yurdumuzda PHP kullanclarn eitme ve destekleme hareketinin ncleri Sayn Kayra Otaner, Serdar Soydemir ve zgr Akan, deerli yardmlarn esirgemediler. kinci kitapkta yer alacak uygulamalarn tmn bu grup gelitirdi ve Ak Kaynak hareketinin gerek temsilcileri olduklarn gstererek, serbeste kullanlmak zere okuyucularmza sundular. Kendilerine sonsuz teekkrlerimizi sunarz. Bununla birlikte bu kitapkta varolan hatalarn tm bana aittir.

PHP Destei veren sitelerle ilgili not:


Bu kitapkta bir ka sayfa ilerledikten sonra, yapmak isteyeceiniz ilk ilerden birinin cretli veya cretsiz PHP destei veren bir Web sitesi evsahibi (Hosting) firmas aramak olacan tahmin ediyorum. Bu amala aramalarnza http://www.pageresource.com/putweb/index.html adresinden balamanz salk veririm. Eer doruca byle bir evsahibi firmaya ulamak isterseniz http://www.mycgiserver.com adresine gidebilirsiniz. Kitapn sonunda eitli PHP kaynaklarnn bir listesini de bulabilirsiniz.

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:6

PHP'ye Giri
C/C++, Pascal, hatta Visual Basic bilen kiiler iin PHP renmek hemen hemen bir leden sonray ayrmak suretiyle yaplabilecek bir itir. Bu dillere aina olmayanlar ise belki bir ka leden sonralarn ayrmak zorunda kalabilirler! PHP, bir Script dilidir; yani kodlar dz yaz dosyalar halinde kaydedilir ve kullanlaca ortamda bir yorumlayc tarafndan yorumlanr. Bu, PHP ile yazacanz programlar, derlemek yani ortaya bir EXE veya altrlabilir baka bir dosya kartmaya gerek olmad anlamna gelir. Fakat PHP Script'lerinizi altrabilmek iin bu dili bilen bir programa ihtiyacnz vardr. Bu programn tek bana (komut istemci penceresinde veya terminal ekrannda) almas mmkn olduu gibi, Web Server tarafndan da altrlabilir olmas gerekir. Baka bir deyile Web Sunucu programnn PHP anlar hale getirilmesini salamak zorundayz. PHP yorumcusu, bugn Zend-ekirdei ad verilen bir Scripting teknolojine dayal olarak, Zeev Suraski ile Andi Gutmans tarafndan sfrdan, tamamen yeniden yazlm bulunuyor. Zend, tpk Windows Script Host ve mesela Visual Basic for Applications (VBA) gibi, iletim sistemine kendisi ile uyumlu Script dilleriyle yazlm programlar altrma imkan kazandran bir teknolojidir (Zend konusunda ek bilgiyi Internet'te www.zend.com adresinde bulabilirsiniz.) Bugn bu dilin resm ad "PHP: Hypertext Preprocessor" (Hipermetin n-ilemcisi) olarak deitirildi, ve eitli Web Server'larn PHP dili anlamas iin gerekli yorumlayclar yeniden retlidi. 20 Ocak 200'de srail'de PHP'nin ilk uluslararas konferans yapld ve 4'nc srmnn betas ortaya kondu.

Peki ama PHP nedir?


PHP ile artk oturup her trl ilevsellii sahip programlar yazabilirsiniz; yani PHP bal bana uygulama alanlar bulabilecek dzeye ulamtr. Baka bir deyile PHP ile oyun programndan tutun veritaban ynetimine kadar hemen her trl program yazabilirsiniz. Bizi bu kitapkta ilgilendiren tarafyla PHP, Web Sunucu'ya bir takm iler yaptrmak iin program yazma dilidir. Tpk CGI/Perl veya ASP ya da ColdFusion, Java (Javascript deil!) gibi! PHP kodlar, oluturacamz HTML sayfalarnda HTML etiketlerinin arasnda kendi zel ayrac iinde yazlr: <html> <?PHP echo ("Merhaba Dnya!"); ?> </html> ster kiisel bilgisayarmzda, ister gerek Internet ortamnda olsun, bir Web Sunucu, ziyaretinin (Internet istemci programnn, Browser'n) talep ettii dosya adnn uzatmas olarak ".PHP," ".PHP2," ".PHP3," veya ".PHP4" grnce, kendine kendine, "Yine bana i kt!" diye dnr! nk Web Server, uzatmas ".htm" veya ".html" olan bir dosyay, kendi sabit disklerinden birinde bulur ve zahmetsizce, ziyaretinin bilgisayarna gnderir. Fakat, ".asp," .pl," ".cfm" gibi, ".PHP" uzatmas, Web Sunucu'ya bu sayfay olduu gibi, alp ziyaretinin Browser'na gndermek yerine, nce PHP yorumlaycy ararak, ona teslim etmesi gerektiini bildirir. PHP yorumlaycs (yani Windows ortamnda PHP.exe veya 4'nc srmle gelen PHP4isapi.dll, Unix ve trevlerinde altrlabilir PHP dosyas), kendisine teslim edilen bu belgede nce "<?PHP" ve "?>" ayralar arasndaki PHP

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:7

kodlarn seerek alr ve gerei ne ise onu yapar. Bu ayralarn iinde kalan kodlar, bizim yaplmasn istediimiz ilemin komutlardr. HTML ile yetinmeyip, PHP kullanmamzn sebebi, bu komutlarn HTML'in yapamayaca eyleri yapmasdr. HTML'in yapamayaca eylerin banda, Web Sunucusu'nda yaplacak iler vardr. Szgelimi HTML etiketlerini kullanarak, Web Sunucusu'ndaki bir veritaban dosyasn ap, iindeki verileri okuyamayz. HTML yoluyla Web Sunucusu'nun sabit disklerindeki dz yaz dosyalarn da okuyamayz ve bu disklere dosya yazamayz. HTML etiketleri ile Web ziyaretimizden bilgi edinebilir ve bunlar Sunucu'ya yollayabiliriz; ama o kadar! Bu bilgileri ie yarar ekle sokmak iin bize Server'da alan bir program gerekir. Server'da alan program, EXE ve DLL veya JSP (Java Server Pages) gibi bir "gerek program"; veya Perl, ASP ve PHP gibi Script diliyle yazlm bir program olabilir. (Gerek programlar yazanlar, tabi, sizin Script diliyle yazlm programlara "program" demenize ok kzarlar! Ama bu Script pogramlarnn program olmasn hi engellemez.) Ne diyorduk? Web Sunucu, ".PHP" uzatmasn grnce telaa kaplr, bu dosyay PHP yorumlaycsna verir ve o da "<?PHP" ve "?>" ayralar iindeki kodlar icra eder, demitik. Bu icraatn sonunda ortaya kan rn eer ziyaretiye gnderilecekse, HTML etiketleri iinde gnderilir; yani ziyareti asla PHP kodlarn gremez. Kimi zaman PHP programmzn almas sonucu ortaya ziyaretiye gnderilecek bir rn kmaz; elde edilen sonu ya baka bir programa (rnein elektronik ileti gnderen bir Sendmail progamna) hammadde olarak verilir, ya da Server'da sabit diske yazlr. Fakat her durumda, Web ziyaretimiz bizim PHP kodlarmz gremez; bu Web sayfalarmzda PHP kodu kullanmamz halinde, sayfalarmzn Browser tarafndan tannmas veya tannmamas gibi bir durumun ortaya kmamas demektir. Ziyareti ne tr Browser kullanrsa kullansn, kendisine Sunucu'dan daima saf HTML kodu gelecei iin, sayfalarmz rahata grebilecektir. Tabi bir nokta var: Sayfalarmzda herhangi bir Browser'n arzal yorumlad veya hi yorumlayamad HTML etiketleri bulunabilir; ya da sz gelimi ziyaretiye giden HTML'in iinde Browser'da altrlacak olan baka Script kodlar bulunabilir; ve Browser bu kodlar anlamayabilir. rnein, HTML sayfanzda VBScript kodlar kullanm iseniz, Netscape ile sitenize balanm olan kiiler bu kodun oluturmasn istediiniz etkiyi gremeyeceklerdir; nk Netscape VBScript anlamaz! PHP ile yazacanz Web programlarnn (eski deyimiyle "sayfalarn") oluturaca HTML belgesinin Browser trleri ve srmleri ile uyarlln salamak yine Web programcs olarak sizin sorumluluunuzdadr. zetlersek, PHP bir CGI programlama dilidir; bu dille, Web Sunucusu ile Web ziyaretisi arasndaki buluma noktas olan CGI'da bilgi alverii yaplabilir; Sunucu'da bulunan baka programlar altrlabilir ve bylece Web sayfalarmza HTML'in snrlamalarnn tesinde hareket ve ziyareti ile etkileme olana kazandrlabilir. Sanrm iyi bir Web programcs olarak u anda ekrana "Merhaba Dnya!" yazdrmak iin sabrszlanyorsunuz. Ama bunun iin, PHP sayfanz ya PHP-uyumlu bir Web Sunucusu'ndaki Web sitenize yklemek, ya da kiisel bilgisayarnzdaki kiiel Web Sunucusu'na PHP retmek zorundasnz. Bu ikinci yntemi kuvvetle tavsiye ederim; nk yazacanz PHP programlarn gerek Internet Sunucusunda snamak, bazen arzu edilmeyen durumlara yol aabilir. Oysa kiinin bu denemeleri, evinde ve iyerinde kendi bilgisayarnda yapmas, ou zaman daha az baars ve gzyana yol aar! En azndan, PHP hatalarnz ve gzyalarnz sizden baka gren olmaz!

PHP ve Veritaban
Kiisel bilgisayarnzdaki kiisel Web sunucusuna PHP retme ilemine gemeden nce, hemen hemen PHP'nin ikiz kardei saylan MySQL'den ve onun rakibi PostgreSQL'den ksaca sz edelim.

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:8

PHP'nin varlk sebeplerinin banda, ticar Unix ve Microsoft Windows iletim sistemlerinden ayr, ticar olmayan Ak Sistem ortamlarnda alan bir Script dili ile bu dille kullanlabilecek yine Ak Sistem rn bir veritaban eriim ve ynetim aracna sahip olmak gelir. Perl, geri PHP'den ok nce Ak Sistem rn olarak, isteyen Web Programcs'nn cretsiz edinecei bir CGI programlama dili olarak Web'in ilk gnnden beri Web Programcsnn emrindeydi. Ama Perl, metin dosyalarndan yaz ekmek ve bunlar biimlendirerek rapor haline getirmek amacyla gelitirilen bir dil olduu iin, zellikle veritabanna dayal ilemlerde programcya ok glk kartyordu. ASP ise (ASP destei salayan ve cretsiz Web sitesi veren firmalarn giderek artmasna ve veritaban konusunda hem kolaylk, hem de byk bir etkinlik salamasna ramen) ounlukla cretli Web sitesi aldmz ticar amal evsahibi (Hosting) firmalarnn salad bir teknoloji olarak grld. PHP, tasarmclarnn MySQL ve PostgreSQL teknolojilerini gelitiren kurum ve firmalarla yapt yakn ibirlii sonucu ikinci srmnden itibaren veri-ynlendirmeli Web uygulamas alannda nemli bir ara olarak belirdi. Dolaysyla, PHP kurulumu dendii zaman, kendiliinden, MySQL kurulumu da kastedilmi olur. imdi PostgreSQL da ekleyebiliriz. PHP, bir dildir; MySQL ve PostgreSQL ise bir demet srcdr. PHP ile, Web Server'a sayfanz Internet ziyaretisine gndermeden nce bir takm komutlar icra etmesini, bir takm veri dosyalarn ap iindeki bilgileri alp bunlar HTML kodlaryla bezeyip, Browser'a bildiimiz klasik HTML sayfas olarak gndermesi talimatn veririz. MySQL ve PostgreSQL ise, Windows sistemlerinde Denetim Masas'nda grdnz ODBC Veri Kayna Ynetmeni adl ara gibi, bir veritaban sunucusu, yani Database Server pprogramlardr. Yakn zamana kadar bu iki veritaban ynetim arac arasnda fazla bir ekime yoktu. Ancak imdi zellikle Linux kullanclar topluluklarnda iki program arasnda verimlilik testleri yaplyor; hangisinin daha iyi oldununa ilikin youn bir tartma sryor. PHPBuilder.com uzmanlar, yaptklar bir ok denemede, MySQL'in daha hzl ve daha etkin altklar sonucuna varyorlar. (Bu konuda daha geni bilgi edinmek iin Internet'te www://PHPbuilder.com/columns/tim20000705.PHP3 adresine bakabilirsiniz.) MySQL, bir kullanc lisans 200 Dolar olan ticar bir program iken 2000 yl ortalarnda GPL (GNU General Public License/GNU Kamusal Lisans) uygulamasna gemi ve cretsiz datlr hale gelmi bulunuyor. Buna gre MySQL'i bir ticar uygulamann iinde motor olarak kullanacaksanz reteci firmaya lisans creti demeniz gerekir; bunun dndaki uygulamalar iin program Internet'ten indirerek kullanabilirsiniz. PHP iin MySQL'e gerek yoktur. PHP, bir NT veya Win9x tabanl Web Server'da altrlyorsa, Microsoft'un ODBC srcleri ile alabilir; ve ODBC'nin okuduu btn veritabanlarndan veri ekebilir. (ODBC'nin Unix-Linux srm de vardr.) Ayrca PHP iin Adabas, dBase, Empress, FilePro, Informix, InterBase, mSQL, Oracle, Solid, Sybase, Velocis ve bir ok Unix veritaban yneticisi iin gelitirilmi add-on (sonradan eklenen) modller vardr. PHP, bir ok LDAP istemci program iin yazlm API'lere de sahiptir. PHP ile IMAP, SMTP gibi Internet elektronik mektup protokollerini kullanmak da mmkndr. Biz bu kitapkta rneklerimizde ve uygulamalarmzda MySQL'den yararlanacaz. PHPMySQL ikilisini kiisel bilgisayarmza kurmak iin nce gerekli programlar Internet'ten indirmemiz gerekir. Bunun iin u adreslerden yararlanabilirsiniz: http://www.PHP.net/downloads.PHP http://www.mysql.com/downloads/index.html

PHP ve Web Sunucusu


Bizim amzdan PHP, bir Web sunucu programdr; kurulaca sistemdeki Web sunucusu ile uyumlu olmas gerekir. 4'nc srm itibariyle, PHP btn Unix-trevi sistemler (rnein Linux) ve Microsoft Windows sistemleri ile uyumludur. Birlikte alabilecei Web sunucu programlar arasnda Apache, IIS, FHTTP, Omni HTTPd, Xitami ve Windows 95/98

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:9

iin PWS (Personal Web Server) vardr. Gerek Internet ortamnda sunucu programlara PHP yetenei kazandrma ilemi, Web Programcs olarak bizi ilgilendirmez; bizim iin Internet sitemize evsahiplii yapan Hosting firmasnn PHP destei verip vermediini bilmek yeter. Fakat tasarmlarmz snayabilmek iin kendi bilgisayarmza bir kiisel Web Server kurmak ve bu program PHP-uyumlu hale getirmek gerekir. Burada sadece iki rnek ele alacaz: Linux iin Apache sunucu program ve MS-Windows iin PWS. Bu iki programdan hangisi sizin sisteminize uygunsa onu kendi bilgisayarnza kuracanz varsayarak, imdi PHP ve MySQL kurulumu ile uraabiliriz.

Unix/Linux Sistemleri
Kurma ilemine Unix ortamndan balayalm. Burada Unix sistemi dediimiz zaman Unix'in tekrar biliim haritasnda yerini almasn salayan Linux'u kastediyorum. Bunun iin nce http://www.PHP.net/ adresini ziyaret etmemiz gerekiyor. Eer PHP uzman olacaksanz, buras sizin ikinci eviniz olabilir. Downloads kprsn tklayarak alacak sayfada Unix/Linux iin kaynak kodunu bilgisayarnza aktarn. PHP'yi kuracanz bilgisayarda bir Web sunucu program yoksa, http://www.apache.org/dist/ adresinden apache_1.3.12.tar.gz (veya daha ileri) dosyasn da indirmeniz gerekir. Unix-Linux sistemleri iin bilgisayarnzda "gcc C derleyici" bulunmas gerekir. Linux sisteminizde rnein Red Hat Linux srm 5.2 gibi eski bir gcc derleyici varsa, gcc srm 2.8.1'i Internet'ten bulmanz gerekir.

Linux'ta program derlediniz mi?


Daha nce hi Linux program derlemediyseniz, nce baz kavramlar akla kavuturalm: tar: (tape archiver) birden fazla dosyay tek dosya haline getirir ve sktrr. Teyplere yedekleme amacyla gelitirilmitir. tar dosyalar sktrlmsa uzatmas .gz, deilse .tar olur. gcc: GNU'nun C derleyicisidir. nsan tarafndan okunabilen kaynak kodlarn makina tarafndan okunabilen nesne (object) dosyalarna dntrr. C programlama diliyle yazlm kaynak kodlar ieren dosyalarn uzantn .c olur. Nesne dosyalarnn adnn uzants genellikle .o olur. Derleyici balk (header, uzants .h olan) dosyalarn bulamazsa derleme hatas verir. make: henz derlenmemi kaynak dosyalarn derleyen yardmc bir programdr. make, derleme talimatlarn Makefile adl bir dosyadan alr. ld: GNU'nun balayc (linker) programdr. Nesne dosyalarn ve kitaplk denen dosyalar birbirine balayarak ortaya altrlabilir bir program dosyas kartr. Genellikle Makefile'n iinde linker'n altrlmas talimat bulunur ve sizin bu program kullanmanz gerekmez. ldconfig : paylalan kitaplk dosyalarn (shared librari) arar. Bu dosyalardan birden fazla program tarafndan paylalr, ve dosya adlarnda .so bulunur. ./configure : C derleyecisi ve header dosyalarnn nerede olduunu aratrr, ve vard sonuca gre Makefiles dosyasnda deiiklik yapar. PHP, bir Unix/Linux sisteminde mstakil yorumlayc veya Apache Web sunucusunun bir modl olarak almak zere derlenebilir. PHP, mstakil yorumlayc olarak kurulduunda, Web sunucusu, her ihtiya halinde PHP yorumlaycsnn bir rneini altrr. Bu, bir sre sonra Web sunucusunun bulunduu iletim sisteminin yknn artmasna ve ileyiinde yavalamaya yol aabilir. Oysa PHP, sunucunun bir modl olarak kurulduunda, bu saknca ortaya kmaz. (Bu zellii ile PHP, klasik CGI/Perl'n alma tarzndan ayrlr, ASP'nin ve ColdFusion'n alma tarzna yaklar.) Bununla birlikte kt niyetle veya beceriksizce yazlm PHP programlar modl olarak kurulmu PHP'yi kertirlerse, Web sunucusunu da kertmi olurlar; oysa mstakil PHP yorumlayc kerse, Web sunucusuna bir ey olmaz. Burada yapacamz kurulum ilemi srasnda Linux kurulu olan bilgisayarmza Apache Web sunucu programn, bu sunucunun kullanaca gvenli Socket katmann salayacak

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:10

Mod_SSL programn, bu programn gerektirdii OpenSSL aracn, MySQL veritaban sunucusunu ve PHP Scripting dilini kurmu olacaz. PHP'yi Linux ortamnda Apache Web sunucusuna modl olarak kurmak iin srasyla u ilemleri yapmamz gerekir (Sisteminizde gzip veya gunzip ile gcc and GNU make kurulu olduunu varsayyorum): 1. Sisteminizi root olarak balatn ve sktrlm olarak alacanz PHP ve Apache dosyalarn geni yer olan geici bir dizinde an, ve o dizine gidin. Szgelimi, Apache'nin tar-zip olarak sktrlm kaynak dosyalarnn tmp adl dizinde olduunu varsayalm: # cd /tmp # gunzip c apache_1.3.12.tar.gz | tar xf Burada, indirdiiniz Apache srm farkl ise onun adn yazacaksnz. imdi Apache'yi atnz klasre gidin ve buradaki configure dosyasn altrn: # cd apache_1.3.12 # ./configure --prefix=/usr/local/apache Buradaki rnekte Apache'yi /usr/local/apache dizinine koyduumuza dikkat edin. Bu dizini, bir ok kurulumun varsaym olarak arayaca dizin olduu iin tercih ediyoruz. Ama isterseniz siz Apache'yi baka dizine de kurabilirsiniz. 2. Sra MySQL veritaban sunucusunda. Linux'ta root oturumunda iken sktrlm dosyalar indirdiiniz geici dizine gein ve dosyalar an; sonra oluturulan dizine giderek, configure komutu ile veritaban srcsn yaplandrn: # 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 dosyalarn oluturarak, ve sisteme ykleyelim: # make # make install MySQL'in kullanm izinlerini belirlememiz gerekir. Aadaki komutlar yazarken "parola" kelimesi yerine vermek istediiniz parola kelimesini yazmanz gerekir: # scripts/mysql_install_db # cd /usr/local/mysql/bin # ./safe_mysqld & # ./mysqladmin -u root password 'parola' Kurulum ileminin baarl olup olmadn snamak iin, kurulum srasnda oluturlan rnek veritaban dosyalarn bulunup bulunmadn soruturabilir ve kendimiz yeni bir veritaban oluturabiliriz. Bunun iin u komutu yazalm: # BINDIR/mysqlshow -p # mysql -u root -p Sistem "Enter password:" karln verdiinde, yukarda kullanm izinlerini belirlerken yazdnz parolay yazn; MySQL sunucusu alacak ve size kullanc izinlerinin bulunduu "mysql" ve snama amacyla oluturulan "test" adl iki veritabannn bulunduunu bildirecektir. imdi kendi veritabanmz oluturalm. MySQL sunucu komut istemcisi satrna unu yazn (Bilgisayarn verecei karlklardan ayrt etmek iin kendi yazdklarmz koyu renkle gsteriyoruz): mysql> create database deneme;

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:11

Sunucu "Query OK, 1 row affected (0.00 sec)" eklinde karlk verecektir. imdi bu veritabann seerek iinde deneme adl ve iinde "no" ve "isim" adl iki alan bulunan bir tablo oluturalm (MySQL komutlar byk harf-kk harf ayrm yapmaz; komutlardan sonra noktal virgl konur). Burada koyu renkle gsterilen satrlar ve iaretler 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) Bakalm tablomuz baarl ekilde olumu 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 gzel! Hem MySQL'i kurmu, hem de ilk tablomuzu oluturmu bulunuyoruz. MySQL komutlarn daha ayrntl renebilmek iin MySQL'in http://www.mysql.com adresindeki sitesini ziyaret edebilirsiniz. imdilik MySQL'den kalm ve kuruluma devam edelim. 3. Sra geldi PHP'ye! PHP kaynak dosyasnn bulunduu geici dizine gein, ve dosyalar an; sonra alan dosyalarn bulunduu dizine gidin: # gunzip -c PHP-4.0.1pl2.tar.gz | tar xf # cd PHP-4.0.1pl2 imdi configure dosyasn altracaz; bu komutun bir ok opsiyonu vardr; bunlarn tmn grmek istiyorsanz, "configure --help" komutunu verebilirsiniz. Biz sadece PHP'ye MySQL ve Apache opsiyonlarn eklemekle yetineceiz: # ./configure --with-mysql=/usr/local/mysql \ --with-xml \ --with-apache=../apache_1.3.12 \ --enable-track-vars Oluan binary dosyalarn program dosyasna evirerek, ykleyelim: # make # make install Oluan ini dosyasn lib dizinine koplayalm: # cp PHP.ini-dist /usr/local/lib/PHP.ini PHP.ini dosyasndaki bir ok zellii deitirerek, PHP'nin alma tarzn ayarlayabilirsiniz; rnein u satr ekleyerek, PHP'nin azam alma sresini arttrabilirsiniz: max_execution_time = 60;

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:12

Gvenli socket ve Internet Eriimi Katman


Kuracanz Web sunucusu gerek Internet'e alacaksa, sisteminize Mod_SSL yeteneini kazandrmanz gerekir. Bu sistemin rsaref-2.0 adnda bir eki vardr; ancak Amerika dnda kurulan Web Sunucularda rsaref-2.0 ekinin kurulmas gerekmez. Apache sunucusunu sadece PHP dosyalarnz snamak amacyla kendi bilgisayarnza kuruyorsanz, Mod_SSL kurmak art deildir. Bu ilemi yapmak zorunda iseniz, nce http://www.openssl.org/ adresinden openssl0.9.1c.tar.gz adl dosyay, http://www.modssl.org/ adresinden de mod_ssl-2.6.51.3.12.tar.gz dosyasn indirin. Sonra srasyla u ilemleri 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 modln Apache ile kullanlacak ekilde kuralm: # 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 dier opsiyonlar ekleyebilirler..] # make Bu noktada sistem binary dosyalarn oluturulduunu ve kurulumun gerekli gvenlik sertifikalarn istediini bildirecektir. Sertifika oluturma konusunda fazla bilgi iin, http://www.modssl.org/docs/2.6/ssl_faq.html#ToC25 adresine bakabilirsiniz.) Diyelim ki sadece ISS'in yeri, firma ad ve bir iki dier bilgiden oluan zel bir sertifika oluturmakla yetineceksiniz. Bunun iin u komutu girin ve sistemin soraca sorulara cevap verin: # make certificate TYPE=custom imdi Apache'yi yeniden kurabiliriz: # make install

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:13

Herey yolunda gittiyse, sistem "You now have successfully built and installed the Apache 1.3 HTTP server," eklinde balayan uzun bir mesaj verecektir. Bu durumda Apache sunucusu u komutla balatlabilir: /usr/local/apache/bin/apachectl start Apache'yi gvenli iletiim katman destei ile balatmak istiyorsanz u komutu yazn: /usr/local/apache/bin/apachectl startssl Bu ilemleri baaryla bitirmi olsak bile sistemin altn kontrol etmemiz gerekir. nce Apache'nin altndan emin olalm. Bunun iin nce Apache'nin yaplandrlmasna PHP'nun eklendiinden emin olmamz gerekir. Kurulumu buradaki gibi yapt iseniz /usr/local/apache/conf dizininde bulunan httpd.conf dosyasn an; ve "addtype for PHP4" satrlarn nndeki yorum (#) iaretlerini kaldrn; yani bu satr yorum olmaktan kp yaplandrma komutu olsun: #AddType application/x-httpd-PHP .PHP #AddType application/x-httpd-PHP-source .PHPs eklindeki satrlar u ekle getirin: AddType application/x-httpd-PHP .PHP AddType application/x-httpd-PHP-source .PHPs imdi Apache sunucusunu altrabilir ve PHP desteinin bulunup bulunmadn snayabilirsiniz: # cd /usr/local/apache/bin # ./apachectl configtest Syntax OK # ./apachectl start ./apachectl start: httpd started "httpd started" ifadesi bize Apache'nin altn gsteriyor. imdi Browser'nz an ve HTTP sunucusu olarak Apache'nin adresini yazn. Bu, bilgisayarnzn Domain addr; Apache'nin kurulu olduu bilgisayarn IP numarasn da yazabilirsiniz. imdi, bir dzyaz dosyasna unlar yazn: <? PHPinfo(); ?> Dosyay PHP.PHP adyla Apache'nin Web sunucu iin kk dizin sayd klasre kaydedin. Browser'nzn URL adresi alanna sunucu adyla birlikte dosyann adn yazn. Aldnz sonu, PHP'nin sistem ve sunucu hakknda ayrntl raporu ise, kendi kendinizi kutlayabilirsiniz: hem Apache sunucu, hem de PHP alyor!

Windows-PWS ve IIS
PHP'yi Windows 95/98/NT/2000 iletim sistemlerinden biri ile alan bilgisayara kurmak iin nce http://www.PHP.org adresinden PHP-4.0.1pl2-Win32.zip veya daha ileri srmdeki zip dosyasn almamz gerekir. Bu dosyay an ve iindekileri szgelimi c:\PHP dizinine kopyalayn. (Dizini olutururken "PHP," "PHP" veya "PHP" yazdnza dikkat edin!) Daha nce Wihdows sistemine PHP 3.x kurmu olanlar PHP 4.0'n kurulumumu biraz farkl bulacaklardr. Bu, daha nce PHP kiisel ve Internet amal Web sunucuda (PWS veya IIS) mstakil bir CGI program olarak alrken imdi buna ek olarak (tpk ASP gibi) DLL yoluyla, bir ISAPI modl olarak almasnn salanm olmasndan kaynaklanyor. PHP'yi Windows 95 veya NT4.0 sisteminde kurulu bir PWS veya IIS iin kuracaksnz, nce baz nlemler almanz gerekiyor. NT 4.0 sistemlerinde IIS 4.0'n bulunduu Option Pack'in kurulmas art. Windows 95 sistemlerinde ise nce DCOM bileenlerinin gnceletirilmesi gerekiyor. Bu dosyay,

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:14

http://download.microsoft.com/msdownload/dcom/95/x86/en/dcom95.exe adresinden alabilirsiniz. PHP'yi mstakil alan CGI program olarak kullanmay dnseniz bile daha nceki srmlerinden farkl olarak baz DLL dosyalarnn Windows dizininde sistem alt-dizinine kopyalanmas gerekir. Atnz Zip dosyasndan kan ve C:\PHP dizinine kopyaladnz dosyalar arasnda 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 dosyasnn kullanlmakta olduu 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 destei kazandrmak iin, nce yukardaki gibi DLL dosyalarn gerekli yere kopyalayn. Atnz Zip dosyasndan km olan PHP.ini-dist isimli dz yaz dosyasn Notepad ile an ve "extension_dir=" satrn bularak, karsndaki "./" yazsn silip yerine PHP dosyalarn kopyaladnz dizinin adn (rnein C:\PHP) yazn. PHP dizinin adn doru yazdnz kontrol etmekte daima yarar vardr! Sonra ";browscap =" satrn bulun ve nndeki noktal virgl kaldrarak karsndaki "extra/browscap.ini" kelimelerini c:\Winnt\browscap.ini olarak deitirin. Bu dosyay, PHP.ini adyla Winnt dizinine kaydedin. (Windows dizininin Winnt adn tadn varsayyorum. Sizin Windows dizininiz baka ise, gerekli dzeltmeyi yapmanz gerekir.)

Browser Yetenek Dosyas: Browscap.ini


Windows sistemine kurulu bir Web Sunucu programna (PWS, IIS veya Apache Win32) PHP yetenei kazandrabilmek iin PHP'nin talep sahibi Browser'n yeteneklerini bir dosyadan okumas gerekir. Bu dosyann ad browscap.ini dir. Internet'te http://asptracker.com/browscap.zip dosyasn alarak an ve kacak "browscap.txt" dosyasnn adn "browscap.ini" olarak deitirerek Windows/Winnt klasrne kopyalayn. Internet Services Manager' an; bu ara, NT 4.0'te Start mensnde Programs/Option Pack'te, 2000'de ise Control Panel/Administrative Tools'dadr. Alacak pencerede muhtemelen Default Web Server adn tayan Web sunucusunun adn sa tklayn: Alan listede Properties maddesini; alan kutuda Home Directory sekmesini sein; Configuration dmesini tklayn ve yeni bir Application Mappings satr eklemek zere, Executable kutusuna PHP4isapi.dll dosyasnn tam yolunu ve adn (rnein C:\PHP\ PHP4isapi.dll); Extension kutusuna ise .PHP yazn (IIS 4.0'te Method exclusions kutusunu bo brakn) ve Script engine kutusuna iaret koyun. ISAPI Filters sekmesini sein. Add dmesini tklayarak yeni bir ISAPI filtresi kayd yapn. Alacak kutuda filtre ad olarak PHP, yol olarak da PHP4isapi.dll dosyasnn bulunduu dizinin yolunu (rnein C:\PHP\ PHP4isapi.dll) yazn. IIS'i tamamen durdurun; ama bunun iin sadece Internet Services Manager'daki Stop dmesini tklamak yetmez; komut istemci (MSDOS Prompt) penceresinde net stop iisadmin yazn. Windows, bu servisin bal olduu dier baz hizmetlerin de durdurulacan bildirince "Y" yazn ve Enter'a basn. imdi IIS'i tekrar balatmak iin ayn pencerede net start w3svc yazn. Artk IIS'iniz PHP anlar hale gelmi olmal. Bunu, hemen snayalm. Notepad veya bir baka dzyaz programyla unlar yazn: <? PHPinfo(); ?> Dosyay PHP.PHP adyla IIS'in kk dizin sayd klasre kaydedin. Browser'nzn URL adresi alanna sunucu adyla birlikte dosyann adn yazn. Bravo! te yeni bir dil renmi Web sunucuya sahip oldunuz. PWS 4.0 Windows'un 95/98/SE/Me trlerine kiisel Web sunucu program olarak Personal Web Server (PWS 4.0) kurulmaldr. PHP Zip dosyasndan kacak DLL'leri Windows dizininde System klasrne kopyaladktan sonra, Zip dosyasndan km olan PHP.ini-dist isimli

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:15

dzyaz dosyasn Notepad ile an ve "extension_dir=" satrn bularak, karsndaki "./" yazsn silip yerine PHP dosyalarn kopyaladnz dizinin adn (rnein C:\PHP) yazn. PHP dizinin adn doru yazdnz kontrol edin! Sonra ";browscap =" satrn bulun ve nndeki noktal virgl kaldrarak karsndaki "extra/browscap.ini" kelimelerini c:\Windows\browscap.ini olarak deitirin. Bu dosyay, PHP.ini adyla Windows dizinine kaydedin. Daha nceki sayfalarda greceiniz ekilde Browscap.ini dosyasnn dosyasn Windows dizinine kopyalam olmanz gerekir. (Windows dizininin Windows adn tadn varsayyorum. Sizin Windows dizininiz baka ise, gerekli dzeltmeyi yapabilirsiniz.) imdi, atnz PHP Zip dosyasnn iinden kan PWS-PHP4.reg adl dosyay bir dzyaz programyla, rnein Notepad ile an. ".PHP"="[PUT PATH HERE]\\PHP4isapi.dll" yazl satr PHP dosyalarn koyduunuz dizine gre, rnein yle deitirin: ".PHP" = "C:\\PHP\\PHP4isapi.dll" Burada ok dikkat etmeniz gereken nokta, ters-bl iaretlerinin baka yerlerde normal olarak yazdmz gibi bir adet deil, iki adet olmasdr. Dosyay kaydettikten sonra, iki kere tklayn ve Windows'un Registry'de deiiklik yapmay isteyip, istemediinize ilikin sorusuna Evet yantn verin. Tamaam! Sizin de PHP bilen bir PWS'iniz oldu. Ama bunu bir snayalm. Ve bunu bir Merhaba Dnya program ile yapalm ki, gelenek bozulmasn! Dzyaz programnzla u metni merhaba.PHP adyla PWS'in Web iin kk dizin sayd (muhtemelen C:\Inetpub\wwwroot) klasre kaydedin: MERHABA.PHP <html> <?PHP echo ("Merhaba Dnya!"); ?> </html> Sonra Personal Web Manager kutusunda, Ana balkl blmde, Yaymlama ksmndaki "http://" diye balayan ve kiisel Web sunucunuzun ad ile devam eden kpry tklayn. Varsaylan Browser'nz, kiisel Web sunucunuzun ana sayfasn aacaktr. Browser'n URL adres blmne, merhaba.PHP yazn ve klavyede Enter tuuna basn. Eer gerekten PWS'iniz, PHP renmise, size ve dnyaya merhaba diyecektir.

Windows'da Apache!
NT sisteminizde ISS deil de Apache for Win 32 Web Server programn altryorsanz, srmne gre httpd.conf veya srm.conf dosyasna u ekleri yapmanz gerekir: ScriptAlias /PHP3/"c:/path-to-PHP-dir/" AddType application/x-httpd-PHP3 .PHP3 Action application/x-httpd-PHP3"/PHP3/PHP.exe"

Windows'da MySQL
PHP, Windows ortamnda, Windows'un ODBC srclerini kullanarak, srcs bulunan btn veritabanlarna ulaabilir. Ancak Windows ortamnda gelitirseniz bile, Web sitenizi, Unix tabanl ve ODBC-uyumlu olmayan bir sunucuya gnderebilirsiniz. Bu durumda sayfalarnzda kullanacanz verileri muhtemelen MySQL araclyla veritabanndan ekeceksiniz demektir. Bu yzden Windows sisteminize MySQL kurmak ve veritabanlarn bu arala gelitirmeniz yerinde olur. Unix/Linux ortamnda cretsiz olmakla birlikte MySQL, Windows iin bedeli paylaml (shareware) olarak edinilebilir. Benioku dosyasnda belirtildiine gre, program eitim amacyla ve 30 gn amamak kaydyla kullanyorsanz, cret denmesi gerekmiyor. Dier durumlarda TCX firmasnn Internet'te http://www.tcx.se adresindeki sitesindeki formlar doldurarak lisans alnmas gerekiyor. Bu program, MySQL'in http://www.mysql.com/downloads/ adresinden edinebilirsiniz. Bu

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:16

adresteki mysql-shareware-3.22.34-win.zip dosyasn alarak, bir geici dizinde an. (Sisteminiz gerek Internet sunucusu olarak ticar amal hizmet salayacaksa u dosyay almanz gerekir: http://www.mysql.com/Downloads/MySQL-3.23/mysql-3.23.21-winsrc.zip) Shareware srmn ieren dosyay atnzda ortaya kacak setup.exe program MySQL'i kuracaktr. MySQL Server'n Windows'da da tpk Linux'ta olduu gibi altrlmas ve durdurulmas gerekir. MySQL'in paylam srmn kullanmak iin Windows sistemlerinde mysqldshareware.exe programn altrmanz gerekir. DOS komut istemcisini an ve "C:/mysql/bin" dizinine giderek, srasyla u komutlar verin: mysqld-shareware mysqlshow mysqlshow -u root mysql mysqladmin version status proc imdi MySQL server alyor ve biraz sonra PHP yoluyla kiisel Web Server'nza hizmet vermeye hazr demektir. Bu komutlar icra ettiiniz srada bir hata mesaj ile karalarsanz, MySQL'in kuruluunda hata yapm olabilirsiniz. DOS ekrarnda test ve MySQLl veri tabanlarnn varln ve hizmete girdiini gsteren mesajlar grrseniz, MySQL gzelce alyor demektir. Bunu bir de Browser ile ve PHP yoluyla snayalm: Yukarda IIS'e PHP destei kazandrma almalar srasnda oluturmad iseniz, dz yaz programnzda u tek satr yazn; php.php adyla, kiisel Web'inizin kk dizinine kaydedin: <? PHPinfo(); ?> Browser'nz an; URL hanesine rnein http://localhost/PHP.PHP3 yazn. Alacak sayfada iki eye dikkat edin: MySQL ve ODBC blmleri var m? MySQL blm varsa; kendinizi yeniden kutlayn! ODBC blm yoksa, muhtemelen sisteminizde Microsoft'un Open Database Connectivity (Ak Veriban Balants) srcleri kurulu deil demektir. (Windows'da Denetim Masas'nda ODBC simgesini grmyorsanz, MS'un sitesinden gerekli kur programn indirmeniz gerekebilir. Linux'ta ise MyODBC program ile bu imkan kazanabilirsiniz.) Bir kere daha tekrar etmek gerekirse, PHP ile veritabanna dayanan sayfalar yapmak iin mutlaka ve sadece MySQL srclerini kullanmak gerekmez. Bunun yerine MS'un ODBC srclerini kullanabilirsiniz. Ancak Web sitenize evsahiplii yapan firmann size ODBC destei verip vermediini renmeniz gerekir. Aslnda ayn ekilde, evsahibi firmann MySQL destei verip vermediini de renmek zorundasnz. (PHP ile MS-ODBC srclerini kullanabilmek iin Andrew Stopford'un ASPToday sitesindeki http://www.asptoday.com/articles/20000202.htm yazsnda geni bilgi bulabilirsiniz.) Gemi olsun. Bana sorarsanz, PHP ile dolu yeni bir hayata balamak iin en nemli adm attnz. Bundan sonras, sadece PHP dilini renmekten ibaret. Dilin retecilerinden Zeev Suraski, bu yln banda srail'de yaplan ilk uluslararas PHP Konferans'nda "PHP renmek zor mu?" diye soran bir bilgisayar meraklsna u cevab veriyordu: "Bir haftadan fazla zaman ayrmanz gerekiyorsa, sizin iin zor demektir!"

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:17

PHP Dili
PHP bir Script dilidir; PHP ile yazdnz "programlar" birer dzyaz dosyasdr. Dil gelerini ayrntl olarak ele almadan nce bir iki yazm kuralndan sz edelim. PHP yorumlaycs, bu "program" altrabilmek iin dosyann iinde PHP komutlarn arar. PHP komutlar birinci blmde grdmz gibi iki ekilde yazlabilir: 1. <?PHP .... ?> 2. <? .... ?> Bunlara PHP komut ayrac denir; birinci tr uzun veya standart ayra saylr; ikincisine ike "ksa ayra" denir. PHP yorumlaycsnn ksa ayra kullanmasn istemiyorsak, PHP.ini dosyasndaki, short_open_tag = On: satrn short_open_tag = Off; yapmak yeter. Bununla birlikte uzun vadede, PHP programlarnzda HTML yerine XML kullanmak istiyorsanz, imdiden elinizi uzun ayraca altrmanz yerinde olur; nk XML etiketleri "<?xml" eklinde balar ve "?>" eklinde biter. ASP ile alan Web programclar "<?" ve ?>" yerine sk sk "<%" ve "%>" yazarlar! PHP dilini geliterinler., ok yaygn olan bu hatann PHP programlarnn almasna engel olmasn nlemek iin bize bir kolaylk salyorlar. Eer ASP ile alan ve daha sonra PHP'ye geen bir programc iseniz, PHP.ini dosyasn aarak, asp_tags = Off; satrn short_open_tag = On; yapabilirsiniz. imdi artk rahata ASP ayracn PHP yazmak iin kullanabilirsiniz! PHP komutlarnz daha uzun olmakla birlikte <SCRIPT> etiketiyle de kullanabilirsiniz. Yukardaki rnekte oluturduumuz merhaba.PHP'yi an ve u ekilde deitirerek, merhaba2.PHP adyla kaydedin: MERHABA2.PHP <HTML> <SCRIPT LANGUAGE="PHP"> print ("Merhaba Dnya!"); </SCRIPT> </HTML> Web sunucusunda bu program aarsanz, ayn sonucu aldnz greceksiniz. Burada bir yanl anlamaya yol amayalm. Javascript veya VBScript gibi HTML kodlarnn iine gmdmz ve HTML sayfasnn iinde, Web ziyaretimizin bilgisayarna gnderilen ve orada (istemci-tarafndan) icra edilen ve yine ayn ekilde SCRIPT> etiketi iine koyduumuz Script kodlar ile burada <SCRIPT> etiketi ile ifade ettiimiz PHP kodlarnn icra yerini kartrmayalm. PHP, nasl bir ayra ve etiket ile yazarsak yazalm, daima sunucuda altrlar ve ziyaretiye asla PHP kodlar gsterilmez. merhaba2.PHP'nin alt Browser'da kayna grntlersek, istemciye gelen kodlarn (saf-ve-temiz) HTML olduunu greceiz. PHP kodlarmz, oluturulmasn istediimiz sayfann HTML kodlar ile tabir yerinde ise iie yazlr. Bunun bir rnei olarak yukardaki dosyay yle deitirerek, merhaba3.adyla kaydedin: MERHABA3.PHP <HTML> <HEAD> <TITLE>PHP ile Merhaba</TITLE>

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:18

</HEAD> <BODY> <CENTER> <B> <H1> <?PHP print "Merhaba Dnya!"; ?> </H1> </B> </CENTER> </BODY> </HTML> Sayfamzn grntsnde hi bir deiiklik olmamakla birlikte, Browser'a giden HTML kodlar nemli lde deimi olacaktr. Geri burada henz ihtiyacmz yok; nk bir bakta yazdmz kodun marifetini anlayabiliyoruz; ama cidd PHP programclna baladmz zaman, hangi satrda neye niyet ettiimi anlamamz daima mmkn olmayabilir. Biz kendi programmz satr satr ezberlesek bile, ibirlii yaptmz dier Web programclarnn programmz anlamalarn salamamz gerekir. Bunu, yorum satrlar ile yapabiliriz. PHP ayralar iinde iki trl yorum bulunabilir: ok-satrl yorumlar ve tek satrl yorumlar. Birinci grubu, bana "/*" ve sonuna "*/* iaretleri koyarak, ikinci grubu ise sadece bana *//* iareti koyarak belirtiriz: <HTML> <!- - Bu satr HTML'in yorum satr Buraya istediimiz kadar yorum yazabiliriz.. Browser bu satrlar dikkate almaz - - > <HEAD> <TITLE>PHP ile Merhaba</TITLE> </HEAD> <BODY> <CENTER> <B> <H1> <?PHP /* Bu satr da PHP'nin ok-satrl yorum blm.. Bunu da PHP yorumcusu asla dikkate almaz Buraya istediimiz kadar yorum yazabiliriz. */

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:19

print "Merhaba Dnya!"; // Bu ise PHP'nin tek satrl yorum blm // Bu satrlar da PHP yorumcusu dikkate almayacaktr. ?> </H1> </B> </CENTER> </BODY> </HTML> PHP'nin bir dier yorum iareti ise # (Diyez) iaretidir. Bu iaretin banda olduu satr da PHP tarafndan dikkate alnmaz: <?PHP # Bu satr PHP'nin ok-satrl yorum blm.. # Bunu da PHP yorumcusu asla dikkate almaz # Buraya istediimiz kadar yorum yazabiliriz. print "Merhaba Dnya!"; ?> Diyez ile yorum haline getirdiimiz satrlarn sonuna baka iaret koymaya gerek yoktur.

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:20

PHP'nin Yap Talar


PHP, bir programlama dili olarak, deikenler, deikenlerin deerleriyle bir ilem yapmay salayan ilemciler, ilemcilerle oluturulan deyimler ve nihayet bunlarn tmn toplu olarak kullanmamz salayan ilevlere (fonksiyonlara) sahiptir. PHP, nesne-ynelimli (object-oriented) bir dil olduu iin, nesne oluturma imkanna ve bunlarn kullanlmasn salayan metodlara da sahiptir. Btn bu imkanlar kullanarak, PHP ile bir veritabanndan veri alarak, bunlar HTML etiketlerinin deerleri olarak kullanabiliriz; Web sitemizi ziyaret eden kiilerden bilgi alabiliriz, bu bilgilerle ilemler yapabiliriz. PHP'nin eitli komutlarn, deyimlerini ve fonksiyonlarn kullanarak, programmzn alt Web sunucusunun bulunduu bilgisayara da eitli dosya ilemleri yaptrabiliriz.

PHP programn durdurmak


imdi belki PHP'yi durdurmay hi dnmyorsunuz; ama ilerde bir fonksiyonun verecei sonucun btn programn durdurulmasn gerektii zamanlar olabilir. PHP'nin resm el kitabna bile ilk basksnda konulmas unutulmu olan program durdurma komutu, exit kelimesidir; hi bir parametre almadan alr. Bu tr karmak uygulamalara geebilmek iin nce, PHP dilinin unsurlarn biraz yakndan inceleyelim.

Deikenler
Programclkta ilemlerimizi deikenlerle yaparz. Deikeni bir kap gibi dnebilirsiniz. Szgelimi "Gn," deikenin ad ise bu deikenin deeri Pazar, Pazartesi, Sal, vd., olabilir. Her deiken, trne gre, ya bir ya da daha fazla deer tutar. Adndan da anlalaca gibi deikenin deeri deiir! Bu deiiklii biz yapabiliriz; programn kendisi yapabilir. PHP'de de, bir ok baka bilgisayar programlama dilinde olduu gibi deikenlerin iine bir deer konmadan nce tanmlanmas mmkndr; fakat gerekli deildir. Deikenleri adnn nne $ iareti koyarak tanmlarz: $adi; $soyadi; $123; $sevdigiRenk; Deikenler, harf, rakam veya alt izgi (_) ile balayabilirler; bu karakterleri ierebilirler; ama iinde boluk veya dier iaretler bulunamaz. PHP deikenleri her trl deiken tutabilirler: bir deikenin adnn yazl ekli onun tutabilecei deerin niteliini belirlemez. Dolaysyla, "$adi" deikenin deeri "Reit" da olabilir, "1255" de olabilir. PHP'de genellikle deikenleri deerini atayarak belirleriz: $adi = "Reit"; $soyadi = "Glen"; $123 = 123; $sevdigiRenk = "yeil"; Deikenler, kullanldklar ileme, tadklar deeri verirler:

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:21

print $adi; komutu, eer deeri "Reit" ise "Browser penceresine "Reit" kelimesini yazdrr. PHP'de zel bir deikene deiken ad olarak kullanlacak deerleri de atayabiliriz: $adi = "Reit"; $degisken = "adi"; print $$degisken; Burada Browser penceresine yine "Reit" kelimesi yazlacaktr; nk PHP $degisken adl deikenin "adi" adl deikeni tuttuunu bilecek ve iki Dolar iaretini grnce, $degisken'in deerini deil, onun tuttuu deikenin deerini yazacaktr. Bu, size u anda kark grnebilir. Daha sonra dngleri grdmzde bu teknii bir satrlk kod ile yzlerce deeri yazdrmakta kullanacaz. Bu teknik yle de kullanlabilir: $degisken = "adi"; $$degisken = "Reit"; print "$adi"; print $$degisken; print "${$degisken}"; print "${'adi'}"; Buradaki drt "print" komutu da Browser'a "Reit" kelimesini yazdracaktr. PHP'de bir deikenin tuttuu deer, bir baka deikene atanabilir. Bu ya duragan, ya da dinamik olarak yaplr. Duragan yntemde: $birinci_degisken = "Nurcan"; $ikinci_degisken = $birinci_degisken; $birinci_degisken = "Tlay"; print $ikinci_degisken; Buradaki "print" komutu Browser penceresine "Reit" kelimesini yazdracaktr. ki deiken arasndaki deer al-verii birinci deikenin tuttuu deeri deitirmeden nce olduu iin, ikinci deiken birinci deikenin ilk deerini alm oldu. Fakat kimi zaman iki deiken arasndaki deer al-verii srekli (dinamik) olsun isteriz. PHP, buna, ilk atama srasnda & iareti kullanrsak izin verir: $birinci_degisken = "Nurcan"; $ikinci_degisken = &$birinci_degisken; $birinci_degisken = "Tlay"; print $ikinci_degisken; Buradaki "print" komutu ise Browser penceresine "Tlay" kelimesini yazdracaktr. nk iki deiken arasndaki deer al-verii birinci deikenin tuttuu deeri deitirmeden nce halde, ikinci deikene birinci deikenin deerini dinamik olarak atam olduk. Atama ilemi srasnda & iareti kullandmz iin, birinci deikenin deeri deitiinde ikinci deikenin de deeri deiecektir.

Veri Trleri
PHP, deikenlere, tuttuklar deere gre farkl bellek alan tahsis eder; bu bakmdan verilerimizin tr etkin bir programclk asndan nem tar. Ayrca PHP, dier btn programlama dilleri gibi belirli veri trleri ile belirli ilemleri yapar veya yapamaz. rnein, ancak iki say arasnda aritmedik toplama yaplabilir. ki metin tutan deiken aritmetik

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:22

olarak toplanamaz; ancak ierdikleri deerler ardarda eklenebilir. Ne var ki, PHP sizin aritmetik toplama m, yoksa ardarda ekleme mi yapmak istediinizi bilmek durumunda deildir. (PHP'ye 'muazzam dil' dedik; iinde yapay zek var demedik!) Dolaysyla deerleri 5 ile 6 olan iki deikeni topladnz zaman ortaya 11 yerine 56 karsa, kabahati PHP'de deil, deikenlere veri atayan kiide (byk bir ihtimalle kendinizde) aramalsnz. PHP asndan dnyada alt tr deer vardr: Tamsay (Integer): 5,124, 9834 gibi ift (Double): 3,567 gibi Alfanmerik (String): "Reit" gibi Mantksal (Boolean): doru (true)/yanl (false) gibi Nesne (Object) Dizi (Array) Baz uzmanlara gre, gerekte PHP'de mantksal (boolean) deiken tr yoktur. B kannn sebebi, PHP'nin true (doru) ya da false (yanl) olarak atadmz deerleri 1 ve bo/null deerlere evirmesi, mantksal olarak sorgulandnda 0 dndaki tam ve ondalk deikenleri TRUE, 0' FALSE saymas, ve bo alfanmerik deikenleri FALSE, dolu alfanmerik deikenleri ise TRUE olarak deerlendirmesidir. Ancak daha sonra gereceimiz gibi PHP, Mantksal/Boolean adnda bir deiken deitirme fonksiyonuna sahiptir ve bu tr deikenlerin tr sorulduunda "boolean" karln verir.

Tr Deitirme
Deikenlere atadmz deerlerinin trlerini genellikle biliriz; ama yzlerce deikenle uratmz bir Web programnda deiken trn unutmak ok kolaydr. Kimi zaman da deikenlere program yoluyla deer atarz; baka bir deyile programmz baz deikenleri kendisi oluturabilir, ve bunlara kendisi deer atayabilir. Bu tr program yoluyla atanan deerlerin de trnde kukuya kapldmz anlar olabilir. Bir deikenin deerinin tr hakknda kukunuz varsa, en emin yol bunu PHP'nin kendisine sormaktr. Bu sorgulamay gettype() fonksiyonu ile yaparz.

Fonksiyon
PHP'nin gettype() ve print() gibi, kendi iinde bulunan kullanlmaya hazr bir ok fonksiyonu vardr. Daha sonra kendi fonksiyonlarmz yazmann yollarn da greceiz. Programclk dilinde ister dile ait olsun, ister kendimiz yazm olalm, bir fonksiyonu kullanmaya "fonksiyon arma" denir. Fonksiyonlar da fonksiyon arabilirler. arlan bir fonksiyon ya kendisinden beklenen ii yapar, ya da kendisini aran ileme veya fonksiyonu bir deer sunar. Buna fonksiyondan dnen deer denir. imdi, bir PHP program yazalm, bir takm deikenlere deerler atayalm ve bunlarn trlerini PHP'ye soralm. Bir dzyaz program ile u metni yazn ve turler.php adyla 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>

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:23

<H2> <?php $sayi = 5; print("Birinci deikenin ad: \$sayi<br>"); print("Deeri : "); print "$sayi<br>"; print("Tr : "); print gettype( $sayi ) ; //tamsayi/integer print "<br>"; print "<br>"; $alfanumerik = "Reit";

print "kinci deikenin ad: \$alfanumerik<br>"; print "Deeri : "; print "$alfanumerik<br>"; print("Tr : "); print gettype( $alfanumerik ) ; //alfanmerik/string print "<br>"; print "<br>"; $ondalik = 5.1234;

print "nc deikenin ad: \$ondalik<br>"; print "Deeri : "; print "$ondalik<br>"; print("Tr : "); print gettype( $ondalik ) ; //ift,ondalk/double print "<br>"; print "<br>"; $mantiksal = true;

print "nc deikenin ad: \$mantiksal<br>"; print "Deeri : "; print "$mantiksal<br>"; print("Tr : "); print gettype( $mantiksal ) ; //mantksal/boolean print "<br>"; print "<br>";

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:24

?> </H2> </B> </BODY> </HTML> Bu program altmzda karmza yle bir grntnn gelmesi gerekir: Burada mantksal (boolean) deer olarak doru anlamna true deeri atadmz halde, PHP'nin bu deikenin deeri olarak 1'i gsterdiine dikkat edin. PHP'de bir fonksiyon, elde ettii deer doru ise sonu olarak 1 deerini verir. (Yanl/false deerinin neye evrildiini bulabilir misiniz?)

Escape
turler.php dosyasn yazdysanz, u satrdaki, ters-bl iareti dikkatinizden kamam olmal: print "kinci deikenin ad: \$alfanumerik<br>"; Daha nce grdk ki, tek veya ift trnak iine de alsak, PHP, bir deiken adn grd zaman onun yerine o deikenin tuttuu deeri yazar. PHP bunu, deiken adnn bandaki $ grerek yaparak. $ iareti gibi PHP iin zel anlam olan iaretlerin anlamlandrlmasn nlemek ve bu iaretleri dz metin saymasn salamak iin bu iaretlerin nne ters-bl iareti koyarz. Buna o karakteri kurtarma veya ESCaping denir. PHP'nin anlaml iaretleri ve bunlarn ESCape-yazl yledir: \' Tek trnak \" ift trnak \\ Ters-bl \$ Dolar iareti \n Yeni Satr (New Line) \r Satr Ba (Return) \t Sekme (Tab) karakteri Kimi zaman bir deikene atadmz deerin trn deitirmek gerekir. Bunu settype() fonksiyonu ile yaparz. Elimizde byle bir imkan var diye, bir deikenin alfanmerik (String) olan deerini sayya evirebileceini sanmayn. PHP buna ok kzar! u rnei de tur_degistir.php adyla 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; deeri : "); print("Deikenin

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:25

print "$degisken<br>"; print("Tr : "); print gettype( $degisken ) ; //ift,ondalk/double print "<br>"; print "<br>"; print "lk deitirme ilemi: Alfanmerik/String:<br>"; settype( $degisken, string ); //alfanmerik/string print "Deeri : "; print "$degisken<br>"; print("Tr : "); print gettype( $degisken ) ; //alfanmerik/string print "<br>"; print "<br>"; print "kinci deitirme ilemi: Tamsay/Integer:<br>"; settype( $degisken, integer ); //Tamsay/Integer print "Deeri : "; print "$degisken<br>"; print("Tr : "); print gettype( $degisken ) ; //Tamsay/Integer print "<br>"; print "<br>"; print "nc deitirme ilemi: Ondalk/Double:<br>"; settype( $degisken, double ); //ift,ondalk/double print "Deeri : "; print "$degisken<br>"; print("Tr : "); print gettype( $degisken ) ; //ift,ondalk/double print "<br>"; print "<br>"; print "Drdnc deitirme ilemi: Mantksal/Boolean:<br>"; settype( $degisken, boolean ); // Mantksal/Boolean print "Deeri : "; print "$degisken<br>";

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:26

print("Tr : "); print gettype( $degisken ) ; // Mantksal/Boolean print "<br>"; print "<br>"; ?> </H2> </B> </BODY> </HTML> Bu program altrdmzda, ilk atadmz deerin ondalk/double olarak belirlendiine dikkat edin. Bu deerin trn alfanmerik/string olarak deitirdiimizde deimediini gryoruz. Fakat tamsay/integer'a evirdiimizde PHP deerin tamsay blmn alyor; ondalk-kesir blmn atyor. Nitekim daha sonra deikerin trn yeniden ondalk yaptmz halde, atlan bu blm geri gelmiyor. Son olarak deikeni mantksal ifade olarak deitirdiimizde, deerin doru/true olduunu anlyoruz; deer olarak bize 1 dnyor. PHP, sfr dndaki tm deerleri doru/true'ya evirir; sfr' ise yanl/false olarak atar ve bo/null deer verir. u anda PHP'yi tam bilemediimiz iin nerede kullanlr kestiremiyoruz, ama diyelim ki burada olduu gibi, deikeni bir daha dzelmeyecek ekilde deiiklie uratmak istemeyebiliriz; fakat yine de deerinin trn deitirmek isteyebiliriz. Bunu da nerede kullanabiliriz, u anda bilmiyoruz. Ama diyelim ki, byle bir ilem yapmaya ihtiyacmz oldu! Hatrlyor musunuz, biraz nce zel bir ekilde bir deikene baka bir deikenin adn deer olarak vererek, aslnda bu deikenin ilk deikenin deerini almasn salamtk. Burada da ayn teknii kullanabiliriz. Bu kodu da tur_kopyala.php adyla 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; deeri : "); print("Deikenin print("Tr : "); print gettype( $degisken ) ; //ift,ondalk/double print "<br>"; print "<br>";

print "$degisken<br>";

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:27

print "lk kopyalama ilemi: Alfanmerik/String:<br>"; $kopya_degisken = print "Deeri : "; print "$kopya_degisken<br>"; print("Tr : "); print gettype( $kopya_degisken ) ; //alfanmerik/string print "<br>"; print "<br>"; print "kinci kopyalama ilemi: Tamsay/Integer:<br>"; $kopya_degisken = print "Deeri : "; print "$kopya_degisken<br>"; print("Tr : "); print gettype( $kopya_degisken ) ; //Tamsay/Integer print "<br>"; print "<br>"; print "nc deitirme ilemi: Ondalk/Double:<br>"; $kopya_degisken = print "Deeri : "; print "$kopya_degisken<br>"; print("Tr : "); print gettype( $kopya_degisken ) ; //ift,ondalk/double print "<br>"; print "<br>"; print "Drdnc kopyalama ilemi: Mantksal/Boolean:<br>"; $kopya_degisken = print "Deeri : "; print "$kopya_degisken<br>"; print("Tr : "); print gettype( $kopya_degisken ) ; // Mantksal/Boolean print "<br>"; print "<br>"; ?> ( boolean ) $degisken; // Mantksal/Boolean ( double ) $degisken; //ift,ondalk/double ( integer ) $degisken; //Tamsay/Integer ( string ) $degisken; //alfanmerik/string

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:28

</H2> </B> </BODY> </HTML> Bu programn can alc noktas rnein "$kopya_degisken = ( boolean ) $degisken;" eklindeki komut; burada $kopya_degisken adl deikene $degisken adl deikenin deerini (eittir iareti ile) kazandrrken, arada yeni deikenin kazanmasn istediimiz trn adn parantez iinde yazyoruz. Burada gerekte, $degisken adl deikenin deerine hi bir ey olmuyor. Bu program altrrsanz, ilk deerin ontalk ksmnn nceki rnekte olduu gibi deiim ilemi sonunda tamamen yok olmadn grebilirsiniz. $degisken adl deikenin deeri deimeden durduu iin nc admda yptmz ondalk tr olarak kopyalama sonucu yeni deikenin deeri yine kesiri ile karmza kyor.

Drt yararl fonksiyon


PHP'de deiken deer tr deitirmekte kullanabileceimiz kullanlmaya hazr fonksiyon vardr. ilerde dngleri ele aldmzda daha ok anlam kazanacak olan bu deikenleri imdilik bir kenara kaydedin: isset() ve unset() PHP, bir deiken tanmland anda, sanki iinde deer varm gibi, bilgisayarn belleinde yer ayrr. Bu bazen bilgisayarn kt kaynaklarn zorlayabilir. isset() fnksiyonu, PHP'nin bir deikenin iinde deer bulunup bulunmadn snamasn salar. unset() ise varolan bir deikeni yok eder. Bu iki fonksiyonu birlikte kullanabiliriz ve bo deikenleri yok ederek, bilgisayarn belliinde yer aabiliriz: if (isset($bir_degisken)) { print( $bir_degisken ); } else { unset($bir_degisken); } Bu kod paras, $bir_degisken isimli dikenin ii bo deise, ieriini grntleyecek, ii bo ise varlna son verecektir. empty() isset() fonksiyonun tersi ileve sahiptir; bir deikene deer atanmamsa, veya deeri sfr veya bo alfanmerik (null string) ise, doru (True) deeri verir. $bir_degisken = 123; echo empty($bir_degisken); $bir_degisken = ""; echo empty($bir_degisken); Bu program paras Browser penceresine sadece empty() fonksiyonun doru sonu verdii birinci echo() deyiminde 1 yazdracaktr. is_string(),is_integer(),is_double(), Snadklar deikenin aradklar trden deer iermesi halinde doru 'True) sonu verirler. <?php $a = 6.567;

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:29

if (is_double($a)) { print ("A Double'dr<br>"); } $b = "Reit"; if (is_string($b)) { print ("B String'dir<br>"); } $c = 6; if (is_int($c)) { print ("C Integer'dr<br>"); } ?> Bu kod, Browser penceresine "A double'dr, B String'dir, C Integer'dr" yazdracaktr. PHP'de bu fonksiyonlara benzeyen fakat baka tr deer arayan u fonksiyonlar da vardr: is_array(), is_object. intval(), doubleval(), doubleval() Bir deikenin deerinin trn baka bir tre evirmeye yararlar. intval(), ortaya kartaca tamsay deikenin 10 tabanl (decimal) veya 16 tabanl (hexadecimal) olmasn salayan ikinci bir argman alabilir: <?php $a = "123ABC"; $b = intval($a, 16) print ($b); ?> Bu program Browser penceresine, 123'n hexadecimal ifadesi olan "1194666" yazdracaktr.

lemciler (Operatrler)
Yukardaki rnekleri birlikte yaptysak, = iaretini bol bol kullandk ve bylece PHP'nin bir ok operatrnden biriyle tantk. Buna PHP dilinde "atama operatr" denir. Bu ilemci sadece yukarda kullandmz gibi, bir deikenin bir deere eitliini ilan etmek amacyla kullanlmaz. rnein: print ( $sayi = 123 ) ; ifadesinde olduu gibi, bir fonksiyonun iinde de hem atama ilemi yaplabilir; hem de ilem yrtlr. PHP'nin aritmetik, birleik-atama, birletirme, karlatrma ve mantksal snama operatrleri vardr. Aritmetik ilemciler: + Toplama 6+5 = 11 kartma 6-5 = 1 / Blme 6/5 = 1.2 * arpma 6*5 = 30 % Kalan (Modulus) 6%5 = 1 Aritmetik ilemleri gerek saylarla yaptmz gibi, tuttuu deer say olan deikenlerle de yapabiliriz.

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:30

Daha nce, PHP'de deiken tanmlar ve bunlara deer atarken say olan deikenleri trnak iareti kullanmadan, alfanmerik deikenleri ise trnak iinde yazdmz hatrlayacaksnz. Bu, geleneksel hale gelmi olan bir programclk alkanldr. PHP, trnak kullanmasanz da bir deikenin say olup olmadn anlar; daha sonra bu deikenlerle aritmetik ilem yapabilir. PHP ayrca rakamla balayan alfanmerik deikenleri say olarak kullanmaya kalktnzda, bu deerin bandaki btn rakamlar say olarak kabul eder. PHP asndan harf veya iaretle balayan alfanmerik deikenlerin say olarak deeri sfrdr. 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 kacaktr. Bu kk deneyi yaparsanz, PHP ile program yazarken hangi deikenin ne sonu vermesi gerektiini dikkatle dnmek zorunda olduunuzu grrsnz. Bir kiinin geliri ile adresini toplamak, programc olarak arzu ettiiniz bir ilem olmayabilir! Bununla birlikte elimizde bir kiinin ad ve soyad ayr deikenler halinde ise, bunlar birbirine ekleyerek (concatenation) ortaya yeni bir alfanmerik deiken kartabiliriz: <?php $adi = "Reit"; $soyadi = "Muhtar"; $adi_soyadi = $adi . " " . $soyadi; print ("<br>"); print ($adi_soyadi); print ($adi . "'nn soyad " . $soyadi . "'dir.") ?> Bu rnekte, sadece ekleme yoluyla yeni bir deiken oluturmakla kalmyoruz; fakat alfanmerik deikenleri, baka metinlerle de birbirine ekleyebildiimizi gryoruz. Bu ilemi nokta iaretiyle (.) yapyoruz. Bu ilemciyle sadece deikenlerin deerlerini deil fakat metinleri de birbirine ekleyebiliriz: <?php print ("yileri iyikleri ile alkla; " . "..." . "ve sen soluklarnda daima Mesh ol..! ") ?> PHP'nin atama ilemcisinin eittir (=) iareti olduunu hatrlyorsunuz birleik-atama (combined-assignment) ilemcileri, bu iarete dier aritmetik ilemciler eklenerek oluturulur. 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

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:31

.= $a .= "metin" $a = $a" metin" Bu ilemi zihnimizde, "A deikeninin mevcut deerine 5 ekle, kan sonucu A deikenin yeni deeri yap!" eklinde canlandrabiliriz.

Bir Arttrmak veya Azaltmak iin


Deerleri sadece 1 arttrmak veya azaltmak iin PHP, bir kolaylk salar: $a++veya ++$a: $a'nn deerini 1 arttrr; $a--veya --$a: $a'nn deerini 1 eksiltir. ++ veya -- iaretinin deiken adndan nce veya sonra olmasnn sonucu farkl olur. aretler deikenin adndan nce ise PHP nce deikenin deerini bir arttrr veya eksiltir, sonra bu yeni deeri ileme katar; iaretler deiken adndan sonra ise, PHP deikenin o andaki deerini ileme kadar, sonra deeri bir arttrr veya eksiltir. PHP'nin karlatrma yapmas iin kullandmz ilemciler ise ilem iaretinin sa ve solundaki deerleri veya deikenlerin deerlerini iaretin belirttii karlatrmay yaptktan sonra ortaya ya doru (true) ya da yanl (false) sonucunu kartrlar. Sz gelimi, deeri 6 olan deikenin 5'ten byk olup olmadn snarsak, sonu doru; 5'ten kk olup olmadn snarsak sonu yanl kacaktr. PHP'nin karlatrma ilemcileri unlardr: lemci rnek rnek $a=6 ise: == eitse $a == 5 Yanl/False Doru/True != eit deilse $a != 5 === ayn ise $a === 5 Yanl/False > bykse $a > 5 Douru/True < kkse $a < 5 Yanl/False <= kkse $a <= 5 Yanl/False veya eitse >= bykse $a >= 5 Doru/True veya eitse PHP'nin karlatrma ilemcileri hem tam ve ondalk say tr deerlerle, hem de alfanmerik deerlerle kullanlabilir. Daha ileri aamalarda, bazen deikenlerimizin karlatrmasnn bu kadar basit olamayacan; kimi zaman iki grup deikenin karlatrlmas gerektii durumlarn bulunduu greceiz. Diyelim ki, bir rencinin baarl saylmas iin hem vize notunun, hem de ylsonu snav notunun belirli saylardan byk olmas gerekiyor. Bu durumu ancak karmak-mantksal snamadan geirmemiz gerekir. Bu snamay iki ayr snama sonucu ile birlikte kullanrz. rnein: vize notu yeterli - final notu yetersiz = kalr (yanl/false) vize notu yeterli - final notu yeterli = geer (doru/true) PHP'de bu karlatrmay iki grubun arasna koyduumuz iaretlerle yaparz aretin sa ve sol tarafnn doruluu veya yanl iarete gre nihai sonucun doru veya yanl olmasn salar. Bu karlatrmalar yaparken u ilemcileri kullanrz: lemci Ad Anlam rnek || veya sol veya sa doru doru || yanl = doru or veya sol veya sa doru doru || yanl = doru && ve sol ve sa doru doru || yanl = yanl and ve sol ve sa doru doru || yanl = yanl Xor artl-veya Sadece sol veya sa doru doru || yanl = doru ! Deil sol veya sa yanl doru || yanl = doru "veya" ve "ve" snamalar iin iki ayr ilem iareti bulunmasnn sebebi, PHP'nin ilem srasyla ilgilidir. Birazdan oraya geliyoruz. imdi, kavranmas kolay olmayan ikili mantksal snamalara bir rnek verelim; yukarda rencinin durumunu PHP komutu olarak yazalm. <?php

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:32

$vize = 45; $final = 65; if ($vize >= 50 && $final >= 50) { print ("renci geti!"); } else { print ("renci kald!"); } ?> Mantksal karlatrma ilemleri daha da karmak olabilir. rnein, rencinin gemi saylmas iin ylsonu vize ve final notlarnn 45'dan yksek, ve ya birinci smester notunun ya da vize ve final notlarnn ortalamasnn 65'den yksek olmas art aranabilir. (Kabul; kt bir rnek oldu. Ama srf altrma iin!) Bu durumda kodu yle yazmamz 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 geti!"); } else { print ("renci kald!"); } ?> Burada, PHP nce || veya && iaretinin sonucunu bulacak sonra and veya or ilemcisinin gereini yapaaktr. Bu kodun verecei sonucu, bilgisayarda altrmadan tahmin edebilir misiniz? pucu: Bu rencinin yerinde olmak istemezdim! lem ncelii deyince.. Btn programlama dilleri gibi PHP iin de ilemlerin hangi srada yapld nem tar. "5 + 4 * 2" ileminin sonucu, nce 5 ile 4'n toplanmas ve sonucun 2 ile arplmas halinde baka, 4'n 2 ile arplmas ve sonucun 5 ile toplanmas halinde baka olacaktr. Bu bakmdan, PHP'nin hangi ilemi nce yapt, hangi ilemi sonra yaptn bilmemiz gerekir. PHP'deki ilemlerin yapl sras yledir: ++ ve -/ * + < <= => > % || = += -= /= %= .= and xor or r.

== === | = &&

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:33

Sabit Deerler
ster Web, ister Web-d amal olsun, bir programn bazen bandanh sonuna kadar deeri deimeyen deikene ihtiyac olabilir. "Deeri deimeyen deiken" teriminin anlamsz olduu kansnda iseniz, bunlara sabit deerler adn da verebilirsiniz! PHP'de sabit deerler, Script boyunca deimeden kalr. Sabit deerler, deikenlerden farkl ekilde oluturulur. Bunun iin PHP'nin define() fonksiyonunu kullanrz. Bu fonksiyonun yazm kural yledir: define ("SABIT_DEGER", deer); Burada SABIT_DEGER yerine, tanmlamak istediimiz sabit deere vereceimiz isim, deer yerine de sabit deeri yazarz. rnek: <?php $Dolar_miktar = 125; define ( "DOLAR_KURU", 625675); $TL_Tutar = $Dolar_miktar * DOLAR_KURU; print ($TL_Tutar); ?> Burada tanmladmz DOLAR_KURU sabit-deeri, tpk bir deiken gibi kullanlabilir. Fakat bir sabit deeri tanmladktan sonra ieriini deitiremezsiniz. Sabit deer ile ayn ismi tayan deiken oluturmak mmkndr; ancak ayn ismi tasa da bir sabit ile deikeni (birinin adnn nnde $ iareti bulunduu iin) kartrmak kolay olmasa gerek. Tanmlanm olan bir sabiti yeniden oluturamayz; ama buna teebbs ettiimizde PHP hata vermez. Bir sabit deerin oluturulmu olup olmadn defined() fonksiyonu ile anlayabiliriz: <?php $Dolar_miktar = 125; if (defined( "DOLAR_KURU" )) { echo ("Sabit deer daha nce tanmlanmt.<br>"); } define ( "DOLAR_KURU", 625675); $TL_Tutar = $Dolar_miktar * DOLAR_KURU; print ($TL_Tutar); ?> Bu program, bu ekilde ve define() komutunu en st satra alarak altrrsanz, ikinci altrnzda programn sabit deeri yeniden oluturmay reddettiini grecektiniz. Sabit deerleri, Web sitesinde ziyaretilerin girdii verilerden alarak kendiliinden oluturan bir program yazdnzda, defined() fonksiyonu mantksal hata yapmanz nler. PHP'nin kullanlmaya hazr bir ka sabid deeri vardr. True (doru) deeri 1 olan, False (yanl) ise deeri sfr says veya bo alfanmerik olan iki sabittir. Dier sabitler unlardr: __FILE__ : O anda almakta olan PHP dosyasnn ad (kelimenin nnde ve sonunda iki alt-izgi var); __LINE__ : Bu ifadenin yer ald satrn says (kelimenin nnde ve sonunda iki alt-izgi var); PHP_VERSION: PHP'nin srm (ki kelimenin arasnda bir alt-izgi var);

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:34

PHP_OS: PHP'nin alt iletim sistemi (ki kelimenin arasnda bir alt-izgi var); PHP_VERSION : PHP'nin srm (ki kelimenin arasnda bir alt-izgi var); Bunlara ek olarak, E_ERROR, E_WARNING, E_NOTICE ve E_PARSE eklinde hata durumunda hatann eitli zelliklerini bildiren sabit deerleri de kullanabiliriz. PHP hakknda ok daha geni bilgiyi phpinfo() fonksiyonunu arak alabilirsiniz.

Tarih ve saat Verisi


PHP, o andaki zaman bilgisini, saat, dakika, saniye ve salise olarak; tarih bilgisini yl, ay, gn (say veya isim olarak), programmzn herhangi bir yerinde bize bildirebilir. Bu bilgiyi Web sunucusunda istediimiz anda, muhtemelen sunucunun bulunduu bilgisayarn sistem saatinden alacak olan PHP, sunucu programnda farkl blgesel ayarlar iin gerekli dzenleme yaplmsa, bu imkandan yararlanarak bize sunucunun deil, arzu ettiimiz blgenin saat ve tarihini bildirebilir. zellikle Trkiye'de olmayan bir sunucuda bu imkann bulunup bulunmadn, ancak snayarak veya sistem yneticisine sorarak renebiliriz. Bylebir sNama iin u kodlar programnzn bana koyun: <?php setlocale ("LC_TIME", "TR"); print (strftime ("Trke bugn gnlerden: %A ")); ?> Browser penceresinde "Trke bugn gnlerden Sunday" yazsn okursanz, sunucuda Trke iin blgesel ayar destei yok demektir! PHP'nin zaman ve tarih belirlemekte kullanabileceiniz balca fonksiyonu getdate() ise xyle kullanlr. getdate() Tarih ve saat bilgisini alr ve ve vereceiniz bir isimdeki dizi-deikende kaydeder. rnek: Bu durumda, $saat_tarih dizi deikeninde srasyla u bilgiler yer alr: 32 saniye 57 dakika 6 saat 30 ayn gn says (1-31) 0 haftann gn says (1-7) 7 ayn says (1-12) 2000 yl 211 yln kanc gn Sunday gnn ad July ayn ad 964929452 Unix sistemlerinde Epoch biiminde zaman bilgisi PHP'nin tarih ve saat bilgisini biimlendirmede yararlandmz date() fonksiyonunu daha sonra metin biimlerdirme blmnde ele alacaz

$saat_tarih = getdate()

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:35

PHP'de Program Denetimi


Bilgisayar program, belirli deerlere gre kendi izleyecei yolu kendisi bulmaldr. Bir Web program da ayn mantkla tasarlanr. PHP, bir ksmn daha nceki blmlerde, bir ksmn da imdi ele aldmz aralar kullanarak, belirli durumlarda belirli istikametlere gidecek, yeri geldiinde geri dnecek, yeri geldiinde baka blmlere srayacak bir ak plan tasarlamamza imkan verir. Web programlarmzda, ziyaretilerimizin sitemizde yaptklar veya yapmak istediklerini bildirdikleri ie gre sayfalar, bu ilere gre sayfa ierikleri sunarz. Web programmz ziyaretimizin hareket tarzna ve amacna uygun olarak ilerler. Bir programn ak plann kontrol etmemizi salayan unsurlar ou zaman programn kendi kendine karar vermesini salayan aralardr. PHP'de program denetim unsurlar, programn gidi ynn deitirmemizi veya olduu yerde durmasn ve beklemesini veya bir ii biteviye yapmasn salar. Bu blmde bu aralar ele alacaz.

if Deyimi
nsan olarak kararlarmz hemen hemen daima "bir ey yle ise byle, yle deilse yle davranmak" zere almaz myz? PHP programnda if deyimi bunu salar. Kelime anlam eer olan if deyimi ile programmz karar almaya zorlarz. Ne var programmz bizim kadar akll olamayaca iin if artnn doru veya yanl olmas durumunda ne yapacan da ona biz syleriz. if deyimi yle yazlr: if ( koullar ) { koullar doru ise yaplacak ilere ilikin komutlar } elseif (dier koullar) { dier koullar doru ise yaplacak ilere ilikin komutlar } else { dier her durumda yaplacak ilere ilikin komutlar } PHP, if ifadesinin doru olmas halinde, ifadeye ait ilk ssl parantezin iindeki komutlar icra eder; bu artlar doru deilse, elseif deyimi ile ileri srebileceimiz dier bir grup artn doru olup olmadn snayabiliriz. Bu artlar yerine geliyorsa, PHP, elseif blmndeki ileri icra eder. Nihayet dier her hangi bir durumda icra edilmesini istediimiz komutlar else blmnde belirtiriz. PHP, if deyimi doru deilse, deyime ait ssl parantezin iindeki ileri yapmadan yoluna devam eder; varsa elseif deyiminin artlarn snar; elseif blm yok fakat else blm varsa bu blmdeki ileri icra eder. Deyimde else blm de yoksa, PHP yoluna if deyiminden sonraki ilk admdan devam eder. Bunu bir rnekle belirtelim:

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:36

<?php $sarki = "Gne Doacak"; if ( $sarki == "Gne Doacak" ) { echo ("Setiiniz arknn ad: Gne Doacak!"); } elseif ($sarki == "Beklerim Ben") { echo ("Setiiniz arknn ad: Beklerim Ben!"); } else { echo ("Ltfen bir ark seiniz!"); } ?> ou zaman if deyimlerini birden fazla koulu snayacak ekilde yazarz; bununla birlikte elseif ve else blmleri olmadan da yazlabilir: <?php if ( $parola == "" ) { echo ("Sitemize girmek iin parola yazmanz gerekir.<br>"); echo ("Ltfen parolay yazn! <br>"); } ?> Buradaki if deyimi $parola deikeninin bo alfanmerik olmas halinde ziyaretiyi uyarak ve grevi bitecektir. Ziyareti bir parola yazmsa, daha sonraki komutlar bu parolann doru olup olmadn snayabiliriz.

switch deyimi
PHP'de program akn ynlendirmekte kullandmz bir dier unsur, switch deyimidir. Ad anahtar anlamna gelen switch deyimi, verilen bir deikenin deerinin sraladmz koullardan hangisine uygun olduunu snar ve o koula ilikin komutlar icra eder. PHP'nin yapt ii bitirdikten sonra switch deyiminin dna kmasn salayan, break komutu vardr: switch ( deiken ) { case KOUL-1 ; Koul-1 doru ise yaplacak ilere ilikin komutlar break; case KOUL-2 ; Koul-2 doru ise yaplacak ilere ilikin komutlar break; case KOUL-3 ; Koul-3 doru ise yaplacak ilere ilikin komutlar break;

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:37

case KOUL-4 ; Koul-4 doru ise yaplacak ilere ilikin komutlar break; ...................... ...................... default: dier her durumda yaplacak ilere ilikin komutlar } switch deyimini yazarken mutlaka break ifadesini kullanmamz gerekmez; switch deyiminin ak break ile kesilmemise, program ilk art yerine gelmi olsa bile dier artlar da snamaya devam eder ve en sondaki default deyimine ulaarak (default'tan sonra noktal virgl deil iki nokta stste iareti olduuna dikkat edin), bu blmdeki komutlar icra eder. Ne var ki programclk mantna aykr olabilir: bir deikenin ierii verdiimiz artlardan birini tutmusa, muhtemelen dier artlar yerine getirmeyecek demektir. Bu durumda dier koullarn snanmas gereksiz e default ilerin icra edilmesi ise hata olur. Bu deyimi de bir rnekle grelim: switch ( $sarki ) { case "Gne Doacak" ; echo ("Setiiniz arknn ad: Gne Doacak<br>") ; break; case "Derdime Derman" ; echo ("Setiiniz arknn ad: Derdime Derman<br>") ; break; case "Haberi Yok" ; echo ("Setiiniz arknn ad: Haberi Yok<br>") ; break; case "Sonsuza kadar" ; echo ("Setiiniz arknn ad: Sonsuza kadar <br>") ; break; default: echo ("Setiiniz arknn ad bilinmiyor<br>") ; } Programmz, bu kodu icra ederken,, $sarki adl deikenin deerini, buradaki drt isimle karlatracaktr. arknn ad, "Gne Doacak" ise ilk durum gereklemi olacak; program Browser pencerisine arknn adn yazacak (ve muhtemelen bu szlerini grntleyecek!) ve ikinci adma break ifadesine geecektir. break, switch deyiminin sona ermesini salar; PHP yoluna, switch deyiminin kapanan ssl parantezinden sonra devam eder. Bu rnekte break ifadesi kullanlmam olsayd, PHP, dier artlar da snacak ve boun azaman kaybedecekti; daha da garibi, en sondaki default komutu da icra edilecei iin programmz Browser pencerisine hem seilen arknn adn, hem de "Setiiniz arknn ad bilinmiyor" yazacakt. Bunu gznnde tutarak, switch deyimini daima break ile birlikte yazmamz gerekir.

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:38

switch iin ksa yol


Kimi zaman uzun uzadya switch deyimi yazmamz gerekmeyebilir; bir deikenin deerini sadece bir arta uygunluk asndan snamamz gerekir. Bunu soru ve iki nokta stste iaretleri (? ... :) olarak yazlan ilemci ile yaparz. Diyelim ki, Web sitemizi ziyaret eden kiinin parola yazp yazmadn sramak istiyoruz: <?php $uyari = ($parola == "" ) ? "Parola yazmanz gerekir" : "Teekkr ederiz" ; echo ($uyari); ?> Bu kod parac, ziyaretinin parola girip girmediini $parola deikeninin iinin bo olup olmadna bakarak anlayacak ve $parola deikenin ii bo ise (yani soru iaretinin sorgulad durumun doru olmas halinde) iki nokta stskte iaretinden nceki metni $uyar deikenin ierii haline getirecek; $parola deikeninin ii dolu ise (yani koul yerine gelmiyorsa, durum yanl ise) iki nokta stste iaretinden sonraki metni $uyar deikeninin ierii yapacaktr. Bir sonraki echo() komutu ise ierii bu snav sonucuna gre belirlennen $uyar deikeninin deerini Browser penceresinde grntleyecektir.

Dngler
Yukardaki iki denetim gesi de programn ileri doru akn bozmayan aralardr. Oysa bazen programmzn bir koul gerekleincele kadar yerinde saymas ve koul gereklemedike ilerlememesi gerekebilir. Kimi zaman da programmza bir ii bitirmeden ileri gitmemesini biz bildiririz. Program aknn bu tr denetimini dng deyimleri salar. PHP'de iki tr dng vardr: bir durum devam ettii veya etmedii srece yaplan ve ka kere tekrar edecei bilinemeyen while dngleri, ve tekrar says belirli for dngleri.

while dngs
Bir deikenin ieriinin belirli bir art karlamas veya karlamamas halinde icra edilir. Burada dikkat edeceimiz nokta, programn icras srasnda deikenin ieriinin veya koulun deimesinin salanmasdr. Aksi taktirde pgrammz sonsuz dngye girer ve muhtemelen ker. while dngs yle yazlr: while (koul) { Koul doru ise yaplacak ilere ilikin komutlar } Bu yntemin yaygn kullanld alan, bir sayala yaptrlan ilerdir. Aadaki program while.php adlma kaydedip, alrrsanz, PHP, Browser'n yaz tr boyutunu 1'den 7'ye kadar byterek, ayn metni yazdracaktr: <HTML> <HEAD> <TITLE>PHP'de Dng</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;

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:39

while ( $sayac <= 7 ) { print ("<font size= $sayac >"); print ("<b><p>yileri iyilikleri ile alklaynz!</b></p>"); print ("</font>"); $sayac ++; } ?> </BODY> </HTML> Programmz, while dngs iindeki iken, sonsuz dngden kurtulabilmek iin, yazy yazdrdktan sonra, $sayac deikenini bir arttryor. Aksi taktirde, deiken hi bir zaman while dngsnn bekledii arta kavuarak 7'ye eit hale gelemeyecektir. (Program, sondaki "$sayac ++;" satrn kaldrarak denerseniz, zararsz bir sonsuz dngnn ne olduunu grebilirsiniz! Ama nce Browser'n dur dmesinin yerinde durup durmadna bir bakn!) while dngsn arad artn yerine gelmesi, her zaman burada olduu gibi, tabir yerinde ise "elle" yaplmaz; dngnn icra ettii komutlar veya fonksiyonlar koulu ieren deikeni deitirebilirler. Szgelimi elektronik ticaret sitemizde Web ziyaretimizin while iinde yapt alveriin tutarn koul olarak kullanabiliriz ve bu koulu ieren deiken alveri ile deiebilir.

do..while
while dngs farkettiiniz gibi, ileri srdmz art, iyi yapmadan nce snar; ve bu art ortadan kalkmamsa (yani henz doru/true ise) yapaca ii yapar; baka bir deyile while dngsnn yapaca i hi yaplmayabilir. Fakat snamann i yapldktan sonra yerine getirildii bir ekli de vardr: do..while.. Bu dng ise yle yazlr: do { Koul doru ise yaplacak ilere ilikin komutlar } while (koul); Burada grdnz gibi do..while dngs en az bir kere icra edilir; nk artn snanmas yaplacak ie ilikin komutlardan sonra gelmektedir. Bu dngnn arad artn dngnn yapt ilerin sonucu veya kod blmnde bizim tarafmzdan gerekletirilmesi iin igerekli komutlarn bulunmasna dikkat etmelisiniz. Yoksa, bu dng de sonsuzlua eriir! Yukarda rnei, bu yntemle yazalm: <?php $sayac = 1; do { print ("<font size= $sayac >"); print ("<b><p>yileri iyilikleri ile alklaynz!</b></p>"); print ("</font>"); $sayac ++; } while ( $sayac <= 7 ) ;

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:40

?> Bu dngy yazarken, while satrnn sorunda noktal virgl bulunduuna dikkat edin.

for dngs
PHP'de Web programlarmz, dngnn belirli bir sayda olmasn ve mesela bu saynn bizim istediimiz basamaklarda artmasn gerektiriyorsa, dngy for deyimiyle kurabiliriz. Ayrca for deyimi saya gibi artn yerine gelmesini salayacak arttrma vea eksiltme ilemlerini kendisi yapaca iin, sonsuz dngye girme tehlikesi de hemen hemen yoktur. Bu dng yle yazlr: for ( $yeni_degisken atama ; koul ; art basamas ) { Koul doru ise yaplacak ilere ilikin komutlar } for deyiminin ilk gesi, dng sayac olarak kullanlacak bir deiken olukturulmas ve buna deer atanmasna ilikindir; sonra bir noktal vrigl ile bu sayacn snr olan koul belirtilir. Yine noktal virgl ile ayrarak, saya deikeninin art hz verilir. Bunu da yine yukardaki rnekle gsterelim: <?php for ($sayac = 1; $sayac <= 7 ; $sayac++ ) { print ("<font size= $sayac >"); print ("<b><p>yileri iyilikleri ile alklaynz!</b></p>"); print ("</font>"); } ?> Buradaki kod, while ve do..while gre ok daha ksa; ve while dngs sayac arttrmay salayan satr unutulsa bile alaca halde, for dngs unsurlara ilikin noktal virgller eksik olursa almayacak ve bize bylece sonsuz dng tehlikesini hatrlatm olacaktr. for dngs kendi sayacn verdiiniz art karlayncaya kendisi arttracak, yani buradaki rnei gre $saya deikeni 7 oluncaya kadar alacak ve art karland anda, sona erecektir.

foreach
PHP'nin programcya ok kolaylk salayan bir dier dngs, foreach dngsdr. Ancak bir deikenin btn elemanlarn tekrar saysnda esas alan bu dngnn alma ilkelerini grebilmek iin dizi deiken kavramn ele alm olmamz gerekiyor. imdilik bu dngnn varln bir kenara yazp, dizi deikenlere kadar, unutabilirsiniz.

Dngy sona erdirmek iin: break


Programmzn ak, bazen dngnn durdurulmasn gerektirir. rnein, saya deikenini ziyaretinin vermesi gerektii ve vermedii durumda, dngnn balamamas yerinde olur. Programn gerektirdii byle bir sebeple dngy break komutuyla durduruz. Szgelimi aadaki kodda kullandmz $tekrar deikenini deerini ziyaretiden form yoluyla aldmz varsayalm: <?php $tekrar = 10 : for ($sayac = 1; $sayac <= $tekrar ; $sayac++ ) {

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:41

if ( $tekrar <= 0 ) break; print ("<font size= $sayac >"); print ("<b><p>yileri iyilikleri ile alklaynz!</b></p>"); print ("</font>"); } ?> Bu kod parasn, bir sayfa kodunun iine yerletirir ve nce bu ekliyle, danha sonra $tekrar= 0 yazarak snarsanz, break komutunun ie yaradn greceksiniz. ($tekrar deikeninin deerini, Form yoluyla ziyaretiden deiken deeri almay reninceye kadar imdilik kaydyla biz yapyoruz. Ayrca buradaki if deyiminin ssl parantez olmadan yazldna dikkat edin.

Dngy srdrmek iin: continue


break ifadesinin dngy tamamen durdurduunu farkettiniz mi? Oysa programmzn ak, kimi zaman da dngnn sadece belirli bir durumda kendisinden beklenen ii yapmamakla birlikte byle tmyle kesilmesini de gerektirmez. Yine yukardaki rnee dnersek, saya deikenini ziyaretinin vermesi gerektii ve vermedii durumda, dngnn tmyle kesilmesini deil de, sadece sayac gsteren $sayac deikeninin sfrdan byk bir deere ulalmasn beklememiz yerinde olabilir. Bu devamll continue komutuyla salarz: Yine bu rnekte kullandmz $sayac deikeninin deerini ziyaretiden form yoluyla aldmz varsayarak, kodu yle deitirebiliriz: <?php $sayac = -5 : for (; $sayac <= 7 ; $sayac++ ) { if ( $sayac <= 0 ) continue; print ("<font size= $sayac >"); print ("<b><p>yileri iyilikleri ile alklaynz!</b></p>"); print ("</font>"); } ?> Bu durumda PHP, conktinue komutunu grd anda for dngsnn geri kalan ksmn icra etmek yerine baa dnecek ve dngy yeniden icra etmeye balayacaktr. Dngnn ilk satrnnda kod parasn, bir sayfa kodunun iine yerletirir ve nce bu ekliyle, danha sonra $sayac= 1 yazarak snarsanz, continue komutunun program saya deikeninin deeri 1 oluncaya kadar durdurduunu ama bu srada for dngsnn devam ettiini greceksiniz. ($sayac deikeninin deerini, Form yoluyla ziyaretiden nasl alacamz daha sonra greceiz.) Buraya kadar, PHP program oluturabilmek iin gerekli temel yazm kurallarn, yaptalarn ve program aknda yararlanacamz kontrol gelerini ele alm olduk. imdi bu unsurlarn hepsini bir arada kullanabileceimiz gruplar, fonksiyonlar ele alabiliriz.

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:42

Fonksiyonlar
Bir bilgisayar programnn kalbi, fonksiyonlardr. Fonksiyonlar, bir kere tanmlanr ve bir ok kereler, ihtiya olduu noktada hizmete arlr. Fonksiyonlar genellikle bir i veya hesaplama yaparlar ve bunun sonucu olarak ortaya yeni bir deer kartrlar. Bu deere "fonksiyondan dnen deer" denir. Fonksiyonun bir program iin ne kadar nemli bir unsur olduunu bir rnekle belirtelim. Diyelim ki Web'de rencilerimizin yl iinde aldklar notlar gsteren bir programmz var. Bu siteyi ziyaret eden rencilerin, iskterlerse, bir dmeyi tklayarak, o andaki not ortalamalarn hesap ettirmelerini salamak istiyoruz. Bu hesab yapacak olan ilem, bir fonksiyondur. Web ziyaretisi dmeyi tklad anda, program, ortalama hesabn yapacak olan fonksiyonu, o sayfada bulunan notlar bildirecek; fonksiyon da kendisine verilen bu deerlerle yapmas gereken hesab yapacak; ve elde edecei sonucu kendisini greve aran program satrna bildirecektir. Bildirilen bu deerle ne yaplaca, fonksiyonu greve aran komuta veya ileme aittir. Fonksiyon kendisinden isteneni yapmakla yetinir. PHP'nin kullanlmaya hazr bir ok fonskiyonu vardr. u ana kadar srekli kullandmz echo() ve print() bu tr PHP fonksiyonlardr. PHP'nin kendi fonksiyonlarn greve armak, yine yukardaki rneklerde olduu gibi, program iinde gerektii yere adn ve kullanaca deeri yazmakla olur: print ("Bu bir metindir!"); PHP bizim kendi fonksiyonlarmz kullanmamza da izin verir. Fakat bunun iin nce fonksiyonu tanmlamamz gerekir.

Fonksiyon Tanmlama ve arma


PHP'de fonksiyonlar function komutu ile oluturulur. Tanmladmz fonksiyon, kendisini greve aracak komuittan, yapaca ilemde kullanmak zere deer alacaksa, bu deerlere vereceimiz deiken isimleri fonksiyon adnn yannda parantez iinde gsterilir. Fonksiyon birden fazla deer bekleyecekse, bunlarn deiken adlarnn arasna virgl koyarz. Fonksiyona ulatrlan deerlere argman denir. Fonksiyon, kendisine bir deer ulatrlmasn beklemese bile ii bo parantez koymamz gerekir. Buna gre PHP'de fonksiyon yle yazlr: function fonksiyonun_ad (argman1, argman2, ... argmanN) { fonksiyonun yapaca ie ilikin komutlar } Fonksiyon adlar, deiken adlar ile ayn kurallara tabidir. Fonksiyon iinden fonksiyon arlabilir; fonksiyonlarn iinde PHP'nin kendi fonksiyonlar kullanlabilir. imdi, ilk rnek fonksiyonumuzu yazalm. Yukardaki rneklerde, PHP'ye, bir Web sayfas olutururken HTML gesi olacak baz satrlarn bana <H1>, satr sonlarna <BR> gibi etiketler koydurduumuza dikkat etmi olmalsnz. Bir programda bu ii sk sk yapacaksak, yani metinlerimiz <BR> ile bitecek, baz balklarmz ise sayfamza HTML'in balk etiketleri ile gnderilecekse, bu etiketleri defalarca yazmamz sadece zorluk deil, fakat ayn zamanda yazm hatasn davet eden bir davranr olur. PHP'de kendisine vereceimiz metinleri balk veya gvde yazs olarak biimlendirecek fonksiyonlar tanmlayarak, programclkta daima tehlikeli olan insan

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:43

unsurunu asgarye indirebiliriz. u program yazdir01.php adyla kaydederek, Browser'da an: <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"); } // Baka kodlar buraya girebilir yazdirH1("Bu H1 Balk"); yazdirH2("Bu H2 Balk"); yazdirH3("Bu H3 Balk"); yazdirH4("Bu H4 Balk"); 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.");

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:44

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 dier paragraf metni."); ?> </BODY> </HTML> Bu programda, yazdirBR(), yazdirH1(), yazdirH3(), yazdirH4(), ve yazdirP() adlaryla alt fonksiyon tanmladmz gryorsunuz. Bu fonksiyonlarn hepsi kendilerini greve aran satrdan, kendilerine bir deer verilmesini istiyorlar ve bu deeri $metin adl deikende tutuyorlar. Fonksiyonlarmz tm de PHP'nin print() fonksiyonundan yararlanyor; ancak bu fonksiyonun nasl kullanlacan, nasl iletileceini de belirliyorlar. Buna gre baz fonksiyonlarmz $metin adl deikenin deerini nne ve arkasna bir HTML etiketi koyarak Browser'a gnderiyor; birisi ise sadece $metin deikenin tuttuu deerin sonuna bir HTML etiketi koyduruyor. Fonksiyonlarm buradaki rnekte olduu gibi hemen oluturulduktan sonra greve armayz. Geleneksel olarak, bir programda kullanlacak fonksiyonlar, programn ba tarafnda toplanr ve daha sonra nerede gerekirse orada, arlrlar. Fonksiyonlar adlarn ve kendilerine verilmesi gereken bir deer varsa o deeri parantez iinde yazarak arrz. Burada olduu gibi, fonksiyonu greve arrken parantez iinde deerin kendisini yazabileceimiz gibi, bu deeri tutan bir deikenin adn da yazabiliriz. Bu program altrrsanz, Browser'da bu grnty elde edebilirsiniz: imdi, bu penceredeki belgenin kaynan grntleyelim. Karmza 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 Balk</h1> <h2>Bu H2 Balk</h2> <h3>Bu H3 Balk</h3> <h4>Bu H4 Balk</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 <p>Bu uzun uzun uzun uzun uzun uzun uzun metni.</p> </BODY> </HTML> 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> uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun bir dier paragraf

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:45

Bu, bize, oluturduumuz btn fonksiyonlarn kendilerinden bekleneni yaptn ve kendilerine verdiimiz metinleri, tpk istediimiz gibi, arzu edilen HTML etiketleri ile birlikte Browser'a gnderdiklerini gsteriyor. Buradaki fonksiyon, kendisini bir i yapan trden fonksiyondur. Oysa kimi zaman fonksiyonlar, kendilerini greve aran komuta bir deer gnderirler. imdi de byle bir fonksiyon rnei yazalm. Aadaki kodu, hesapla.php adyla 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; } // Baka kodlar buraya girebilir $sayi1 = 12; $sayi2 = 5; print topla($sayi1, $sayi2); print ("<br>"); print cikart($sayi1, $sayi2); print ("<br>"); print carp($sayi1, $sayi2);

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:46

print ("<br>"); print bol($sayi1, $sayi2); print ("<br>"); ?> </BODY> </HTML> Bu programda, drt aritmetik ilemi yapan drt ayr fonksiyon tanmlyoruz. Fonksiyonlarmz kendilerini greve aran komuttan, kendilerine iki deer vermesini bekliyorlar ve bu deerleri $sayi1 ve $sayi2 adl deikenlere yazyorlar. Sonra herbiri, kendisinden beklenen aritmetik ilemi yaparak, sonucunu $sonuc adl deikene yazyor. onksiyonun elde Burada dikkat edeceimiz nokta, return komutudur. Bu komut, f ettii deeri, deeri tutan deikenin adyla, fonksiyonu arm olan satra gnderir. return komutuyla, kendisini greve aran satra deil fakat mesela baka bir fonksiyona da deer gnderebiliriz: return ( baska_fonksiynon ( $degisken)) ; Fonksiyonun return satrnda byle bir baka fonksiyonun ad yazmyorsa, bulunan deer greve aran satra gnderilir. Bu program, iine bizim yazdmz iki deeri hesaplayarak, Browser'a gnderecektir. Ancak bu deerler ziyaretinin dolduraca bir formdan alnabilecei gibi, program tarafndan da hesaplanabilir Bu sayfann kaynandaki HTML kodlar ise yle olacaktr: <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> Fonksiyonlarmz, kendilerinden bekleneni yaparak, gereken hesaplamann sonucunu, kendilerini greve aran komuta, burada PHP'nin print() fonksiyona gndermi; bu fonksiyon da sadece bu sonular Browser'a iletmi bulunuyor.

Fonksiyona varsaylan deer verebiliriz


Buradaki rneklerde tanmladmz fonksiyonlara bekledikleri deerleri, onlar greve ardmz noktada biz veriyoruz. Ancak yle durumlar olabilir ki, fonksiyonun bekledii deerlerden biri veya bir ka, greve aran satr tarafndan verilmeyebilir; fonksiyon varsaylan bir deerle altrlabilir. u rnei yazdir02.php adyla kaydedin: <HTML> <HEAD> <TITLE>PHP'de Fonksiyon</TITLE>

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:47

<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>"); } // Baka kodlar buraya girebilir yazdir("Bu Balk", 5 ); yazdir("Bu kk boyutta bir metin", 2); yazdir("Bu varsaylan boyutta bir metin"); yazdir("Bu ok byk Balk", 8); yazdir("Bu uzun bir paragraf metni. Boyutu varsaylan lde. Bu uzun bir paragraf metni. Boyutu varsaylan lde. Bu uzun bir paragraf metni. Boyutu varsaylan lde."); ?> </BODY> </HTML> Bu rnekte, daha ncekilerden farkl olarak fonksiyonun, bekledii iki argmandan birisini, fonksiyonu tanmlarken verdiimize dikkat edin: " function yazdir ($metin, $boyut=3)" ifadesi, PHP'ye, "Bu fonksiyona ikinci argman eksik gnderilirse, telaa kaplma, onun yerine 3 rakamn kullan!" anlamna gelir. Nitekim, programn daha ilerdeki blmlerinde bu fonksiyon grevlendirilirken birinci argmann deeri olan metin verildii halde, iki ayr yerde ikinci argmann deeri verilmiyor. Bu iki durumda., PHP, yazdir() fonksiyonunda varsaylan deer olan 3' kullanyor. Bunu, grntlenen sayfann kaynanda rahata grebiliriz: <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 Balk</font><br> <font size="2">Bu kk boyutta bir metin</font><br> <font size="3">Bu varsaylan boyutta bir metin</font><br> <font size="8">Bu ok byk Balk</font><br>

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:48

<font size="3">Bu uzun bir paragraf metni. Boyutu varsaylan lde. Bu uzun bir paragraf metni. Boyutu varsaylan lde. Bu uzun bir paragraf metni. Boyutu varsaylan lde. </font><br> </BODY> </HTML> Programda, yazdir() fonksiyonunun ikinci ve drdnc kullanmnda ikinci argmann bulunmadna, yukardaki HTML'de bu satrlar iin font size="3" etiketinin kullanldna dikkat edin.

Deikenlerin kapsam: global ve static


Yukarda hesapla.php rneini birlikte yaptysak, bir nokta dikkatinizi ekmi olmal: drt fonksiyonda da ayn deiken adlarn kullanyoruz ve sonucu ayn isimle print() fonksiyonuna gnderiyoruz. PHP nasl oluyor da, ayn isimli deikenleri buradaki gibi ayr ayr deerlerle ele alabiliyor? Bu sorunun cevabn verebilmek iin deikenlerin kapsam alanna bakmamz ve ve bu arada global deyimi ile tanmamz gerekir. Bir fonksiyonun deikenleri, sadece o fonksiyonun mr sresince vardr; hi bir fonksiyon dier bir fonksiyonun deikenlerinin veya kendisine verilmemi bir baka deikenin deerini bilemez; kullanamaz. Bunu hemen bir rnekle grelim. u kodu kapsam01.php adyla 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 = "Bakalarna yararl olmann snr yoktur!"; function yazdir () { print ("<h1>te metin: $metin </h1>"); } // Baka kodlar buraya girebilir yazdir(); ?> </BODY> </HTML> Normal grnl bir fonksiyon ve kendisinden nce tanmlanm olan $metin adl deikenin tuttuu deeri, kendisi greve arld anda Browser penceresinde grntlemeye hazr grnyor! Fonksiyonun dardan argman istemediini, kullanaca print() komutunun konusu olarak $metin deikeninin deerini kullanacan da anlyabiliyoruz. Fakat bu program altrdmzda karmza kan manzara ok farkl oluyor.

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:49

Fonksiyonun altn, yazdrmas beklenen eylerin ilk blmn yazdrm olmasndan anlayabiliriz. Fakat, $metin deikeninin deeri nerede? imdi bu sorunun cevabn biliyoruz: $metin deikeni fonksiyonun kapsama alan (scope) dnda! Bir fonksiyon kendisine verilmeyen veya kendi iinde tanmlanmayan bir deikeni kullanamaz; bilemez, deerinden haberi olmaz. Nitekim bu grnty aldnz srada kaynak kodlarna bakarsanz, "<h1>..</h1>" etiketlerinin arasnda sadece "te metin:" kelimelerinin bulunduunu greceksiniz. Bir fonksiyonun dnda tanmladmz deikenlerimizi fonksiyona tantabilmek iin global deyimini kullanrz; bylece deiken btn program boyuinca kresel nitelik kazanm olur: Ayn kodun fonksiyon blmn yle deitirerek, kapsam02.php adyla kaydedin: function yazdir () { global $metin; print ("<h1>te metin: $metin </h1>"); } Programmz altrdmzda, bu kez metnin arzu ettiimiz gibi grntlendiini greceiz. Bu noktada dikkat etmemiz gereken ey, global deyimi ile kendisine kullanlmak zere verilen deiken, artk bir bakma fonksiyonun mal olur ve fonksiyon tarafndan deeri deitirilebilir. Btn program boyunca kullanmaya niyetli olduunuz global deikenlerin, kullanmna verildii fonksiyon tarafndan deitirilip-deitirilmediine dikkat edin. Bir deikenin btn programda gerekli olmad ve sadece bir fonksiyon iinde kullanlaca durumlarda bu deikeni fonksiyonun iinde tanmlamak daha doru olur. Fakat daha nce belirttiimiz gibi fonksiyonlarn iinde tanmlanan deikenler fonksiyon alrken var olur; fonksiyon sona erdiinde de lr. Baka bir deyile, bir fonksiyonun iinde oluturduumuz bir deikenin fonksiyon sona erdiinde sfrlanmamas iin bir are olmas gerekir. Bu arenin ad, static deyimidir. yle bir rnek dnelim: Sitemizdeki bir hesaplama fonksiyonu ziyaretilerimizin yeni alverilerinin toplamn eski toplama ekleyerek, yeni ana toplam buluyor ve ziyareti alveri sepetine yeni bir mal ekledike, ve o andaki ana toplamn ne olduunu renmek istedike, fonksiyonumuzun eski ana toplam hatrlamas gerekiyor. u andaki PHP bilgimizle byle bir program yazmaya kalkmayalm; ama daha basit bir rnek olarak bu kodu static.php adyla 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 tuttuu say: $sayi </h3>"); } // Baka kodlar buraya girebilir

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:50

print ("<h2>Fonksiyonun birinci kez arlmas:</h2>"); saydir(); print ("<h2>Fonksiyonun ikinci kez arlmas:</h2>"); saydir(); print ("<h2>Fonksiyonun nc kez arlmas:</h2>"); saydir(); print ("<h2>Fonksiyonun drdnc kez arlmas:</h2>"); saydir(); ?> </BODY> </HTML> Bu program, static deyimi olmadan altracak olursak, saydir() fonksiyonu her arldnda $say deikeninin batan tanmlandn ve bir trl 1'den ileri gidemediini greceiz. static ise fonksiyon bittikten sonra $sayi deikeninin deerinin deimeden kalmasn salayacaktr. imdi, bir PHP programnn gerektirdii hemen hereyi grm olduk; sadece iki zel ara, dizi deikenler ve nesneler (Objects) kald. Bunlar da gelecek blmde ele aldktan sonra, PHP'yi gerek ortamda, Web'de kullanmaya balayabiliriz.

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:51

Dizi-Deikenler, Nesneler
PHP'de, dier programlama dillerinde olduu gibi, kullandmz bilgileri, verileri deiken adn verdiimiz kaplarda tuttuumuzu biliyoruz. Bu kaplarla ne iler yapabileceimizi de grdk. Fakat bu kaplarn sadece bir birim bilgi tuttuunu farketmi olmalsnz. Oysa programlarmzda genellikle, szgelimi "rencilerin adlar" dediimiz zaman yzlerce ismi tutabilen kaplara ihtiyacmz olur. Aksi taktirde, renci says kadar deiken oluturmamz gerekir ki, bu durumda deiken oluturma zahmetinden vazgemek daha uygun olur; rencilerin isimleri, deikene koymadan da kullanabiliriz. te, bu tr, bir grup bilgili topluca tutan deikenlere dizi-deiken (array) denir; ve program boyunca ie yarayan deiken tr de budur. PHP'nin dier bir ok dilden farkn salayan bir zellii, byk lde dizi deikenlere dayanan, iinde kendi deikenleri ve kendi fonksiyonlar olan nesne (object) oluturma imkanna sahip bulunmasdr. Bu adan PHP, nesne-ynelimli (Object-oriented) diller grubuna girer. Nesne oluturmak ve kullanmak, bu ynteme alk olmayan programclar iin nceleri ok zor grnr. Ancak bir kere nesne ile programlamann zn kavrayanlarn bir daha kolay kolay nesne fikrinden vazgetikleri de grlmemitir.

Dizi Deikenler
Dizi deikenden ayrntl sz edebilmek iin nce tipik bir dizi-deikende neler olduuna bakalm. Szgelimi, verdiiniz "PHP ile Programlama" kursundaki rencilerinizin listesi yle olabilir: renci No Ad Soyad Snav-1 Snav-2 Not 1 zbay Altun .. .. .. 2 Muharrem Ta .. .. .. 3 Erhan Matarac .. .. .. 4 Hasan Civelek .. .. .. 5 ahika Tabak .. .. ..

Dizi Deiken Oluturalm


imdi, PHP bize yle bir ara vermeli ki, biz bir kerede bu listenin tmn, her bir gesine sanki bir deikenin deeri imi gibi tek-tek, veya bir kana birden ulaabilmeli ve arzu ettiimiz zaman notlar doldurabilmeliyiz. renciler de yapacamz Web sitesine girerek, kendi notlarn grebilmeli ve notlarn inceleyebilmeli. PHP'nin bu amala salad ara, ok-boyutlu dizi-deiken oluturma aracdr. Ve bu arala yukardaki listeyi aynen yle yapabiliriz. Bu kodu dizi_degiskenler01.php adyla 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>

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:52

<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 baka kodlar girecek print $ogrenciler[0][adi]; ?> </H2> </B> </BODY> </HTML> Programdaki "print()" komutunu sadece dizi deikeni doru yazp yazmadmz snamak amacyla yazdk; bu program Browser'da atnzda yazdnz ilk ismi Browser penceresinde gryorsanz, dizi-deikeni doru ekilde oluturdunuz demektir. Burada, array() komutnu yazarken, ssl parantez deil, normal parantez kullandmza ve herbir elemann deerlerinin sonunda vrigl olduuna dikkat edir. Bir dier nemli nokta: endeks adlar bir kelimeden fazla ise bunlar trnak iine alarak belirtmektir. rnein: array ( adi => "zbay", soyadi => "Altun", "Sinav 1 Notlar" =>"", "Sinav 2 Notlar" =>"", "Toplam Not Ortalamasi" =>""), Burada, daha ncekilere benzer bir ekilde adlandrlm $ogrenciler deikenin ieriini array() komutu ile doldurduumuzu gryoruz. Array() ile byle ok boyutlu ve ierdii deerlerin her birinin bir "endeks ad" olan dizi-deikene likili Dizi (Associative array) de denir. Perl bilenler ise bu tr deikenlere "Hash" dendiini hatrlayacaklardr. likili Dizi'lerin birinci satr 0, ikinci satr 1, nc satr 2.. diye numaralandrlr. Bu dizinin o satrndaki kaydn sra endeksidir. Ayrca burada "adi," "soyadi," "sinav1" .. dizi deikenin iindeki deerlerin endeks addr. Yani bu deerlere atfta bulunurken, referans yaparken veya bu deerleriekullanmak amacyla eriirken sra endeksi ve endeks adyla hitabederiz. Yukardaki snama amal print() komutuna bakarsanz, birinci rencinin ismini "[0][adi]" olarak aryor. ok elemanl ilikili dizi oluturmann bir dier yolu, yeri geldiinde byle bir dizi iin yeni bir ye ilgili bilgileri eleman endeksi ve deerler iin endeks ad belirterek yle bir kod yazmaktan ibarettir. dizi_degiskenler01.php dosyasnda u deiiklii yaparak, dizi_degiskenler02.php adyla kaydedin <?php $ogrenciler[0][adi] = "zbay"; $ogrenciler[0][soyadi] = "Altun"; $ogrenciler[0][sinav1] = ""; $ogrenciler[0][sinav2] = ""; $ogrenciler[0][not] = "";

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:53

// Buraya Buraya baka kodlar girecek print $ogrenciler[0][adi]; ?> Bir dizi deikende ka boyut olacaksa, o kadar iie array() gesi oluturabiliriz. Buna gre tek boyutlu bir dizi deiken sadece bir array() komutu ile ve sadece deerler verilerek oluturulabilir. Diyelim ki yukardaki renci listemiz sadece rencilerin isimlerinden oluacak. Bu durumda $ogrenciler deikenine ilikin satr yle yazabilirdik: $ogrenciler = array ("zbay", "Muharrem", "Hasan", "ahika"); PHP, byle tek boyutlu bir dizinin rnein birinci elemann, "$ogrenciler[0]" adyla bilir. Byle bir tek-boyutlu diziyi oluturmak iin PHP bize baka bir kolaylk da salar: array() komutunu kullanmadan, doruca dizinin gelerine deer vermemiz mmkndr. Yukardaki programn sadece PHP blmn yle deitirerek, dizi_degiskenler03.php adyla kaydedin: <?php $ogrenciler[] = "zbay"; $ogrenciler[] = "Muharrem"; $ogrenciler[] = "Hasan"; $ogrenciler[] = "ahika"; // Buraya baka kodlar girecek print $ogrenciler[0]; ?> Byle srayla dizi deiken oluturur veya oluturulmu bir dizi deikene ek yaparken, deikenin sra numarasn yazmazsak, PHP bunlar kendisi sralar. Yukardaki kodun da Browser penceresine "zbay" yazdrmas gerekir. Mevcut tek-boyutlu bir dizi deikene ek yaptmzda, be yeni deerin dizinin en altna eklenmesini istiyorsak, sra numaras yazmamza gerek yoktur. Mevcut deerlerden birini deitirmek istiyorsak, o deerin sra numarasn yazmamz gerekir. Bunu denemek iin yukardaki kodu yle deitirilim ve dizi_degiskenler04.php adyla kaydedelim: <?php $ogrenciler[] = "zbay"; $ogrenciler[] = "Muharrem"; $ogrenciler[] = "Hasan"; $ogrenciler[] = "ahika"; // Buraya baka 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>");

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:54

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 programn Browser penceresine gnderecei srada, birinci renci ($ogrenci[0]) olarak bu kez zbay deil Emre yazdn greceiz. Bunun sebebi, diziyi oluturan ilk grup deyimden sonra, $ogrenciler[0] = "Emre"; satr ile birinci elemann deerini deitirmi olduk. 15'nci elemana atama yapmakla, PHP'nin $ogrenciler dizisinde 6, 7, 8, 9,.. 14'e kadar bo elemanlar oluturmasna sebep olduk. Tek boyutlu dizileri de likili Dizi olarak oluturabilir yani deerlere endeks ad verebiliriz. Daha nce kaydettiimiz dosyada u deiiklii yapalm ve dizi_degiskenler05.php adyla kaydedelim: <?php $ogrenci[adi] = "zbay"; $ogrenci[soyadi] = "Altun"; $ogrenci[sinav1] = ""; $ogrenci[sinav2] = ""; $ogrenci[not] = ""; // Buraya baka kodlar girecek print $ogrenci[adi]; ?> PHP, $ogrenci adl deikenin be ayr deeri olduunu ve bunlarn "adi," "soyadi," "sinav1"... olduunu biliyor. imdi artk istediimiz noktada bu deikenin istediimiz deerine, o deerin endeks adn yazarak, arda bulunabiliriz; bu deeri yeniden verebiliriz.

Dizi deikenleri kullanalm


Yukardaki paragrafta "..deikenin istediimiz deerine, o deerin endeks adn yazarak, arda bulunabiliriz.." dediimizi grm olmalsnz. Dizi veya tekil, deikenleri oluturmamzn sebebi, tuttuklar deerleri programmzn gerei olan ekilde ve yerde kullanmaktr. Sadece bir deer tutan deikenleri rnein print() komutu ile sk sk kullandk. Yukarda dizi deiken rneklerinde de baz deikenleri ve deerlerini ardk. Ancak dizi deikenlerin deerlerinden yararlanabilmek iin baka aralar da vardr. Hereyden nce dizi deikenlerin bykl, boyutu bizim iin nem tayabilir. zellikle bir veritaban dosyasn okutarak oluturacamz dizi deikenin ka eleman ve her bir elemann ka gesi bulunduunu bilmemiz gerekebilir. Bir dizi deikenin ka eleman bulunduu, o deikenin count() zellii sorgulanarak renilir. count(), dizideki eleman saysn verir. imdi bunu bir rnekle grelim. Daha nce kaydettiimiz dizi_degiskenler04.php dosyasn an ve PHP blmnde u deiiklii yaparak dizi_degiskenler06.php adyla kaydedin: <?php $ogrenciler[] = "zbay";

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:55

$ogrenciler[] = "Muharrem"; $ogrenciler[] = "Hasan"; $ogrenciler[] = "ahika"; // Buraya baka kodlar girecek print ("\$ogrenciler adl dizide ". count($ogrenciler) ." adet eleman var."); ?> Bu program Browser penceresine dizimizde 4 eleman bulunduunu bildirecektir. imdi ileri biraz karmak hale getirelim! Yukardaki kodun, print() satrnn yerine u satrlar ekleyerek, dizi_degiskenler06a.php adyla 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 altrmadan nce, eklediimiz satrlar irdeleyelim. lk print() komutunun Browser penceresine "yazdraca" metinde geen ters bl iaretini hatrlyor olmalsnz. Bu, tek veya ift trnak iine de alm bile olsak, PHP'nin, bir deiken adn grd zaman onun yerine o deikenin tuttuu deeri yazmas sebebiyle, $ iareti gibi PHP iin zel anlam olan iaretlerin anlamlandrlmasn nlemek iin yaptmz ve adna o karakteri kurtarma veya ESCaping dediimiz ilemdir. Bu ilemle, PHP'nin anlaml iaret deil de metin saymasn istediimiz karakterlerin nne ters bl iareti koyarz: \" gibi. Buradaki rnekte, bu sayede PHP "$ogrenciler" kelimesini deiken ad olarak deil, dz metin olarak gryor. Ki, ayn komutta ayn kelimeyi tekrar kullandmzda bu kez deiken ad olarak kullanyoruz ve bu deikenin count() gesinin deerini reniyoruz. $ogrenci deikenin "zbay," "Muharrem," "Hasan" ve "ahika" deerleri bulunduuna gre, bu deikenin count()'u 4 olacaktr. ("Ozbay" = 0, .. "ahika" = 3 olmak zere..) Bu print() komutu, Browser penceresine tahmin ettiiniz gibi "$ogrenciler adl dizide 4 adet eleman var." yazdracaktr. kinci print() satr ise ekrana ardarda iki yeni satr iareti gnderecektir. imdi kark noktaya geliyoruz! Burada bir for dngs balyor. nce dngnn ka kez tekrar edeceini belirleyecek olan deikeni tanmlyoruz: $sayac. Sonra bu sayacn kaa kadar kacan belirliyoruz. Bu sayy, bize yine count() veriyor. Ve tabi for dngsnn devam edebilmesi iin gerekli son unsur olan, sayacn arttrlmasn salayan deyim var. Programmz bu dngnn iinde, yani drt kez, her seferinde dizinin bir elemann adn Browser penceresine gnderiyor. imdi, hatrlayacaksnz, dizi deikenlerin elemanlarnn bir sra says vard. rnein "ahika" deeri, dizinin 3 numaral, yani drdnc eleman; ve bu elemann deerini ekrana gndermek iin u komutu vermemiz yeterli: print ($ogrenciler[4]); Programda ise buradaki endeks saysn, $sayac deikeninin o andaki deerinden alyoruz. Dngnn her seferinde bu deer bir artaca iin bize $ogrenciler deikeninin o anda hangi elemannn deeri armak istiyorsak, o elemann endeksini vermi olacaktr. Ve sonu olarak programmz, dizideki btn deerleri Browser'a gnderecektir. Kimi zaman buradaki rnekte olduu gibi, dizinin btn elemanlarn bir for dngsyle deil, foreach dngsyle bulmak daha kolay olabilir. Ksaca belirtmek gerekirse, foreach dngs, bir dizi deikenin btn elemanlar iin, arzu ettiiniz ii yapar. foreach dngsn yazarken komutun ka kere icra edileceini bir sayala tutmak gerekmez; nk dng, ona adn verdiiniz deikenin iindeki btn deerler bitinceye kadar

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:56

devam edecektir. Yukardaki rnekteki btn print() ve for satrlarn atarak yerine unlar yazp ve dizi_degiskenler06b.php adyla kaydelim. foreach ($ogrenciler as $ogrenci) { print ("$ogrenci<br>"); } foreach dngs, bir dizi deikenin adn iinden deer ekilecek kaynak olarak ister; bunu "as" (olarak) kelimesi izler; sonra diziden alnacak her bir deeri geici olarak tutacak deikenin ad verilir. Buradaki print() komutumuz, bu geici deikenin tuttuu deeri Browser'a gnderecektir. Bu deer ise dngnn her admnda dizi deikendeki bir deer yani rencilerin listesi olacaktr. Dizi elemanlarnn farkl zelliklerine ilikin deerlere endeks ad verdiimiz ilikili dizilerde ise eleman deerlerini armak foreach dngsnn biraz farkl yazlmasn gerektirir. Perl'e aina alanlarn bu dizi trne "hash" dendiini hatrlayacaklardr. PHP'de de Perl'n hash tr deikenlerinde olduu gibi, endeks adlarna "anahtar" (key), bu endeksin belirledii deere ise (evet, doru tahmin ettiniz!) deer (value) denir. likili dizilerden deer almak zere foreach dngs yazlrken, deerin anahtarn ve deerin kendisini iki geici deikene yazmamz gerekir. Daha nce yazdmz dizi_degiskenler05.php adl dosyay aarak mevcut tek satrlk print() kodunun yerine unlar yazn ve dizi_degiskenler07.php adyla kaydedin: foreach ($ogrenciler as $anahtar=>$deger) { print ("$anahtar = $deger<br>"); } Bu kodu altrmadan nce foreach dngs zerinde ksaca duralm: dng, $ogrenciler dizisini okumaya baladnda iinde, benzetme yerinde ise, iki stun, ve bir ok satrlar bulacaktr. Bu stunlardan birincisi, ikinci stundaki verinin addr; foreach, birinci stundaki veriyi alarak $anahtar adl geici deikenin deeri olarak atayacak; sonra ikinci stuna geecek ve bunu alarak $deger adl geici deikenin deeri yapacaktr. Dng, daha sonra print() komutunu icra edecektir. print() ise ve geici $anahtar deikeninin deerini, ardndan eittir iaretini ve son olarak da geici $deger deikeninin deerini Browser'a gnderecektir. print() komutunun icras bitince, foreach, kendisine verdiimiz $ogrenciler deikeninde anahtar-deer iftini ele almad satr kalp kalmadna bakacak, ve elemanlarn tm bitinceye kadar bu ilemi tekrar edecektir. Tabi, sonu anahtar ve deerlerin altalta sralanmas olacaktr. Bir de bu blmn en banda ele aldmz ok elemanl ilikili diziler vard. Onlarn iindeki deerleri acaba nasl alabilir ve kullanabiliriz? Tabi yine bir dng ile. Fakat bu kez, dng-iinde-dng kullanmak zorundayz. Byle bir diziyi gzmzde canlandrrsak, belki neden iki dngye ihtiya olduununu daha iyi grebiliriz. Gzmzn nne bir tablo getirelim: dizinin her bir eleman (bizim renimizde renciler9 bir satrda yer alm olsun; stunlar olarak da bu elemana ait deerler yer alyor. Stun bal ise, bu deerin endeksi olan anahtar! imdi bu blmn banda yazdmz dizi_degiskenler0i.php adl dosyay aalm tek satrlk print() komutunun yerine u satrlar yazarak dizi_degiskenler08.php adyla kaydedelim: foreach ( $ogrenciler as $ogrenci ) { foreach ( $ogrenci as $anahtar => $deger ) { print ("$anahtar = $deger <br> "); } print ("<br>"); }

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:57

Ksaca irdelersek, bu kodda foreach dngsnn nce ok-boyutlu deikenimizin bir satrn iindeki btn anahtar+deer eftleri ile ele alp, tmn $ogrenci adl deikene geici olarak yerletirdiini gryoruz. Bu foreach dngsnn ilk ii yeni bir foreach dngs balatmak oluyor. Yeni foreach ise saz eline alr almaz, nce, kendisi ok geli bir deiken olan (nk iinde bir renciye ait, tm deikenler ve onlarn endeks adlar var) $ogrenci deikeninin iindeki anahtar ve deer iftlerini tek-tek, $anahtar ve $deger deikenlerine yerletiriyor; sonra print() komutu ile, aralarna eittir iareti koyarak bu deikenlerin deerlerini Browser penceresine gnderiyor. Bu dng biter bitmez, ilk foreach yaptraca ilere kald yerden devam ediyor; ve ekrana bir yeni satr komutu gnderierek, baa dnyor; bu kez ok boyutlu dizi deikenin yeni bir elemana geiyor. Taa ki, dizinin btn elemanlar ve elemanlarn btn geleri bitinceye kadar. Bu noktada bir uyar: Gerek programda bir dizinin elemanlarna ilk ulatmzda, elemann iinde deer bulunup bulunmadn anlamak yerinde olur. Bunu is_array() fonksiyonu ile yapabiliriz. Bu fonksiyon, dizinin iinde deer varsa, True/Doru, yoksa False/Yanl karln verecektir. Buradaki rnekte, ilk foreach satrndan hemen sonra: is_array( $ogrenci ) satrn koyarak, dizinin o anda okunan elemann iinde deer bulunup bulunmadn anlayabiliriz.

Dizi Deikenlerin Dzenlenmesi


Dizi deikenlerin daha verimli ekilde kullanlmas iin PHP bize bir takm aralar salar. Bunlarla dizi deikenleri birletirebiliriz; iinden kesit alabiliriz, sralayabiliriz veya baz elemanlarn silebiliriz. imdi ksaca bu ilemleri ele alalm:

Dizileri birletirme: array_merge()


ki veya daha fazla dizinin btn elemanlarn birletirerek, ortaya yeni bir dizi kartr. 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 oluturulan $yeni_dizi isimli dizi deikenin hangi elemanlara sahip olduunu, yle bir kodla grebilirsiniz: foreach ( $yeni_dizi as $yeni_eleman ) { print (" $yeni_eleman <br>"); } kinci dizinin btn elemanlar, birinci dizinin elemanlarnn arkasna eklenmi olmal. array_merge() ilemi, ok-boyutlu ilikili dizilere de uygulanabilir; PHP iki dizideki uyumluuyumsuz, yani birinde olan dierinde olmayan btn anahtar+deer iftlerini yeni dizide de olutur. (array_merge() ileminden sonra birletirilen dizilerin deimeden kaldna dikkat edin.)

Dizilere deiken ekleme: array_push()


Bir diziye yeni deikenler eklemek iin, array_push() fonksiyonuna mevcut dizinin adn ve yeni deerleri yazarz. rnek: $birinci_dizi = array ( "zbay" , "Muharrem" , "Hasan" , "ahika" ); $yeni = array_push ($birinci_dizi, "Altun" , "Ta" , "Civelek" , "Tabak" );

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:58

Burada $yeni adl deiken sadece $birinci_dizi adl dizinin yeni eleman saysn tutar. array_push(), kendisine adn verdiimiz dizinin ieriini deitirir. Yukardaki rnekte iine yeni deerler yazlan dizinin elemanlarn grntlemek iin yle bir kod yazabiliriz: print ("\$birinci_dizi adl dizide $yeni_dizi adet deiken var<br>"); foreach ( $birinci_dizi as $ogrenci ) { print ("$ogrenci <br> "); }

Dizinin ilk elemann silme: array_shift()


Bir dizi-deikenin ilk elemann tmyle silmek iin array_shift() fonksiyonunu kullanrz. Bu fonksiyona sadece birinci eleman silinecek dizinin adn vermek yeter. rnek: $birinci_dizi = array ( "zbay" , "Muharrem" , "Hasan" , "ahika" ); $silinen = array_shift ($birinci_dizi); array_shift(), adn verdiiniz dizinin ieriini deitirir; buradaki rnekte, $silinen adl deiken dizinin silinen birinci elemann deerini tutar.

Diziden kesit alma: array_slice()


Bir dizi-deikenin btn elemanlar yerine bir kesitini kullanmak istiyorsak, bunu array_slice() fonksiyonu ile yapabiliriz. Bu fonksiyona kesit alnacak dizinin ad, kesitin balad yer ve ka adet deiken alnaca argman 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 deikene, $birinci_dizi adl dizinin 3'nc deerinden itibaren (3 dahil) drt deeri yerletirmesini bildiriyoruz. array_slice(), adn verdiimiz deikenin ieriine dokunmaz; yeni dizi deiken oluturulur.

Dizileri sralama: sort() ve rsort()


Bir dizinin iindeki deerleri alfabetik veya kkten bye doru sralamak iin sort() fonksiyonunu kullanrz. rnek: $birinci_dizi = array ( "zbay" , "Muharrem" , "Hasan" , "ahika", "Altun" , "Ta" , "Civelek" , "Tabak"); sort ($birinci_dizi); PHP, dizideki btn deerleri A'dan Z'ye sraya sokacaktr. sort() fonksiyonu dizinin ieini deitirir. Bir diziyi Z'den A'ya veya bykten ke doru sralamak iin de rsort() fonksiyonunu kullanabilirsiniz. (PHP4.0 Trke karakterleri tanmyor.) Bir noktada dikkatli olmak gerekir: bu fonksiyonu ilikili (deerlerin anahtar olarak endeks ad bulunan) dizide kullanrsanz, PHP, anahtar deerlerini (endeks adlarn) atar, yerine 0'dan itibaren rakam koyar. Bunu nlemek iin, ilikili dizileri asort() veya ksort() fonksiyonu ile sralamak gerekir.

likili dizileri sralama: asort() ve ksort()


likili dizilerin dier dizi deikenlere gre fark, deerlerinin bir de ad bulunmasdr. Deerlerin adlarna anahtar denir. Bir ilikili diziyi deerlerine gre sralamak iin asort() fonksiyonu kullanlr. rnek: $birinci_dizi = array ( ogr_01=>"zbay", ogr_02=>"Muharrem" , ogr_013>"Hasan" , ogr_04=>"ahika"); asort ($birinci_dizi);

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:59

PHP, bu diziyi deerler itibariyle alfabetik sraya sokacaktr. Eer srann deere gre deil de deerlerin anahtarna (burada ogr_01, ogr_02 olan kelimeler) gre yaplmasn istiyorsak, ksort() fonksiyonunu kullanrz. rnek: $birinci_dizi = array ( ogr_01=>"zbay", ogr_02=>"Muharrem" , ogr_013>"Hasan" , ogr_04=>"ahika"); ksort ($birinci_dizi); PHP, imdi bu diziyi anahtarlara gre alfabetik sraya sokacaktr.

Nesneler
Nesne ynelimli (Object-oriented) programlama icad edildiinde, geleneksel programlamaya aina olanlar nce tereddt ettiler; sonra bunun ne harika bir teknik oldununu grdler ve nesnelerden vazgemez oldular. Kabaca tanmlarsak, nesne, kendi deikenleri ve icra edecei komutlardan oluan fonksiyonlar ile bir btndr. Nesneyi bir kere tanmladktan sonra istediimiz kadar rneini oluturabiliriz. Bir nesnenin yapaca iten, o nesnenin metodu diye sz ederiz. Bu adan bakarsanz, programlarmzda nesneler sadece metodlar iin ie yararlar. Diyelim ki programmzda bir "renci" nesnesi oluturmak istiyoruz. Bu nesnenin iinde ad, soyad ve notlar gibi deikenler, ve bu deikenlerle yaplan bir takm iler bulunsun. e nesnenin tabir yerinde ise ablonu olan class' oluturmakla balayalm; gerisini de yaptka grelim.

Bir Nesne Oluturalm


Bir nesne oluturmak iin nce onu tanmlamamz gerekir. Bunu PHP'nin class deyimini kullanarak yapabiliriz. Bir nesnenin zellikleri (properties) ve metodlar (methods) vardr. u kodu nesneler01.php adyla 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 tanmlayalm var $adi; var $soyadi; var $sinav1; var $sinav2; var $not;

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:60

// metodlar tanmlayalm 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 . " iin not ortalamas: ". $this->not); } } //Buraya baka 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 tanmlyoruz; ve daha sonra bir deiken adna new komutu ile bu nesnenin bir rneini oluturuyoruz. Nesnelerin yeni bir rnei veya kopyasn kartmak ifadeleri aslnda yaptmz tam anlatmyor. Nesnenin tanm bir adet; her new komutu ile bu nesnenin zelliklerine ve metodlarna sahip yeni bir nesne yapm oluyoruz. Nitekim bu ie insann dilini dolayan ngilizce bir kelimeyle Instantiation (yeni bir varln oluturma) deniyor. Bu rnekte, $ogr1 adl deiken gerekte, ogrenci nesnesinin tam bir rnei: iinde be deiken ve alt metod var. Nesneyi bir kere tanmladktan sonra programn daha ileri aamalarnda bu istediimiz kadar rneini farkl isimler vererek oluturabiliriz. imdi u satra dikkat edelim: $ogr1 = new ogrenci();

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:61

$ogr1 -> adi_belirle("ahika"); Burada $ogr1'in parametrelerine nasl deer yazdrdmz gryorsunuz. Nesnenin metodlarndan biri olan adi_belirle fonksiyonuna bir deer veriyoruz: "ahika"; nesne oluturulurken yazlm olan bu fonksiyon ise ald deeri, kendi ait olduu nesnenin bir deikenine kaydediyor: function adi_belirle ($n) { $this->adi = $n; } Bu ve dier fonksiyonlarda kullandmz "$this->" ifadesi, kendisine ulatrlan deeri bir parametre olarak kullanyor ve "$adi" deikenine yazyor. "this" (bu) kelimesi o anda nesnenin o anda oluturulmakta olan rneine gndermede bulunur. "->" ilemcisini kullanarak, istediimiz nesnenin istediimiz metoduna veya parametresine deer gnderebiliriz. Bir nesnenin yeni bir rneini oluturduumuz zaman, bu rnein btn parametrelerini salamak veya btn metodlarn kullanmak zorunda deiliz. Yukardaki rnee gre yeni rnekler oluturarak en az drt rencinin not ortalamasn hesabedebilir misiniz? PHP ile Web programcl yolunda hzl admlarla yol alyoruz. Bu blmde grdmz dizi deikenler ve nesneler, Web sayfalarmzda bir ok ii adeta otomatik hale getirecek unsurlar olarak kullanlacak.

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:62

PHP banda
PHP'de bir program oluturmaya ve programn akn kontrol etmeye yetecek kadar bilgi sahibi olduk. Bu blmde, bu bilgilerimizi uygulamaya koyacaz; ve bu arada hal renmemiz gereken bir iki noktaya ayrntl olarak deineceiz. zellikle metinlerin dzenlenmesi konusuna bakmamz ve ve Dzenli fadeler (Regular Expressions) denen kavramla tanmak ve bunun aralarn renmek zorundayz. PHP'nin ibanda olmas demek, PHP bilgimizi HTML sayfalarmz PHP ile oluturma, Form bilgilerini derleme, bir veritabanndan veri alarak bunlar sayfalarmzda kullanma ve ziyaretinin verecei bilgileri veritabanna ileyebilmek demektir. imdi kollar yeniden svayalm ve PHP'yi uygulamaya koyulalm.

Formlar
Web sunucusu ve istemcisi (Browser) arasndaki etkileme ve alveriin nasl ilediine ilikin bilgilerimiz olduunu varsayarak, sadece Internet'te Form, bir Web sayfasnn ziyaretiden veri alabildii ve bunlar Web sunucusuna ulatrabildii balca ara olduunu hatrlayalm. Form, ziyaretinin bizim istediimiz bilgilerin yan sra ziyaretinin bilgisayarndan Web sunucusu bilgisayara, daha bir ok bilgiyi de beraberinde getirir. Web programcs ve Web tasarmcs olarak bu bilgileri bilmeye daima ihtiyacmz var. Sz gelimi, ziyaretimizin Browser trn ve srm belirleyerek, onu, uygun sayfaya ynlendirmekten tutun, ziyaretiden istediimiz bilgilerin Sunucu'ya ulatnda nerede ve hangi deikende tutulduuna kadar, gerekli bir ok bilgi Sunucu ievre deikenleri ve Sunucu deikenleri dediimiz dizilerde bulunur. Form tasarmna ve bir Form'un bilgilerini PHP ile yakalamaya ve ilemeye gemeden nce Web Server' ve bize verdii bilgileri daha yakndan tannamz yararl olur. Bunun iin nce u program formlar01.php adyla kaydedin ve altrn: <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 . " = } ?> </BODY> </HTML> imdi Browser penceresinde grdnz bilgileri irdeleyelim; nk biraz sonra ziyaretiden Form ile gelen verileri yakalarken ve ilerken bu bilgilerden yararlanacaz. (Bu program kiisel bilgisayarnzda, kiisel Web sunucuda altryorsanz, ayn " . $deger . "<br>");

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:63

programn gerek bir Unix-tabanl Web sunucuda (Apache) nasl sonu verdiini http://www.mycgiserver.com/~ocal/formlar01.php adresinde grebilirsiniz. Sunucu'nun oluturduu dier deikenleri ise http://www.mycgiserver.com/~ocal/php.php adresinde inceleyebilirsiniz.) Bu programla PHP'nin daima varolan $GLOBALS dizisinin yelerini grntlyoruz. $GLOBALS bir ilikili-dizi-deiken, yani deiken deerlerinin endeks ad (anahtar) bulunan bir dizi olduu iin, ierdii deerlere adlar ile ulaabiliriz. Bu programda, $GLOBALS'n anahtarlarn $anahtar, deerlerini ise $deer deikenine yazdryoruz ve bir foreach dngs ile Brnowser penceresine gnderiyoruz. Program altrdmz sisteme ve Web sunucu programna bal olmak zere, ekranmzda bir ok deiken grebiliriz. Bunlar arasnda btn HTTP Server programlar iin ortak ve Web programcs iin nemli deikenler unlardr: HTTP_ENV_VARS HTTP Sunucu programn almakta olan PHP dosyas iin oluturduu evre deikenlerinin yazl olduu dizi deiken. Bu deikenin iinde u unsurlar bulunur: HOSTNAME: Sunucunun IP adresi SHELL: Unix sisteminde kullanlan Shell program HOSTTYPE: Sunucunun ad ve srn OSTYPE: Sunucu'nun iletim sistemi HOME: alan programn kk dizini PATH: alan programn Sunucu'daki yolu HTTP_SERVER_VARS Sunucu programn almakta olan PHP dosyasna sunduu baz bilgilerin bulunduu dizi deiken. Bu deikenin iinde u unsurlar bulunur: PHP_SELF: alan PHP programnn bulunduu dizin ve ad PATH_TRANSLATED: alan PHP programnn fiziksel yolu HTTP_GET_VARS Bir Form'dan GET metoduyla alnan bilgilerin anahtar=deer iftleri olarak kaydedildii dizi deiken HTTP_POST_VARS Bir Form'dan POST metoduyla alnan bilgilerin anahtar=deer iftleri olarak kaydedildii dizi deiken HTTP_USER_AGENT Ziyaretinin bilgisayarnda kurulu Internet Browser program QUERY_STRING Form ile bilgi alrken GET metodunu kullandmz takdirde, Browser'n gnderecei bilgilerin tutulduu deiken REMOTE_ADDR Ziyaretinin bilgisayarna ISS tarafndan atanm IP adresi REQUEST_METHOD Form ile gelen bilgilerin gnderildii metod: GET veya POST REQUEST_URI O anda almakta olan PHP dosyasnn ad ve varsa bu ada eklenmi Query_String SCRIPT_FILENAME O anda almakta olan PHP programnn dosya ad SCRIPT_URI O anda almakta olan PHP programnn tam URL adresi SERVER_ADDR Sunucunun IP adresi SERVER_PROTOCOL Sunucunun HTTP protokolnn srm

Form'dan GET Metoduyla Gelen Bilgiler


Ziyaretilerimizin ne tr Browser kullandklarn HTTP_USER_AGENT deikeninin deerini alarak ve bu deerin iinde belirli anahtar kelimeleri aratarak bulabiliriz. Form ile gelen bilgiler, GET metodu ile alnyorsa, hem QUERY_STRING, hem de HTTP_GET_VARS dizisine kaydolur. POST metoduyla aldmz bilgileri HTTP_POST_VARS deikenin deerleri arasnda buluruz. Bunlar rendiimize gre, imdi gerekten bir HTML Form'u yapabil ve bununla ziyaretimizden bilgi alabiliriz.

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:64

Basit bir HTML Form'u tasarlayalm. Aadaki kodlar formlar02.htm adlyla 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"> Adnz, Soyadnz: <INPUT TYPE="TEXT" NAME="adi"> <br> Elektronik Adresiniz: <INPUT TYPE=TEXT" NAME="adres"> <br> <INPUT TYPE="SUBMIT" VALUE="Gnder Gitsin!"> <INPUT TYPE="RESET" VALUE="Vazge, Gnderme!"> </FORM> </BODY> </HTML> Bu Form'la Web tasarm yarmasna katlmayacamza gre, imdilik sadece Web Sunucuya bilgi gndermekte kullanabiliriz. Form'un ACTION parametresine dikkat ederseniz, formlar02_isle.php adl bir dosyann adn greceksiniz. Bu, ziyaretinin Gnder dmesini tklamasyla birlikte Form'un ierdii bilgilerin METHOD parametresinde pazl olan GET yntemiyle Sunucu'da gnderilecei programn addr. Bu sayfa, Browser'da yle bir grnt verecektir: imdi bir an iin ne olacan dnmeden, formu doldurun ve Gnder dmesini tklayn; ve Browser'nzdaki hata mesajna aldrmadan, URL adres kutusunda ne yazdn okuyun: http://server/formlar02_isle.php?adi=Muharrem+Ta%E7&adres=muharremtac@mynet.com Bu, HTTP protokolne gre GET yoluyla bilgi gndermekte kullanlan yntemin tam bir rneidir: Browser, GET yoluyla bilgi gnderecei zaman, Form'daki btn bilgileri URLEncoding denen sistemle kodlar; Form'un alan adlarna o alanlara ziyaretinin yazd bilgileri bir eittir iaretiyle ekler; bu tr alan=girdi iftlerinin arasna & (ve iareti) koyar ve gnderir. Web sunucu, bu bilgileri alnca, nce kendi oluturduu baz deikenlere (hem QUERY_STRING, hem de HTTP_GET_VARS dizisine) yazar ve sonra URL hanesinde ad yazl olan programa (sayfaya) verir. imdi bizim bu bilgilerin gnderildii PHP programn kendisine verilecek bu bilgileri ilemeye hazr ekilde yazmamz gerekir. u aadaki kodlar formlar02_isle.php adyla 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>

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:65

<?php print ("Sayn ?> </BODY> </HTML> imdi, Browser'nzda formlar02.htm sayfasn yeniden an, Form'u doldurun ve gnderin. Alacak sayfa, Form'un gnderecii bilgileri alacak ve kendi grnteleyecektir. Fakat burada grdnz gibi Sunucu'nun ziyaretiden gelen bilgileri depolad dizileri kullanmadk. Bunu yaparken, GET ile gelen bilgiler kendisinde verildiinde PHP programnn alan adlarn deiken ad, bunlarn karsnda yazl olan verileri de bu deikenin deeri saymasndan yararlandk. Fakat isteseydik, bu deikenleri, Sunucu'nun oluturduu dizilerden de alabilirdik. imdi hem Form'umuzu gelitirelim; hem de bu kez okuma iini Sunucu dizisinden yapalm. nce Form'umuzu deitirelim ve formlar03.htm adyla kaydedelim: <FORM ACTION="formlar03_isle.php" METHOD="GET"> Adnz, Soyadnz: <INPUT TYPE="TEXT" NAME="adi"> <BR> Elektronik Adresiniz: <INPUT TYPE=TEXT" NAME="adres"> <BR> Hangi notunuzu renmek istiyorsunuz? <BR> <SELECT NAME="hangi_not"> <OPTION>--Ltfen seiniz-<OPTION>Snav 1 <OPTION>Snav 2 <OPTION>Ortalama </SELECT> <BR> <INPUT TYPE="SUBMIT" VALUE="Gnder Gitsin!"> <INPUT TYPE="RESET" VALUE="Vazge, Gnderme!"> </FORM> Yeni Form'da yeni bir HTML unsuruna yer verdiimizi ve SELECT..OPTION etiketi ile ziyaretiye bir seim imkan verdiimizi gryorsunuz. imdi, bu Form'un gnderecei bilgileri ileyecek PHP programn yazalm. Aadaki kodlar formlar03_isle.php adyla 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"> <b>$adi</b>\n\n"); print ("<p>Elektronik adresiniz: <b>$adres </b></p>\n\n");

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:66

</HEAD> <BODY> <?php foreach ($HTTP_GET_VARS as $anahtar=>$deger ) { print ("<b>$anahtar = $deger <br>\n"); } ?> </BODY> </HTML> Demitik ki, Web sunucu, bir istemci Browser'dan kendisine GET yntemiyle yollanan Form bilgilerini $HTTP_GET_VARS adl dizi deikende tutar. Yine daha nce grmtk ki dizi deikenlerin iinde ya say ya da isim olarak bir anahtar ve bu anahtarn temsil ettii bir deer vardr. Burada, $HTTP_GET_VARS deikeninin anahtar ve deerlerini $anahtar ve $deger deikenlerine => operatrnn yardmyla, bir foreach dngs iinde atyoruz. Dng kullanmamzn sebebi, dizi deikenin iinde birden fazla anahtar=deer ifti bulunmas ihtimali bulunmas; dng olarak da foreach kullanmamzn sebebi dizide ka adet anahtar=deer ifti bulunduunu bilmememizdir. Form sayfasnn gnderdii bilgilerin nasl derlenip toplanp URL-koduyla Sunucuya gnderildiini, Form'un Gnder dmesini tkladmzda Browser'n URL adres hanesinde ilen bilgilerin grlecektir. Buradaki rnekte bu bilgi (HTTP blmn ve URL kodlarn kaldrarak): adi=ahika+Tabak&adres=stabak@somenet.com&hangi_not=Snav+1 eklindedir. Bu bilgi, sunucu tarafndan $HTTP_GET_VARS dizi deikeninin iine yazldna gre, daha nce grdmz gibi dizi deikenlerin anahtarlarn ve bu anahtarlarn temsil ettii deerleri bir dng iinde $anahtar ve $deger deikenlerine atarsak, daha sonra bu deikenlerin deerlerini Browser penceresine gndermemiz mmkn olur.

URL Kodlar
HTTP protokolne gre, temel ASCII listesi iinde yer almayan karakterler, ve tabi bu arada sadece Trke'de baz dier alfabelerde bulunan harfler, bir Form'da yer ald taktirde, Browser tarafndan URL emasna gre kodlanarak gnderilir. Geri bir ok HTTP sunucu programbu karakterlere tanyabilir ve bir dosyaya yazarken doru ekilde yazabilirler; ama bu evirme ileminin bazen program yardmyla yaplmas gerekebilir. Bizim iin nemli karakterler ve URL kodlar yle: = %FC = %E7 = %DC = %C7 = %F6 % = %25 = %D6 & = %26 = %FD [ = +%5B = %DD ] = %5D = %F0 { = %7B = %D0 } = %7D = %FE ? = %3F = %DE = = %3D

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:67

imdi biraz dizi-deiken iine dizi-deiken koyalm! Yani ziyaretinin gnderecei bilgiler, buradaki gibi SELECT..OPTION etiketinde yapaca sadece bir unsur seimi olmasn da oklu-seim olsun. HTML bilgilerinizi yoklarsanz, bunu SELECT etiketini MULTIPLE parametresi ile yapabildiimizi hatrlayacaksnz. Biraz nceki kaydettiimiz dosyann sadece Form blmn aadaki gibi gelitirerek, formlar03a.htm adyla kaydedelim: <FORM ACTION="formlar03a_isle.php" METHOD="GET"> Adnz, Soyadnz: <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>Snav 1 <OPTION>Snav 2 <OPTION>Ortalama </SELECT> <BR> <INPUT TYPE="SUBMIT" VALUE="Gnder Gitsin!"> <INPUT TYPE="RESET" VALUE="Vazge, Gnderme!"> </FORM> Burada, HTML'in SELECT.. OPTION etiketlerini kullanarak, ziyaretimizden hangi snav notunu renmek istediini bize bildirmesini istiyoruz. Dikkat ettiiniz gibi, bu kez Form, elde edecei verileri formlar03a_isle.php programna yollamak istiyor. Form'daki <SELECT NAME="hangi_not[]" MULTIPLE> satrna da dikkat ettiniz mi? Bu satrn zellii, daha nceki SELECT..OPTION etiketinden farkl olarak ziyaretinin oklu seme yapmasna imkan veriyor; ve elde edilecek deeri "hangi_not[]" alannn deeri olarak bildiriyor. HTTP iletiim ilkelerine gre oklu-seim halinde seilen OPTION deerleri Sunucu'ya ayn alan adnn karsna yazlarak gnderilir. Formumuzun gnderecei bilgi yuman satrlar haline getirirsek (HTTP blmn atar ve URL kodlarn zersek) bunu grebiliriz: adi=ahika Tabak adres=stabak@somenet.com hangi_not[]=Snav 1 hangi_not[]=Snav 2 hangi_not[]=Ortalama Kendisine byle bir bilgi yuma gelen Server, bunun tmn $HTTP_GET_VARS dizi deikeninin iine yazacaktr. Baka bir deyile, bu dizi deiken ok-boyutlu ok-elemanl ilikili-dizi olduu iin, iinde rahata ayn isimde deikenlere farkl endeks says verecektir. Fakat sorun PHP'nin, bu dizinin iinden deikenleri almasnda ortaya kacak ve endeks ismi ayn olan deikenler sorun olacaktr. Bunu deikenin endeks ad olarak kullanlacak kelimenin yanna keli parantez koyarak zyoruz. PHP bu ad grnce, bunun ok-elemanl bir dizi deiken olacan anlayacaktr. Eer bu formu, formlar03_isle.php programna gnderseniz (bunu nasl yapabilirsiniz?), "hangi_not" deikeninin deeri olarak Browser penceresinde "array" kelimesinin belirdiini grebilirsiniz. nk PHP asndan bu deiken bir dizidir ve iinde

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:68

anahtar=deer iftleri vardr. Daha nce anahtar=deer iftlerini geici deikenlere atayp bir dng ile yazdrmtk. imdi, PHP kodumuzu bu duruma uygun hale getirelim. Biraz nce yazdmz Form ileme programnn sadece PHP blmn yle deitirerek, formlar03a_isle.php adyla kaydedelim: <?php foreach ($HTTP_GET_VARS as $anahtar=>$deger ) { if ( gettype ($deger ) == "array" ) { print ("$anahtar == <br>\n"); foreach ( $deger as } else { print ("<b>$anahtar = $deger <br>\n"); } } ?> PHP'nin gettype() fonksiyonunu daha nce grm ve bir deikenin trn anlamaya yaradn renmitik. Burada $HTTP_GET_VARS deikeninden aldmz deerlerden herhangi birinin gerekten bir deiken deeri mi, yoksa bir dizi (array) mi olduunu gettype() ile anlayabiliriz. Eer deer olarak karmza "array" kelimesi karsa, bunu kendi iinde anahtar ve deer olarak blebilir ve herbirini ayr ayr grntleyebiliriz. Eer $HTTP_GET_VARS deikeninden aldmz deer, dizi deil de gerekten bir deiken ise (else) doruca bu deeri ve anahtarn yazdracaktr. Sonu ise dizi-deiken iindeki dizideikenin deerlerinin tek tek grntlenmesi olacaktr. $yeni_degerler ) print (".. $yeni_degerler<br>");

Form'dan POST Metoduyla Gelen Bilgiler


HTML Form etiketinin METHOD parametresinin deeri GET olabildii gibi POST da olabilir; ve HTTP sunucusu bu yntemle gelen bilgileri $HTTP_POST_VARS dizi-deikeninde tutar. Yukardaki ok-semeli Form'un FORM etiketini yle deitirerek, formlar03b.htm adyla kaydedelim: <FORM ACTION="formlar03a_isle.php" METHOD="POST"> Ayn ekilde son Form ileme programmzda da sadece u deiiklii yapalm: foreach ($HTTP_POST_VARS as $anahtar=>$deger ) { Bu dosyay da formlar03b_isle.php adyla kaydedelim. HTML sayfasn aarak formu doldurur ve gnderirseniz, sonucun metod olarak GET kullanan Form'dan hi farkl olmadn greceksiniz. nk PHP program bu Form'un gnderdii bilgilerin $HTTP_POST_VARS deikenine yazldn biliyordu. $HTTP_POST_VARS da PHP asndan iinde anahtar=deer iftleri olan bir dizi-deikendir; bu deikenin deerlerine de tpk daha nce olduu gibi eriiriz. HTTP asndan GET ile POST'un tek fark gelen deerlerin nerede nasl tutuldueundan ibaret deildir. GET ynteminde, bir Browser'n sunucuya gnderebilecei verinin uzunluu, Sunucunun ayarlarna bal olmak zere, snrldr. Oysa POST ile alacamz veri miktar, sadece sunucunun bulunduu bilgisayarn sabit disk alanyla snrldr. (Tabi bu gnmzde snrszdr, anlamna geliyor!) Bir baka fark, Browser'n GET yoluyla gnderdii verilerin (ve bu arada ziyaretinin parola olarak yazdklarnda ekrana yldz olarak kan metinler dahil) tm, sunucuya, URL-kodlanm metin olarak, Browser'n URL

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:69

adres hanesine de yazlmasdr. Bir ok kullanc iin bu bir gvensizlik belirtisi saylr. Bu iki unsur Formlarmzda metod olarak GET yerine POST kullanmann daha yerinde olduunu gsterir. Tedbirli Web programcl, zellikle birden fazla tasarmc ve programcnn birlikte alt ve Formlarda hangi yntemin tercih edildiini bilmenin kolay olmad projelerde, Form bilgisi ileyen PHP programlarmzda Form'da hangi metod kullanlm olursa olsun, ilyeyici programn iki duruma da elverili olmasn salamaktr. Szgelimi son yazdmz Form ileme programmz yle deitirir ve formlar03c_isle.php adyla kaydedersek, ve Form ieren HTML sayfasn bu program veri gnderecek ekilde deitirirsek (nasl?), her iki metodla gnderilen verileri ileme yeteneine 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 } else { print ("<b>$anahtar = $deger <br>\n"); } } ?> $yeni_degerler ) print (".. $yeni_degerler<br>");

Form ile ilemciyi Birletirelim


u ana kadar yaptmz btn Form rneklerinde, Form'un bulunduu HTML sayfas ile bu Form'un gnderecei verileri ileyen PHP program iki ayr belge halinde idi. Bu, buradaki rneklerde olduu gibi, ziyaretinin verdii bilgileri sadece Browser penceresine yazdran bir eitim almas iin belki uygun; ama gerek Web sitelerimizde ziyaretilerimizin verecei bilgileri ou zaman sadece onlarn Browser pencerelerinde gstermekle kalmayz, fakat bu bilgileri ya elektronik posta yoluyla kendimize yollarz, ya da sunucuda bir dzyaz veya veritabas dosyasna ileriz. Bu ve dier amalarla yapacamz Form ieren HTML sayfalar, aslnda PHP programmzn bir iinde yer alabilir; ya da baka bir deyile, Form'umuz ziyaretinin verecei bilgileri kendi bulunduu PHP programna gnderebilir! Bu karmak ifadeyi bir rnekle aalm. Yukarda yaptmz son HTML sayfas ile ve PHP programn yle birletirelim; ve bunu formlar04.php adyla kaydedelim: <?php if ( isset ( $HTTP_POST_VARS )) { print ("<HTML>\n"); print ("<HEAD>\n"); print ("<TITLE>PHP'de Formlar</TITLE>\n");

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:70

print ("<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO8859-9\">\n"); print ("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows1254\">\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 } 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=ISO8859-9\">\n"); print ("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows1254\">\n"); print ("</HEAD>\n"); print ("<BODY>\n"); print ("<FORM ACTION=\"$PHP_SELF\" METHOD=\"POST\">\n"); print (" Adnz, Soyadnz: <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>Snav 1 \n"); print ("<OPTION>Snav 2 \n"); $yeni_degerler ) print (".. $yeni_degerler<br>");

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:71

print ("<OPTION>Ortalama \n"); print ("</SELECT>\n"); print ("<BR>\n"); print ("<INPUT TYPE=\"SUBMIT\" VALUE=\"Gnder Gitsin!\">\n"); print ("<INPUT TYPE=\"RESET\" VALUE=\"Vazge, Gnderme!\">\n"); print ("</FORM>\n"); print ("</BODY>\n"); print ("</HTML>\n"); } ?> Bu dosyann tmyle PHP program olduuna dikkat ettiniz, tabi? Program aldnda sunucunun $HTTP_POST_VARS dizi-deikeninin bir deer ierip iermediini bir if deyiminin iinden bir deikenin ierii olup olmadn anlamamza yarayan isset () fonksiyonu ile yapyoruz. Bu art doru ise, yani $HTTP_POST_VARS dizi-deikeni bir deer ieriyorsa, program, foreach dngsnn iinde bu deikenin iindekileri almaya ve Browser penceresinde grntlemeye balyor. Bu art doru deilse, yani $HTTP_POST_VARS dizi-deikeni henz bir deer iermiyorsa, if deyiminin birinci blmn iindeki hi bir kod icra edilmiyor ve prgram else deyimine sryor. Programn else blm ise daha nceki HTML kodlarmz ieren bir dizi print() fonksiyonu yerine getiriyor; yani Browser'a iinde Form bulunan HTML sayfasn yazdryor. Burada FORM etiketine dikkat edelim: print ("<FORM ACTION=\"$PHP_SELF\"METHOD=\"POST\">"); Form'un ACTION parametresinde bir PHP programnn ad yerine "$PHP_SELF" deiken adn gryoruz. Bu, bu blmn banda ele aldmz gibi, sunucunun bu PHP programna salad evre deikenlerinden biridir ve o anda almakta olan PHP programnn dosya adn ierir. (Bizim rneimizde bu deikenin deeri nedir?)

Dosya "kartma"
Internet'ten hep dosya "indiririz!" Bir sunucuya, Web ziyaretisi olarak gnderebildiimiz tek ey ise, Formlara yazdmz yazlardr! Oysa HTML'in INPUT INPUT etiketinin ok az kullanlan TYPE="file" parametresi ziyaretiye Web sunucusuna dosya gnderme (upload) imkan salar. HTTP protokol buna imkan vermekle birlikte Browser'lar bu imkan kullanmaya ileri srmlerinde kavutular. PHP4, ziyaretilerimizin sitemize dosya gndermeleri halinde, bu dosyalarn ynetimine ayrca kolaylk salayan deikenlere sahiptir. nce u dosyay, dosya_gonder.php adyla kaydedin: <HTML> <HEAD> <TITLE>PHP'de Dosya Gnderme</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/";

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:72

$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>Tr:</b> $dosya_gonder_type<br>\n"); copy ( $dosya_gonder, "$dosya_dizin/$dosya_gonder_name" )or die ("Dosya kopyalanamyor!"); 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 kullandmz NAME parametresine verdiimiz deer, ziyaretimizin gnderecei dosyann sunucu tarafndan kaydedilecei geici dizinin tam yolunun yazlaca deikenin ad olacakdr. PHP, bu dosya ile ilgili her trl bilgiyi bu adla kaydedektir. PHP, ziyaretiden bir dosya baaryla aktarld anda otomatik olarak bu isimden yararlanarak u deikenleri oluturur: $dosya_gonder Geici kayt dizini yolu (UNIX'te /tmp/phpXXX, Windows'da Windows/TEMP0phpXXX. Burada XXX yerine ziyaretilerin gnderdii dosyalarn sra numarasn greceksiniz.) $dosya_gonder_name Ziyaretinin gnderdii dosyann ad. $dosya_gonder_size Ziyaretinin gnderdii dosyann boyutu. $dosya_gonder_type Ziyaretinin gnderdii dosyann tr PHP ayrca bu bilgileri $HTTP_POST_FILES dizi-deikeninde de tutar. Yukardaki programda u iki deiken ok nemlidir: $dosya_dizin = "/inetpub/wwwroot/"; $dosya_url = "http://server/"; $dosya_dizin adyla oluturduumuz deikene vereceimiz deer, ziyaretinin gnderecei dosyann kopyalanaca klasrn ad olarak kullanlacaktr. Szgelimi Windows ortamnda buraya kiisel Web sunucunun varsaylan klasrnn adn yazabilirsiniz. Ziyaretinin gnderecei dosya bir GIF biiminde grafik dosyas ise bunu Browser'da grnteleyeceimiz iin, bu dizinin Web'e ak olmas, baka bir deyile bizim Web

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:73

sunucumuzun eriebilecei bir dizin olmas gerekir. Nitekim, $dosya_url deikenine deer olarak bu klasrn URL adresini veriyoruz. Bu iki deikeni gerek Web sunucu iin yazacamz zaman, bizim sunucumuzun varnayd fiziksel klasr adn ve yolunu bulmamz gerekir. Bunu daha nce yazdmz php.php veya formlar01.php programlarn sitemizde altrarak bulabiliriz. (Nasl?) Szgelimi, http://www.mycgiserver.com/~ocal/ adresindeki sitenin fiziksel adresi ile bu adresin URL'ini dikkate alarak bu iki deikeni yazm olsaydk, unu yazacaktk: $dosya_dizin = "/wwwroot/mycgiserver.com/members/uNhM13/"; $dosya_url = "http://www.mycgiserver.com/~ocal/"; Bu uygulamay kendi sunucunuzda yapmak isterseniz, mutlaka bu iki deikeni doru yazmanz gerekir. http://www.mycgiserver.com/~ocal/ dosya_gonder_server.php program ile bir dosya gnderme (upload) ileminin sonucu yle:

Dosya lemleri
Web programcs olarak ziyaretinin bize gnderecei bilgileri yakalamay rendik. imdilik sadece ziyaretinin Browser'na geri gnderdiimiz bu bilgileri, sunucu tarafndan eitli ilemlerde kullanabiliriz. Bu ilemlerin banda dosya girdi/kt ilemleri gelir. Baka bir ifade ile ziyaretiden aldmz bu bilgileri sunucuda bir dosyaya yazdrabiliriz. Bu blmde PHP ile sunucuda yapabileceimiz dosya ilemlerine bakacaz. Tabi dosya ilemleri dendiinde sadece ziyaretiden aldmz bilgileri bir dosyaya yazdrmakla yetinmeyeceiz; PHP programlarmza sunucuda bir dosyada bulunan bilgileri okumasn da reteceiz.

Harici Dosya (include)


PHP programlarmzda bilmemiz gereken ilk dosya ilemi, bir PHP programna, kendi dndaki dosyay, tabir yerinde ise, okutmak ve iindekileri aynen alp, grntlemesini salamaktr. Bunu include komutu ile yaparz. Bu komut, kendisine ad verilen dzyaz dosyasnn ieriini aynen bu komutun bulunduu noktaya "yazar." Bu yolla bir PHP programna sk kullandnz bir metni veya program parasn dahil edebilirsiniz. Bir gvenlik nlemi olarak bu tr dosyalarn uzantlarn, sunucu ve Browser'larn tand MIME trlerine ait uzantlardan farkl yaparsanz, ziyaretiler ans eseri de olsa bu dosyalar doruca edinme imkan bulamazlar. Bir rnek yapalm. nce u metni, harici_dosya01.x adyla ve dzyaz biiminde kaydedin (Windows ortamnda Notepad'i kullanyorsanz, dosya ad uzatmas olarak .x harfinden sonra .txt harflerini eklediine dikkat edin!): "Ben harici bir dosyann iindeki yazym.. Beni bir PHP program alp buraya getirdi! Kendisine teekkr ederim" Sonra, u program dosya_ekle01.php adyla kaydedin, ve Browser'da an: <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");

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:74

print ("\n<p> Ben zaten bu programnn iinde olan bir yazym. Batan beri burada olduuma ok memnununum.. Harici dosyaya hogeldin diyorum!</p>"); ?> </BODY> </BODY> </HTML> Buradaki include komutu biraz nce yazdmz harici dosyay alacak, ieriini aynen kendi bulunduu noktada, PHP'nin oluturaca HTML dosyasna katacaktr. Bu program altrdnzda grnt yle olacaktr: Bu grnty aldnz srada Browser'nzda kayna grntlerseniz, iki metnin adeta birletirilmi olduunu greceksiniz. Fakat dardan PHP programna sadece dz metin eklemeyiz; program veya fonksiyon da ekleyebiliriz. Harici dosyada u deiiklii yaparak, harici_dosya02.x adyla kaydedin. <?php print ("Ben de harici dosyaym.!<br>"); print ("Ama ben hesap da yaparm.. rnein iki iki daha ". (2 + 2). " eder!"); ?> Haric dosya okuyan program da program iinde, okunacak dosya adn dzelttikten sonra dosya_ekle02.php adyla kaydedin; ve altrn. Haric dosyamzda yer alan ...iki iki daha ". (2 + 2). " eder!"); eklindeki ifadenin programa gelirken "..iki iki daha 4 eder!" ekline gelmesinin izah, PHP'nin dardan ald dosyann iinde PHP program olduunu grd anda, bu dosyann ieriini metin olarak deil, program olarak ele almasdr. Bu yolla, PHP programlarmza bir deerin dnmesini de salayabiliriz. Haric dosyamzda u deiiklii yapalm ve harici_dosya03.x adyla kaydedelim: <?php $sonuc = ( 2 + 2 ); return $sonuc; ?> Bu satr bakalm programa dahil olacak m? Sonra, program metninde u deiliklii yaparak, dosya_ekle03.php adyla kaydedin ve altrn: <?php $donen_sonuc = include("harici_dosya03.x"); print ("\n<p> Harici dosyadan dnen sonu: $donen_sonuc </p>"); ?> Haric dosyamzn iindeki program, return komutu ile sadece kendi iinde elde ettii sonucu, onu aran programa verdi; ve bu sonucu alan programmz, sadece kendi iindeki bir deikenin deerini Browser'a gnderdii halde, bu deer haric dosyadan alnm oldu. Haric dosyalarn include yoluyla PHP programlarmza katlmas, zellikle bir sitenin bir ok programnda sk sk kullanlan metinlerin ve hesaplamalarn bir kere yazlmasn ve tek satrla arlmasn salad iin kolaylk salar ve hata ihtimalini azaltr.

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:75

include mu, require m?


PHP4.0 ile, include komutu gibi ileyen ancak ondan farkl olarak kendisini aran programa deer veremeyen require komutu da kullanlabilir hale geldi. inde bir hesaplama bulunmayan veya kendisini aran dosyaya bir return komutu ile bir deer dnmesini salamas beklenmeyen dosyalar require komutu ile de ana programmza dahil edebiliriz. include ile alacamz dosyalarn adn PHP programnn oluturmasn salayarak kimi zaman pogramlarmza dinamizm salamamz mmkndr. Szgelimi bir men maddesinin tklanmasyla harekete geen bir Javascript fonksiyonunun, ziyaretinin gidecei sayfaya gnderecei deeri include komutuna dosya ad oluturmakta kullanabiliriz. Bazen include komutuna dosya ad oluturmakta program iindeki dnglerden yararlannz. rnek: for ( $i = 1 ; $i <= 3 ; ++$i) { include ("dosya0" . $i . ".x"); } Haric dosyalarmzn adlarnn dosya01.x, dosya02.x ve dosya03.x olmal halinde, bu dng srasyla her dosyay da aracak ve altalta ana programa dahil edecektir.

Dosyalar hakknda bilgi


PHP'de yukarda ele aldmz include ve require komutlar ve biraz sonra deineceimiz dosya okutma ve yazdrma ilemleri dolaysyla bir dosyann varl veya yokluu, ya da bir dosyaya ait sandmz ismin bid klasre ait olmas, programmzn salkl ileyebilmesi asndan byk nem tar. PHP bu amala bize bir ka kullanma hazr fonksiyon salyor. Burada ksaca bu fonksiyonlara ve nasl kullanldklarna deinelim:

Dosya var m? file_exits()


Bir dosyann var olup olmadn denetleyen bu fonksiyon, dosya varsa true/doru, 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 klasrler de tpk dosyalar gibi adlandrlabilir. Bir dizinde grdmz ismin gerekten bir dosyaya ait olup olmadn bu fonksiyonla snarz. Snama doru, yani isim bir dosyaya ait ise fonksiyon true/doru, deilse false/yanl sonu verir. rnek: if ( is_file ( "bir_dosya.txt" ) ) print ("Bu bir dosyadr!"); sim bir dosyaya ait deilse program "Bu bir dosyadr!" yazmadan yoluna devam edecektir. Snamay ismin bir klasre ait ait olup olmadna bakrarak da yaparz. Bu durumda is_dir() fonksiyonunu kullanrz. isim bir dizine aitse fonksiyon true/doru, deilse false/yanl sonu verir. rnek: if ( is_dir ( "/bir_isim" ) ) print ("Bu bir dizindir!"); sim bir dizine ait deilse program "Bu bir dizindir!" yazmadan yoluna devam edecektir.

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:76

Dosya okunabilir mi? is_readable()


Programda kullanmaya karar vermeden nce bir dosyann eriilebilir ve PHP tarafndan okunabilir olup olmadn snayan bu fonksiyon, dosya okunabilir ise true/doru, deilse false/yanl sonu verir. rnek: if ( is_readable ( "bir_dosya.txt" ) ) print ("Bu dosya okunabilir!"); Dosya okunabilir deilse program "Bu dosya okunabilir!" yazmadan yoluna devam edecektir. (Unix ortamnda varln grebildiimiz her dosyann okuma izni bulunmayabilir.)

Dosya yazlabilir mi? is_writable()


Programda kullanmaya karar vermeden nce bir dosyann yazlabilir olup olmadn snayan bu fonksiyon, dosya yazlabilir ise true/doru, deilse false/yanl sonu verir. rnek: if ( is_writable ( "bir_dosya.txt" ) ) print ("Bu dosyaya yazlabilir!"); Dosya yazlabilir deilse program "Bu dosyaya yazlabilir!" yazmadan yoluna devam edecektir. (Unix ortamnda varln grebildiimiz hatta okuyabildiimiz her dosyann yazma izni bulunmayabilir.)

Dosya altrlabilir mi? is_executable()


PHP programnda kimi zaman sunucunun kullanmamza izin verdii haric programlar altrz; PHP programmzn dzgn ilemesi bu harici programa bal olabilir. Byle bir program altrmaya karar vermeden nce bir dosyann altrlabilir olup olmadn snayan bu fonksiyon, dosya altrlabilir ise true/doru, deilse false/yanl sonu verir. rnek: if ( is_executable ( "bir_dosya" ) ) print ("Bu dosya altrlabilir!"); Dosya altrlabilir bir program deilse PHP program "Bu dosya altrlabilir!" yazmadan yoluna devam edecektir. (Unix ortamnda varln grebildiimiz her pprogram dosyasnn altrma izni bulunmayabilir.)

Dosya boyutu: filesize()


Adn verdiimiz dosyann boyutunu byte olarak bildirir: rnek: print ("Dosyann boyutu:"); print filesize( "bir_dosya.txt" );

Dosyaya son eriim tarihi: fileadate(), filemtime() ve filectime()


Adn verdiimiz dosyaya son eriim tarihini bildirir. ne var ki bu bilgi Unix'in "epoch" biimindedir: rnek: print ("Dosyann son eriim tarihi:"); $dosya_tarihi = fileadate( "bir_dosya.txt" ); print ( " $dosya_tarihi " ); Eer bu dosyann son eriim tarihi 28 Temmuz 2000, Cuma 24:00:00 ise, PHP, Browser penceresine 964731600 yazacaktr. Bu komutun rettii bilgiyi, date() fonksiyonu ile anlalabilir hale getirebiliriz: print ("Dosyann son eriim tarihi:");

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:77

$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 yazdracaktr. Tarih verilerinin date() fonksiyonu ile biimlendirilmesini daha sonra ayrntl ele alacaz. filemtime(), bir dosyann son deitirildii tarihi; filectime(), ise oluturulduu tarihi, yine Unix Epoch biiminde bildirir; bu verinin anlalr biimde grntlenmesi iin PHP'nin date() fonksiyonu kullanlr.

Dosyalar oluturma ve silme


PHP ile yapabileceimiz nemli dosya ilemlerinin banda olmayan bir dosyay oluturmak ve olan bir dosyay silmek gelir. PHP'nin dosya oluturma komutu touch() fonksiyonudur. Bu fonksiyona oluturulmasn istediimiz dosyann adn vermemiz gerekir. rnek: <?php $dosya_dizin = "/inetpub/wwwroot/"; touch ("$dosya_dizin/yeni_belge.txt"); print ("yeni_belge adl bir dosya oluturuldu!"); ?> </BODY> </HTML> Bu program kiisel Web sunucuda denerken yeni dosyann oluturulaca dizin olarak "/" iaretiyle sadece kkdizini belirtirseniz, dosya C: diskinde kkdizinde oluturulur. Bu program gerek sunucuda altrabilmek iin yazma/okuma izni bulunan ve Web sunucunun eriebilecei bir dizinin adn vermeniz gerekir. rnein: <?php $dosya_dizin = "/wwwroot/mycgiserver.com/members/uNhM13Qnm/"; touch ("$dosya_dizin/yeni_belge.txt"); print ("yeni_belge adl bir dosya oluturuldu!"); ?> Bu komutla oluturacanz dosya ii bo bir metin dosyas olacaktr. Eer belirttiiniz dizinde bu ad tayan bir dosya varsa, PHP dosyann ieriine dokunmayacak, fakat dosyann eriim ve deiim tarihlerini deitirecektir. PHP ile mevcut bir dosyay silmek iin unlink() fonksiyonunu kullanrz. Bu fonksiyon da silinecek dosyann 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 ilemeyebilir.

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:78

Dosya ama
PHP'de bir dosyann ieriini alarak sayfalarmzda kullanma veya bir dosyann ieriini deitirmek gibi ilemler iin nce dosyann alm olmas gerekir. Bunu gerekletiren fopen() fonksiyonudur. Bu fonksiyonla bir dosyay okumak ('r'), yazdrmak ('w') veya ek yapmak ('a') iin aabiliriz. Bu fonksiyon dosyann baaryla almas halinde bir tamsay verecektir. PHP programlarmzda, alan dosyann mutlata ona iaret eden bir deikene (file pointer) bal olmas gerekir; daha sonra bu dosya ile ilgili btn ilemleri bu iaret deikeni ile yaparz. rnek: $dosya = fopen( "bir_dosya.txt" , 'r' ); PHP, bu dosyay sadece okumak amacyla aacak ve fonksiyondan dnen deeri $dosya deikenine atayacaktr. Olmayan bir dosyay amak istediimiz zaman PHP hata mesaj verir. Bir dosyay yazmak amacyla aacamz zaman, bu kodu yle yazarz: $dosya = fopen( "bir_dosya.txt" , 'w' ); Olmayan bir dosyay yazmak amacyla amak istediimizde PHP nce bu dosyay oluturur. Bir dosyaya ek yapmak istediimiz zaman ise kodumuz u ekilde yazlr: $dosya = fopen( "bir_dosya.txt" , 'a' ); Olmayan bir dosyay ek yapmak amacyla amak istediimizde PHP hata mesaj verir.

Bir Fonksiyonu durdurmak iin: l!


Bir PHP fonksiyonunun kendisinden beklenen ii yapamamas halinde orackta durdurulmasn die() komutu salar. "l!" anlamna gelen bu fonksiyona ekranda grntlenmesini istediimiz bir metni parametre olarak verebiliriz. Bu blmdeki rnekler bu komutla birlikte yle yazlabilir: $dosya = fopen( "bir_dosya.txt" , 'a' ) or die ("Dosya alamyor!") ; Bu komutu kiisel Web sunucusunda denerken, dosyann alaca dizinin yolunu belirtmemiz gerekir. rnein: <?php $dosya_dizin = "/inetpub/wwwroot/"; if ($dosya = (fopen ("$dosya_dizin/bir_dosya.txt" , 'r') ) ) { print ("Dosya ald!"); } else { print ("Dosya alamad!"); } ?> PHP, bu dosyay atnda Browser penceresinde dosyann aldn belirten mesaj grntlecektir. Bu ilemi Internet'teki bir Web sunucuda uygulayabilmek iin yazma/okuma izni bulunan ve Web sunucunun eriebilecei bir dizinin adn vermeniz gerekir. rnein: <?php $dosya_dizin = "/wwwroot/mycgiserver.com/members/uNhM13Qnm/"; if ($dosya = (fopen ("$dosya_dizin/bir_dosya.txt" , 'r') ) ) {

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:79

print ("Dosya ald!"); } else { print ("Dosya alamad!"); } ?> Atmz bir dosya ile yaptmz btn ilemler bittikten sonra, dosyann kapatlmas gerekir. Dosya kapatma ilemini fclose() fonksiyonu yapar. Bu fonksiyona parametre olarak dosya adn deil, dosyann iaretisi olan deikenin adn veririz. rnek: fclose ( $dosya );

Dosya okuma: fgets(), fread() ve fgetc()


Atmz bir dosyann iindeki yazlar ou zaman programmza satr satr okuturuz. PHP'de bir dosyann ieriini satr satr okutmamz fgets() fonksiyonu salar. Bu fonksiyona daha nce alm olan dosyann iaret deikenin adn ve okunmasn istediimiz asgari byte lsn parametre olarak veririz. fgets() fonksiyonu verdiimiz uzunluk lsne ulamadan nce dosyada bir yeni satr iareti grrse, veya dosyann sonuna ularsa, okumaya son verir. Bu fonksiyonu ou zaman bir dngnn iinde kullanrz. Ancak dngnn hata vermemesi iin, PHP'nin dosyann sonuna ulatnda dngy durdurmamz gerekir. fgets() fonksiyonunun okuyaca satr bir fonksiyona deer olarak verebilir ve daha sonra bu deeri programlarmzda kullanabiliriz. rnek: <?php $dosya_dizin = "/inetpub/wwwroot/"; if ($dosya = (fopen ("$dosya_dizin/bir_dosya.txt" , 'r') ) ) { print ("Dosya ald!<br>"); } else { print ("Dosya alamad!"); } while ( ! feof ($dosya ) ) { $satir = fgets ( $dosya, 1024 ) ; print ("$satir<br>"); } fclose ($dosya); ?> Bu program kiisel Web sunucuda nce varolan bir dosyay ayor; ve bu dosyann iaretisi olarak $dosya deikenini kullanyor. Daha sonra bir while() dngs iinde bu deikeni ve 1 KB (1024 byte) lsn parametre olarak vererek fgets() fonksiyonu ile dosyadan bir satr okutuyoruz. fgets() fonksiyonundan dnen bir satrlk metni, burada $satir deikenine atyoruz; ve daha sonra print() fonksiyonu ile bu satr Browser penceresine gnderiyoruz. Bu ilemi Internet'teki bir Web sunucuda uygulayabilmek iin yazma/okuma izni bulunan ve Web sunucunun eriebilecei bir dizinin adn vermeniz

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:80

gerekir. Bu ilemin iinde yapld while() dngsnn devam art olarak kullandmz ifadede yer alan feof() fonksiyonu bir dosyann dosya-sonu (end-of-file) durumuna ulap ulamadn snar. PHP, her dosyann sonunda yer alan eof (Ctrl-z, ^z) iaretine eritii anda feof() fonksiyonu doru/true deerini verir. while() dngs, feof() doru deilken devam etmek zere kurulmu olduu iin, dosya sonuna ulatmzda dng duracaktr. Okuma ilemini durabilen bir dngye balamazsak, fgets() PHP'nin bir programn sona ermesi iin verilmi varsaylan sresi doluncaya kadar dosyay okumak isteyecektir. Kimi zaman dosyalarmzn ieriini satr-satr okutmak yerine, kendi tayin edeceimiz uzunlakta paralar halinde okutmak isteriz. Bunu, fread() fonksiyonu ile salarz. rnek: <?php $dosya_dizin = "/inetpub/wwwroot/"; if ($dosya = (fopen ("$dosya_dizin/bir_dosya.txt" , 'r') ) ) { print ("Dosya ald!<br>"); } else { print ("Dosya alamad!"); } while ( ! feof ($dosya) ) { $paragraf = fread ( $dosya, 1024 ) ; print ("$paragraf<br>"); } fclose ($dosya); ?> fread() fonksiyonu da daha nce alm olan dosyann iaret deikenin adn ve okunmasn istediimiz asgari byte lsn parametre olarak alr. fread() fonksiyonu verdiimiz uzunluk lsne ulamadan nce dosyada bir yeni satr iareti grrse, veya dosyann sonuna ularsa, okumaya son verir. Bu fonksiyondan yararlanrken, verdiiniz uzunluk lsnn, almak istediiniz metin parasna uygun olduunu snamalsnz. fread(), bu lye ulatnda okumay keser. Buradaki rnei 1024 byte lsn deitirerek ve mesela 1, 2, 3 yaparak deneyebilir ve bylece vereceiniz lnn okunan metnin uzunluunu nasl tayin ettiini grebilirsiniz.

fseek() ile l belirleme


PHP'nin dosya ileminde kullabileceiniz bir dier fonksiyonu fseek() adn tar. Daha nce alm olan dosyann iaret deikenin adn ve ve programn bu metin iinde zplamasn istediiniz noktann dosyann bandan itibaren byte deerini parametre olarak alan bu fonksiyon ile, bir dosyann iinnde istediimiz yere gitme imkan vardr. rnek: <?php $dosya_adi = "/inetpub/wwwroot/bir_dosya.txt"; if ($dosya = (fopen ($dosya_adi , 'r') ) ) { print ("Dosya ald!<br>"); } else {

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:81

print ("Dosya alamad!"); } $dosya_boyut = filesize($dosya_adi); $olcu = (int) ($dosya_boyut / 2 ); while ( ! feof ($dosya) ) { $paragraf = fread ( $dosya, $olcu) ; print ("$paragraf<br>"); } fclose ($dosya); ?> Burada, okutulacak dosyann boyutunun yarsn atadmz $olcu deikenini, okutulacak metnin ls olarak kullanyoruz. Bu durumda PHP, dosyay iki paragraf halinde grntleyecektir. Dosyalarmzn ieriini satrlar veya belirli lde paralar halinde deil de, tek-tek karakter olarak okutmak iin fgetc() fonksiyonundan yararlanrz. Bu fonksiyon, daima 1 byte lsnde (bir karakter) metin okuyabilecei iin, parametre olarak sadece daha nce alm olan dosyann iaret deikenin adn alr. rnek: <?php $dosya_adi = "/inetpub/wwwroot/bir_dosya.txt"; if ($dosya = (fopen ($dosya_adi , 'r') ) ) { print ("Dosya ald!<br>"); } else { print ("Dosya alamad!"); } while ( ! feof ($dosya) ) { $karakter = fgetc ( $dosya ) ; print ("$karakter<br>"); } fclose ($dosya); ?> Burada fgetc() fonksiyonundan dnen deeri (yani dosyadan okunan bir karakteri), $karakter deikenine atyoruz ve daha sonra print() fonksiyonu ba karakteri ve HTML'in satr blme kodu olan <br> iaretini Browser penceresine gnderiyor. Program bu ekliyle snarsanz, dosyadaki metnin tek karakter olarak Browser penceresinin soluna dizildiini greceksiniz. Program <br> kodunu silerek altrrsanz, bu kez dosyadaki metinde var olan satr sonu iaretlerinin de kaldrldn ve metnin bir paragraf olarak grntlendiini grebilirsiniz.

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:82

Dosyaya yazma ve ek yapma: fwrite() ve fputs()


Bir dosyaya yazma veya ek yapma, PHP asndan ayn ilemdir; sadece dosyalarn alnda fark vardr. Hatrlayacaksnz, bir dosyay yazmak amacyla amak iin: $dosya = fopen( "bir_dosya.txt" , 'w' ) or die ("Dosya alamyor!") ; ek amacyla amak iin ise $dosya = fopen( "bir_dosya.txt" , 'a' ) or die ("Dosya alamyor!") ; kodunu yazmamz gerekir. Dana sonra yaplacak yazma ve ekleme ilemlerinin fark, 'w' parametresi ile alan dosyaya yazma ilemi en bandan balar ve devam eder; 'a' parametresi ile aalan dosyaya yazma ilemi ise en sondan balar ve devam eder. PHP'nin bir dosyaya metin yazdrma fonksiyonlar olan fwrite() ve fputs() ayn biimde yazlr ve ayn ilevi yerine getirirler; aralarnda kesinlikle fark yoktur. rnek: <?php $dosya_adi = "/inetpub/wwwroot/bir_dosya.txt"; $dosya = fopen ($dosya_adi , 'w') or die ("Dosya alamad!"); $metin = "Bu satr dosyaya yazlacak: Merhaba Dnya!\n"; fwrite ( $dosya , $metin ) ; fputs ( $dosya , "Bu satr ise sonradan eklenecek\n" ) ; fclose ($dosya); ?> Bu program altrdnzda, bir_dosya.txt adl dosyada mevcut btn ierik silenecek ve yerini $metin deikeninin ierdii "Bu satr dosyaya yazlacak: Merhaba Dnya!" yazs ile "Bu satr ise sonradan eklenecek" cmlesi alacaktr. Her iki metnin sonunda da yeni satr iareti bulunduuna dikkat edin. Bu programda dosya ama komutundaki 'w' parametresini siler, yerine 'a' yazarsanz, bu metinler dosyann ieriine eklenir.

Kullanmdaki dosyay kilitleyin!


Web sunucusundaki dosyalarmzla sadece bir kii ilem yapyor olsayd, bir sorun olmazd; ne var ki, bir Web sitesine ayn anda birden fazla kii eriyebilir ve dosyalarla ilem yapan programlar altryor olabilir. Bu, PHP'nin dosya ilemlerine engel olabilir. Bu sebeple, ilem iin aacamz bir dosyay, nce kilitlemek yerinde bir nlem saylr. Bunu, flock() fonsiyonu ile yaparz; bu fonksiyona kilitlemek istediimiz dosyann iaret deikeninin adn ve kilit trn belirten endeks saysn parametre olarak yazarz. rnek: <?php $dosya_adi = "/inetpub/wwwroot/bir_dosya.txt"; $dosya = fopen ($dosya_adi , 'w') or die ("Dosya alamad!"); flock ( $dosya , 2); // dosyay kilitle $metin = "Bu satr dosyaya yazlacak: Merhaba Dnya!\n"; fwrite ( $dosya , $metin ) ; fputs ( $dosya , "Bu satr ise sonradan eklenecek\n" ) ; flock ( $dosya , 3); //dosyay kilidini a fclose ($dosya); ?>

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:83

Bu fonksiyon ile kullanabileceimiz endeks parametreleri unlardr: 1 Paylam Dier proseslerin dosyay paylamalarna imkan verir 2 Tam Dier proseslerin dosyaile ilem yapmasna engel olur 3 Serbest Dosyann 1 veya 2 olan kilidini kaldrr Bir dosya, herhangi bir PHP program tarafndan kilitlendii anda, ayn dsyay daha sonra kilitlemeye kalkan dier programlar kendilerinden nce konulmu kilide sayg gsterirler.

Dizinlerle lemler
PHP ile sunucuda, Web dizini olarak kullandmz alanda yeni dizinler oluturabiliriz, silebiliriz, ve bunlar hakknda bilgi edinebiliriz. Bu ilemleri Web sunucuda yapabilmek iin Web dizininde okuma ve yazma izni bulunmas gerekir.

Dizin ieriini listeleme: opendir() ve readdir()


Belirttiiniz bir dizindeki tm dosya ve alt-dizin adlarn bir liste, hatta ilikilendirilmi hypertext (kpr, link) listesi olarak sunabilmek iin nce dizini ieriini okuyabilmek iin opendir() fonksiyonu ile amak, sonra da iindeki bilgileri readdir() fonksiyonu ile edinmek gerekir. readdir() fonksiyonu dizinin iindeki alt-dizin ve dosyalarn adlarn srayla, tek-tek okur. Bu fonksiyondan gelen bilgileri bir deikene atayarak ve bir dng iinde yazdrarak, 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); ?> Kiisel Web sunucuda snama amacyla altrabilmek iin dizin ad olarak bu dosyann iinde bulunduu dizini verebiliriz. opendir() fonksiyonu da okunmak amacyla aaca dizine iaret eden bilgiyi bir deikene yazmak zorundadr; bu iaret deikenine burada $dizin adn veriyoruz. $dizin deikeninin iaret ettii dizini okuyan readdir() fonksiyonundan dnen bilgileri ise $bilgi deikenine yazyoruz. readdir() fonksiyonu dizin bilgisini okumannn sonuna vardnda, bir dosya ve dizin ad yerine doru veya yanl eklinde bir mantksal (boolean) deer verecektir; buradaki while dngs $bilgi deikeninin trn gettype() fonksiyonu ile srekli snayarak, henz dizin ve dosya ad edinildii srada bu bilgileri print() fonksiyonuna verecektir. Bu bilginin bir dizine ait olup olmadn is_dir() fonksiyonu ile snayan if dngs ise bilgi bir dizine aitse, bu bilgnin batarafna "[Dizin]" kelimesini yazdracaktr. (Bu program gelitirerek, nce dizinleri, sonra dosyalar yazabilen biime getirmek mmkndr. Bunun bir rnei bu kitap rnek kod dosyalar arasnda dizin_oku01a_server.php ve dizin_oku01a_pws.php aadyla bulhabilirsiniz.)

Dizin oluturma: mkdir()


PHP programlarmz gerektiinde sunucunun yazma yetkisi verdii Web'e ak kk ve altdizinlerde yeni dizinler oluturabilir. Bunu, mkdir() fonksiyonu ile yaparz. Bu fonksiyona

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:84

oluturulacak dizinin ad ve 8 tabanl (octal) say cinsinden ve nne bir sfr konarak dizinin okuma/yazma/altrma izinlerini belirten parametre verilir. rnek: mkdir ("deneme", 0777); Burada yer alan 0777, bu dizinin herkes iin okuma ve yazma izni olduunu gsterir. Bu parametre sadece Unix iletim sisteminde alan sunucular iin geerlidir.

Dizin silme: rmdir()


PHP programlarmzda gerektiinde sunucunun yazma yetkisi verdii Web'e ak kk ve alt-dizinlerde mevcut dizinleri silebiliriz. Bunu, rmdir() fonksiyonu ile yaparz. Bu fonksiyona oluturulacak dizinin ad parametre verilir. rnek: rmdir ("deneme");

Bir Dosya lemi rnei: Konuk Defteri


Bylece PHP ile "i yapmak" iin gerekli aralarmza bir yenisini ekledik. Artk PHP programlarmzdan sabit diskteki dosyalara ulamay ve dosyalarla almay biliyoruz. Buraya kadar rendiklerimizi bir PHP program zerinde uygulayabiliriz. Bunun iin birlikte bir konuk defteri yapalm. Diyelim ki konuk defterimize sadeceziyaretimizin adn, elektronik posta adresini ve ksa bir mesajn isteyeceiz. yle bir sayfa yapalm ki; ziyareti bu sayfay ilk kez atnda, yani henz Form'dan sunucuya bir veri gelmemi dolaysyla $HTTP_POST_VARS dizi deikenin iinde deer bulunmad srada, programmz bu durumu belirleyerek ziyaretiye konuk defteri Form'nu sunmal; ziyareti formu doldurup gnder dmesini tklad zaman programmz bir yandan ziyaretinin gnderdii bilgileri kendisine gsterir ve teekkrlerimizi aktarrken, dier yandan da bu bilgileri bir dzyaz program girmeli. Bu srada ziyaretimize isterse defterimizdeki dier mesajlar okuma imkan da sunabilmeliyiz. Biraz uzunca olan u program kd_01.php adyla kaydedelim. (Bu dosyay, kitapn rnek kodlar arasnda bulabilirsiniz; fakat bu altrmay bir dz yaz program ile buradaki rnek ifadeler ve alan/deiken adlarn deitirerek 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'> "); Programmzn buraya kadar olan blm, if ile $HTTP_POST_VARS dizi deikeninde deer bulunup bulunmadna ilikin snamann olumlu sonu vermesi halinde uygulanan blmne dahil. Burada dikkatini echo() fonksiyonu ile birden fazla satr yazdrdmz ekmi olmal. echo(), fonksiyonuna Browser penceresine gndereceimiz deerleri ift-

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:85

trnak iinde yazacamz iin, HTML etiketlerinin ift-trnak gerektiren etiketlerinde tek trnak kullandmza dikkat edin. if snavnn olumlu sonucuna ilikin blm 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 programmzHTML iin gerekli temel etiketleri rettikten sonra bu blmde veritaban dosyas olarak kullandmz mesajlar.txt isimli dosyann bulunup bulunmadn snyor; dosya varsa ek yapmak iin ('a'),dosya yoksa yazmak iin ('w'), dosyay ayoruz. Sonra, $HTTP_POST_VARS dizi-deikenine Form'dan gelmi olan anahtar=deer iftlerinin her birini (yani, Browser'dan gelen rnein "adi" deikeni ve bunun deeri olan ismi) nce print() ile ziyaretinin Browser'na, sonra da fputs() ile biraz nce atmz veritaban dosyasna yazdryoruz. Fakat burada bundan nce Form'dan kk harf olarak gelen deiken adlarn (anahtarlar) strtoupper() fonksiyonu ile byk harfe eviriyoruz.imdilik bu fonksiyonun zerinde durmayn; biraz sonra metin dzenleme ve dzenli ifadeler konusuna geleceiz. Ancak bu srada ziyaretilerin mesajlarn daha sonra gzel grntelemek iin aralarna izgi olarak kullanmak zere bir resim dosyasn IMG etiketi ile yerletirdiimize de dikkat edin. Bu grafik dsyasnn eni-boyu 1 piksel olduu halde burada ziyaretinin Browser penceresinin eni kadar genileterek 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>

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:86

<BODY> <P><font size='3' class='s4' face='Arial, Helvetica'> <center><img src='nokta.gif' width=100% height=1 border=0></center> Sayn: $adi<br> Defterimi imzaladnz iin teekkr ederim</P> <p>Ana Sayfaya Dnmek iin <A HREF=\"index.htm\"> tklayn</A><BR> Mesajlar okumak iin<A HREF=\"mesajlar.php\"> tklayn</A> </BODY> </HTML> "); } Programmzn bu blmnde, ziyaretiye teekkr ediyoruz; ve isterse dier mesajlar okumak zere tkllayaca kpry salyoruz. Mesajlarn ok uzamas halinde bu kpry bir sayfann stnde, bir de altnda vermekte yarar var. imdi, programmzn Form doldurulduktan sonra ileyen blmn yazm olduk. Taa en bata yaptmz $HTTP_POST_VARS dizi-deikeninin deer ierip iermediine ilikin snamann olumsuz olmas halinde, programmz, ie buradan balayacaktr: 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 iin <a href='mesajlar.php'> buray tklayn</a></FONT></P> <P><font size='3' face='Arial, Helvetica'> Adnz, Soyadnz: <br><INPUT TYPE=\"TEXT\" NAME=\"adi\"><BR> Elektronik Adresiniz: <br><INPUT TYPE=\"TEXT\" NAME=\"adres\"><BR> Mesajnz:<BR> <TEXTAREA NAME=\"mesaj\" ROWS=10 COLS=30 WRAP=virtual></TEXTAREA> <BR><BR><BR> <INPUT TYPE=\"SUBMIT\" VALUE=\"Defteri imzala!\"> <INPUT TYPE=\"RESET\" VALUE=\"Tmn sil!\"> </FORM>

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:87

</BODY> </HTML> "); } ?> Bu blmde ift-trnak iaretlerini deitirmek yerine, bunlar ESC karakteri ile zel iaret deil, metin olarak ele alnacak hale getirdik. Programmz burada yine echo() ile dz ve basit bir HTML Formu oluturuyor. Programn ak plann anlam olmalsnz: ziyareti nce Form'u dolduracak ve gnder dmesini tklayacak. Bu ACTION, Form'da INPUT alanlarndaki deerleri POST yntemiyle yine kendisine gnderecek; bylece PHP, program yeniden altrrken, bu kez en bataki artn yerine geldiini (yani $HTTP_POST_VARS dizi-deikeninin deer ierip iermediine ilikin snamann olumlu sonu verdiini) grerek, ie batan batan balayacaktr. Bu, INPUT etiketinin alanlarndan oluturulan deikenlerden yararlanarak, ziyaretiye bize ulatrd bilgileri ve bizim teekkr mesajmz yollamaktan ibarettir. Program bu ekliyle ne gvenlik nlemlerine sahip, yani ktniyetli kiilerin INPUT alanlarna kt niyetli kodlar yazmalar halinde bunlar ayklyor; ne de ziyaretinin bo Form gnderip gndermediini snyor. Bu gibi ileri, PHP ile metin dzenlemeyi rendikten ve Dzenli fadeler denen kavram ile tantktan sonra yapacaz.

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:88

Metin Dzenleme ve Dzenli fadeler


Web programlarmzda bir ziyaretinin bize ulatrd Form bilgilerini ve bir veritaban dosyasndan aldmz ham verileri yeniden dzenlememiz gerekir. PHP bunu yapabilmek iin bize 50'den fazla fonksiyon salar. Bunlardan sk kullanmamz gerekenleri ele alacaz. Daha sonra, zellikle Unix iletim sistemine, Perl veya Javascript diline aina olanlarn hatrlayaca Dzenli fadedeler denen metin ve sralan (pattern) eletirme aralarnn zerinde duracaz. Bu iki arala, elimize aldmz berhangi metne istediimiz biimi vermek veya metnin iinden istediimiz blm hemen hemen tamamen seip biimlendirmek ve kullanmak mmkn olur.

Temel Alfanmerik Fonksiyonlar


PHP'nin metin olarak grd deikenlere alfanmerik (String) tr deikenler adn vermitik. PHP'nin alfanmerik fonksiyonlar, bu tr deikenlerin deerlerinin iinden bir blm alma, atma veya deitirme imkan salar. Programlarmzda sk kullanacamz bir ka fonksiyonu ele alalm. Bu fonksiyonlarn tam listesini bu kitapn rnek kodlar arasnda alfa_fonksiyonlar.htm adl dosyada bulabilirsiniz. (Aadaki rnekler de alfa_fonksiyonlarXX.php adl dosyalarda bulunabilir.)

substr()
Bir alfanmerik deikenin deerinin veya bir metnin tanmladnz blmn verir. kisi zorunlu, biri semeli parametre ile kullanlr. Yazl: substr($degisken, bala, [boyut] ); Burada, $degisken yerine iinden bir blm semek istediiniz metni tutan deikenin adn; bala yerine seme ileminin balayaca karakterin batan itibaren kancdan sonra olduunu ve isterseniz boyut yerine de seilmesini istediimiz karakter saysn yazarz. Ka karakter seileceini gsteren boyut parametresini yazmazsanz, PHP deikenin veya metnin sonuna kadar seer. rnek $secilen = substr ("abcdef", 1); Burada $secilen deikeninin deeri "bcdef" olacaktr; nk birinci karakterden sonra seime balatyoruz ve seimin boyutunu belirlemiyoruz. PHP, verdiimiz metnin sonuna kadar seecektir. $degisken = "Olumsuz dnce ve mekanizmalar zerine olumlu eyler bina edilemez!"; $secilen = substr ($degisken, 8, 20); Burada ise seime 8'nci karakterden sonra baladmz ve 20 karakterlik seim yaplmasn belirttiimiz iin seilen deer "dnce ve mekanizma" olacaktr. Balan olarak verdiiniz say negatif ise (nnde - iareti varsa) seim ilemine deikenin sonundan itibaren balanr. Yukardaki substr() fonksiyonunu: $secilen = substr($degisken, -9); eklinde yazarsak, dnen deer, "edilemez!" olacaktr.

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:89

trim()
Bir alfanmerik deikenin deerinin ba ve son tarafndaki boluklar atar. Yazl: trim($degisken); Bu fonksiyon deiken deerinin veya metnin bandaki ve sonundaki "\n", "\r", "\t", "\v", "\0", ve aralk iaretini boluk sayar. rnek: $degisken = "\0 Olumsuz dnce ve mekanizmalar zerine olumlu eyler bina edilemez!\n\r\t"; $secilen = trim ($degisken); Burada seilen metinde, bataki boluk, sondaki yeni satr, satr ba ve sekme karakterleri olmayacaktr.

chr()
Parametre olarak ASCII deerini belirttiimiz karakteri salar. rnek: echo (chr(34); Bu komutla Browser penceresinde ift-trnak iareti grntlenir.

ord()
Parametre olarak yazdnz karakterin ASCII deerini salar. rnek: echo (ord("A"); Bu komutla Browser penceresinde 65 rakam grntlenir. bu fonksiyonun balca kullanm alan, bir deikenin deerini arzu ettiimiz bir karakterin ACSII koduyla karlatrmak olabilir. rnein: if ( ord($karakter) == 60 { // karakter "<" iareti ise $karakter = "" ; } koduyla, bir Form'dan gelen verileri karakter-karakter snayabilir ve iinde normal olarak bulunmamas gereken, zararl kod paras olmas ihtimali bulunan karakterleri ayklatabiliriz.

strlen()
Bir alfanmerik deikenin deerinin ka karakter ierdiini bildirir. Yazl: strlen($degisken); Bu fonksiyondan dnen deer tam saydr; aritmetik ilemlerde kullanlabilir. rnein, ziyaretinin bir INPUT alanna yazd yaznn uzunluunun arzu ettiimiz llere uygun olup olmadn snamakta bu fonksiyondan yararlanabiliriz: if ( strlen($degisken) > 30 { // girilen deer 30 karakterden uzun ise echo ("Ltfen 30 karakterden uzun yazmaynz!); }

printf() ve sprintf()
Bu fonksiyonlar bir deikeni biimlendirmekte kullanrz. Birincisinin elde ettii sonu ziyaretinin Browser penceresine gnderilir; ikincisin elde ettii sonu ise deer olarak dner. nce bu fonksiyonlarla kullanabileceimiz biim parametrelerini sralayalm: % Yzde iareti. Yannda biim parametresi gerekmez. b Deiken tamsay olarak ilem grr ve ikili say olarak dner. c Deiken tamsay olarak ilem grr ve ASCII deerinin karl olan karakter olarak dner.

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:90

Deiken tamsay olarak ilem grr ve ondalk say olarak dner. Deiken kesirli say olarak ilem grr ve kesirli say olarak dner. Deiken tamsay olarak ilem grr ve sekiz-tabanl (octal) say olarak dner. Deiken alfanmerik olarak ilem grr ve alfanmerik olarak dner. Deiken tamsay olarak ilem grr ve 16 tabanl (hexadecimal) say olarak dner. (Harfler, kk harf olur). X Deiken tamsay olarak ilem grr ve 16 tabanl (hexadecimal) say olarak dner. (Harfler, byk harf olur). Her iki fonksiyonun da kullanl biimi ayndr: printf( "biim" , $degisken1, $degisken2, ... "metin" ); Burada "biim" yerine yukardaki biim parametlerini yazarz. Biim parametrelerinin nne yzde iareti konur; en fazla be belirleyici zellik alabilir. Yukardaki tr belirten biimlendirme parametlerine ek olarak dier zellikler yle sralanr: Doldurma karakteri: tek trnak ve onu izleyen bir karakterden oluur. Hizalama: Eksi iaretinin varal yaznn sola, yokluu ise saa hizalanma anlamna gelir. En az-en ok uzunluk: Say-nokta-say (rnein 40.40 gibi) yazlr; birinci say azam, ikinci say asgar uzunluu belirtir. Bu zellie bir rnek verelim.Bir deikenin deerinin sonuna yanyana yeteri kadar nokta konarak uzunluunun 40 karaktere kartlmasn u deyimle salarz: $degisken = " yilik zerine " ; printf( "%'.-40.40s" , $degisken); Burada "%'.-40.40s" eklindeki biim komutu, Browser penceresinde u grnty oluturur: "yilik zerine.........................." Burada "yilik zerine" deeri 14 karakter olduu iin, sonuna 26 adet nokta eklenmi ve btn deer sola hizalanm olacaktr. u komut ise iki deikenin deerini ve vereceimiz bir metni ayn satra yazdracaktr: $degisken1 = " yilik zerine " ; $degisken2 = " yilik zerine " ; $metin = "<br>\n" ; printf( "%'.-40.40s%'.2d%s" , $degisken1, $degisken2, $metin); Bu komut Browser penceresinde u grnty oluturur: "yilik zerine..........................86" Burada eklediimiz ikinci "%'.2d" eklineki biim komutu ile, ikinci deikenin deeri, en az sfr en ok iki adet nokta ile doldurulmak ve saa hizalanarak ondalk say olarak grntlenmek zere biimlendiriliyor. nc biim komutu olan "%s" ise nc deikenin sadece alfanmerik olarak muamele grmesini salyor. Biim komutlarnn arasnda boluk bulunmamas, ait olduklar deiken deerlerinin de aralarna boluk konmamasna sebep oluyor. nc deikenin etkisini, kat zerinde gremiyoruz; ancak bu Browser penceresinde bundan sonra gelecek unsurlarn bir satr aa kaymasn salayacaktr. Drdnc biim zellii, ondalk saylarn virglden (veya nokdtadan) sonra ondalk blmnn ka hane olacan belirler. Bunu da bir rnekle grelim: $degisken = " 124 " ; printf( "Deeri (ABD) $%.2f" , $degisken); Bu biimlendirme komutu da Browser penceresine u yazy yazdrr: Deeri (ABD) $124.00

d f o s x

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:91

number_format()
Tr say olan deiken deerlerini bin-basamaklar eklinde biimlendirmekte kullanlr. Parametre olarak say ieren deikenin adn, ondalk blmn ka haneli olacan, ondalk hanesini ve binler basamaklarn ayrmakta kullanlacak karakteri kabul eder. rnek: $degisken = 1234567890.1234567890 ; echo (number_format($degisken, 4 chr(44) , ".") ); //chr(44)=virgl Bu deyimle 1234567890.1234567890 eklindeki deer, Browser penceresine "1.234.567.890,1235" eklinde yazdrlacaktr.

Tarih ve Saat Dzenleme


PHP'nin tarih ve zaman bilgisini kullanmamz salayan getdate() fonksiyonunun yan sra, elde ettiimiz bilgileri ok daha esnek biimlendirmemizi salayan date() fonksiyonu da sk kullanlr. Bu fonksiyon arld yerde bize Unix sisteminin Epoch zaman-tarih damgasn verir. Bu verinin biimlendirilmesi iin eitli parametreler vardr. Bu parametreler, gn adlarnn dili ve tarihlerin yazl bakmndan Web sunucusunun bulunduu bilgisayardaki blgesel ayarlara gre sonu verir. date() $tarih date( biimlendirme_parametreleri ); Burada biimlendirme_parametleri yerine unlar yazabilirsiniz: a 12 saat esasna dayanan Anglo-Sakson sistemlerinde leden nce ("am") veya leden sonra ("pm") iaretinin verilmesini salar. A Ayn iaretlerin byk harfle yazlmasn salar. d ki haneli gn says, tek haneli gnlerin nne sfr konur: "01" - "31" D haneli gn ad ksatmas: "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 nne sfr konmadan saat: "1" - "12" G 24 saatlik sistemde tek haneli saatlerin nne sfr konmadan saat: "0" - "23" i Dakika: "00" - "59" j Tek haneli saylarn nne sfr konmadan gn says "1" - "31" l (kk L harfi) Uzun gn ad: "Cuma" L Artk yl olup olmadna ilikin Boolean (doru/yanl) deiken. Artk yl ise 1, deilse 0. m Tek hanelilerin nne sfr konarak ay says: "01" - "12" n Tek hanelilerin nne sfr konmadan ay says: "1" - "12" M Ksaltlm ay ad: "ub" s Saniye: "00" - "59" S ngilizce ('nc anlamna) 2 karakter ek: "th", "nd" t Belirtilen ayn gn says; "28" - "31" w Haftann gn says: "0" (Pazar veya Pazartesi) - "6" (Cumartesi veya Pazar) Y Drt haneli yl: "2000" y ki haneli yl "00" z Yln gn says: "0" - "365" rnek: print (date ("l dS of F Y h:i:s A")); Browser penceresine ngilizce blgesel ayarlar yaplm bir bilgisayara kurulu Web sunucusunda: "Sunday 30th of July 2000 07:51:08 AM" yazdrr. print (date ("l, d F Y g:i:s"));

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:92

Browser penceresine Trke blgesel ayarlar yaplm bir bilgisayara kurulu Web sunucusunda: "Pazar, 30 Temmuz 2000 07:51:08" yazdrr. date() ve mktime() fonksiyonlarn birlikte kullanarak gemi veya gelecek tarihleri bulma imkan de vardr. 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);

Dzenli fadeler
Unix iletim sistemini gelitirenlerin biliim teknolojisine kazandrd bir dier deer biilemez ara olan Dzenli fadeler (Regular Expressions), belki de iaretlerinin karmakl sebebiyle programclarn fazla dokunmak istemedikleri bir alandr. Bu kavramla daha nce tanm olmayanlara, CGI veya Javascript kodlarnda grdkleri, ^.+@.+\\..+$ iaretlerinin, Dzenli fade ilemlerine ait olduunu belirtilim. Bu iaretler ve onlarn arasna koyduumuz karakter rnekleri ile, PHP'nin aradmz bir metnin karakterlerinin hangi dizili, sralan konumunda olduuna bakarak, bize o metni bulmasn salarz; ya bu metni kullanrz, sileriz veya deitiririz. Dolaysyla, Dzenli fade demek, bir dizili, sralan biimi demektir. Dzenli fade oluturarak, PHP'ye "te buradaki gibi sralanm karakterleri bul!" demi oluruz. Dzenli fade, PHP'ye verdiimiz sralana uygun metnin nerede ve kanc kez bulunmasn istediimizi de belirtir. Ayrca, bu ifade ile, PHP'nin bulduu metni (veya metinleri) ne yapmasn istediimizi de syleriz.

Eletirme deyimleri ve iaretler


PHP'nin karakter ve sralan elemede kullanlan dzenli ifade komutlarn ksaca ele alalm; sonra bunlar kullanmamza imkan veren fonksiyonlar grelim. ^hakk "hakk" ile balayan btn kelimeleri bulur. ^iareti, onu izleyen karakterin sadece alfanmerik deikenin banda olmas gerektiine iaret eder. Bu deyimle, "Hakk cal bugn buradayd!" veya "Hakkdr hakka tapan, milletimin istikll!" eleebilir; fakat "Analarn hakk denmez!" elemez; nk PHP asndan ^iaretinin anlam, "Balangcnda 'hakk' karakterlerinin sralanyla ayn sralantaki alfanmerik deeri bul!" demektir. edilemez$ Bu deyim ise PHP'ye "edilemez" ile biten btn kelimeleri bulur. Szgelimi, "Ktmser insann ykseliinden bahsedilemez" cmlesi bu deyimle bulunabilir; fakat sonunda nokta olduu iin ".. edilemez." diye biten hi bir cmle bu deyimle eleemez. ^hakk$ PHP, banda ^ iareti, sonunda $ iareti bulunan kararter sralann, aynen arar; yani bu deyim, birinci rnekteki cmleyi de bulamaz. hakk Bu deyim ise her cmleyi de buldurur; nk nde de bu drt karakter bu sralanla mevcuttur. PHP'nin Dzenli fadeleri, btn rakam ve harfleri eletirebilir. Fakat sorun, zel karakterlerde kar. Szgelimi, sekme iareti, satr sonlarnda yeni-satr/satrba iareti, gibi zel karakterleri, ancak nlerine Escape iareti olan ters bl iaretini koyarak buluruz.

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:93

Dzenli fadelerde zel Karakterler


Geri (Backspace) karakterini bulur. Belirtilen karakterle snrlanan kelimeyi bulur: k\b, "hak mcadelesi" ifadesindeki birinci k'y bulur; nk bu harf, bir kelime snrlaycdr. \B Belirtilen karakterle snrlanmayan kelime yoksa, balayan bulur: k\Bi, " kii" ifadesindeki 'ki'yi bulur. \cX X yerine yazacamz kontrol karakterini bulur. rnein, \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" deerlerini ikisini de bulur, \D Herhangi bir ondalk iaretini bulur. \f Form-feed (kat kart) karakterini bulur. \n Newline (yeni satr) karakterini bulur. \r Return (satrba) karakterini bulur. \s Boluk (space) bulur. \S Yatay ve dey sekme, kat-kart, yeni satr, satrba ve boluk dndaki herhangi bir karakteri bulur. \t Yatay sekme (Tab) karakterini bulur. \v Dey sekme karakterini bulur. \w Herhangi bir harf, rakam veya alt-izgiyi bulur. \W Harf, rakam ve alt-izgi dndaki karakteri bulur. \xHex Verilen 16 tabanl (Hexadecimal) sayya uygun Escape karakterini bulur. rnein, \n25, % iaretini bulur. Bu arada noktalama iaretlerini arattrrken, nlerine ters bl iareti koymak gerekir. Ters bm iaretini de yine nne ters bl iareti koyarak (\\) arttrabilirsiniz. [\b] \b

Karakter Gruplar
PHP'nin Dzenli fadeleri'nde kolaylk salayan ve mesela ziyaretinin bir Form'da bir INPUT etiketine verdii yantlarn iinde olmamas veya olmamas gereken karakterleri bulmamza imkan veren karakter gruplar oluturma yntemini de kullanabiliriz. Szgelimi btn sesli hafleri aratmak iin yle bir karakter grubu oluturabiliriz: [OoUuAaOoEeIi] Karakter gruplarn keli parantez iinde yazarz. Bu deyimle, PHP, iinde herhangi bir sesli harf bulunan btn deerleri eletirecektir. Bu yntemden yararlanarak, u gruplar kullanabiliriz: [a-z] Herhangi bir kk harfi bulur. [A-Z] Herhangi bir byk harfi bulur. [a-zA-Z] Herhangi bir byk veya byk 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 (kat kart), Newline (yeni satr), Return (satrba) karakterini veya boluu (space) bulur. Szgelimi, bir alfanmerik deer kmesinde b3, u2, n9 gibi birincisi kk harf, ikincisi rakam olan iki karakterlik dizileri bulmak istiyorsak, arama grubunu yle kurarz: ^[a-z][0-9]$ Bu deyim PHP'ye, a'da z'ye kk harfle balayan, (^iareti aranan unsurun deerin banda olmas gerektiini sylyor) ve sonunda 0'dan 9'a bir rakam bulunan kelimeleri bulmasn syleyecektir. PHP, bu kelimenin sadece iki harfli olmasna dikkat edecektir;

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:94

nk grubumuzun bir ba ve bir de sonu belirlendiine gre, karakterli deerlerin bulunmas imkan yoktur. ^iareti keli parantez iinde grup deyimi olutururken kullanlrsa, bu olumsuzluk anlam tar. Szgelimi, iki rakaml ancak birinci karakteri rakam olmayan fakat ikinci karakteri rakam olan deerlerin bulunmas iin u deyim gerekir: ^[^0-9][0-9]$ Burada en bataki ^iareti "banda" demektir; ancak hemen arkasndan gelen grupta "rakam olmayan" demi oluyoruz; ikinci grup ve sonundaki $ iareti ile "rakamla biten" anlamna geliyor. Deyimde sadece ba ve sonu gsteren iki eletirme unsuru bulunduuna gre bu deyim, "banda rakam olmayan, sonunda rakam olan iki karakterli deerleri" bulmaya yarayacaktr. Bu deyim sz gelimi 13' bulmayacak, fakat u2'yi bulacaktr. Bu yntemle u gruplar yapabiliriz: [^a-z] Kk harf olmayan herhangi bir harfi bulur. [^A-Z] Byk harf olmayan herhangi bir harfi bulur. [^\\\/\^] \ , / veya ^ dnda herhangi bir karakteri bulur. [^\"\'] ift ve tek trnak dnda herhangi bir karakteri bulur. Grup oluturmada kullandmz zel karakterler de vardr. rnein nokta iareti (.), yeni satr balangc olmayan herhangi bir karakter anlamna gelir. Dolaysyla, ^.0$ deyimi yeni satrla balamayan ve sfr ile biten herhangi iki karakterli deeri bulacaktr. PHP'nin kullanlmaya hazr zel Dzenli fade eletirme gruplar da vardr: [[:alpha:]] Herhangi bir harf [[:digit:]] Herhangi bir rakam [[:alnum:]] Herhangi bir harf veya rakam [[:space:]] Herhangi bir bo karakter [[:upper:]] Herhangi bir byk harf [[:lower:]] Herhangi bir kk harf [[:punc:]] Herhangi bir noktalama iareti [[:xdigit:]] Herhangi bir Hexadecimal karakter. [0-9a-fA-F] Karakter eletirmede tekrar says da bir zellik olarak kullanlabilir. Tekrar says belirtmek iin ssl parantez ({}) kullanrz. rnekler: ^a{4}$ inde sadece drt adet kk a harfi bulunan kelimeleri se: aaaa. ^a{2,4}$ inde sadece iki veya drt adet kk a harfi bulunan kelimeleri se: aa, aaa, aaaa gibi ^a{2, } ki veya daha fazla kk a harfi bulunan kelimeleri se: haar, haaar, haaaar gibi. Bu deyim "har" kelimesini semez. \t{2} Ardarda iki sekme iaretini bul .{2} Herhangi ift karakteri bul: aa, &&, == gibi ^\-{0,1}[0-9]{1,}$ Negatif veya pozitif herhangi bir tam sayy bul ^[0-9]{1,}$ Pozitif herhangi bir tam sayy bul Bu tr deyim oluturma ilemleri giderek karmaklaabilir. rnein: ^\-{0,1}[0-9]{0, }\.{0,1}[0-9]{0, }$ Bu karmak deyim aslnda sadece "Negatif veya pozitif bir ondalk (double) deeri bul," anlamna geliyor. Ksaca irdelersek, aranan degerin sfr veya bir kere tekrarlanan bir kesme izgisiyle balayabileceini ("Sfr veya bir kere" demek, olsa da olur, olmasa da anlamna geliyor!) bunu sfr veya daha fazla kere tekrarlanan bir rakamn izleyebileceini, onu da sfr veya bir kere tekrarlanan bir nokta iareti ile sonunda sfr veya daha fazla kere tekrarlanan herhangi bir rakamn izleyebileceini sylemi oluyoruz.

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:95

PHP bu tr karmak ifadelerin hatasz yazlmasn salayan ksayollara sahiptir. Bunlar sralayalm: ? {0,1} anlamna gelir. Kendisinden nce yer alan unsurun en az sfr en ok bir kere tekrar edilmesi gerektiini (olmayabileceini ama olursa en fazla bir kere olabileceini) belirtir. * {0, } anlamna gelir. Kendisinden nce yer alan unsurun sfr veya daha fazla kere tekrar edilmesi gerektiini (tmyle opsiyonel olduunu) belirtir. + {1, } anlamna gelir. Kendisinden nce yer alan unsurun en az bir veya daha ok kere tekrar edilmesi gerektiini (bulunmasnn zorunlu olduunu) belirtir. Bu ksa-yollar kullanarak, yukardaki karmak ifadeleri basitletirelim: ^[a-zA-Z0-9_]+ En az bir harf veya rakam veya altizgi ieren herhangi bir kelime ^[0-9]+ Herhangi bir pozitif tamsay ^\-?[0-9]+ Herhangi bir tamsay ^\-?[0-9]*\.[0-9*$]+ Herhangi bir kesinli (double) say Bir Dzenli fade'nin yazlnda birden fazla arama-sralan deyimine yer verebiliriz. Bunu yapmamz salayan | iaretidir. rnein, \.com|\.co\.uk ifadesi ile, ya ".com" ya da ".co.uk" deerlerinin bulunmasn salayabiliriz. Burada | iareti "veya" kelimesi gibi dnebilirsiniz. Dzenli ifadeler yoluyla INPUT etiketinden gelen deerleri incelerken hata yapmak kolaydr. Bunun iin kendi ifadelerinizi mutlaka seitli olaslklara kar snamalsnz. Bu blmn banda rnek olarak verdiimiz Dzenli fade'yi hatrlyor musunuz? ^.+@.+\\..+$ rnein bu ifade, ziyaretinin elektronik posta adresini yazmas gereken bir INPUT etiketinin salad deerin gerekten elektronik adres biimi tayp tamadn snar. Bataki ^ ve nokta iaretleri ile art iareti deerin nnde boluk olmamasn salyor; @ iareti ise deerin iinde @ bulunmas gerektiine iaret ediyor. Tekrar eden nokta ve art iaretleri "ne kadar olursa olsun ve ne olursa olsun" anlamna geliyor. Bunu izleyen nokta karakterini gsteren (\.) iaret buralarda bir de gerekten nokta olmas gerektiini ve bunu izleyen nokta ve art tekrar "ne olursa olsun, ne kadar olursa olsun" anlamn tayor. Baka bir deyile, aradmz deerin "herhangi bir ey" @ "herhangi bir ey daha" . "bireyler daha" eklinde olduunu belirtmi oluyoruz. Ne var ki deyimiinde iki nokta veya iki @ iareti olan veya @ iareti ile nokta arasnda bir ey bulunmayan veya @ veya noktadan ncesi ya da sonras bo olan btn deerleri safd etmeye yetmeyecektir. Szgelimi bir ziyaretimiz "@@@@.@@@" yazarsa, bu deyim bu deeri geerli bir elektronik adres sayacaktr. PHP programlarmzda ziyaretilerimizin verdii deerleri eitli bakmlardan snamak ve semek mmkndr; ancak hi bir zaman yazlanlarn doruluunu garanti edemeyiz. Fakat zellikle bir metinde bulunmamas gereken iaretlleri PHP'ye aratabiliriz. Bunu Dzenli fade Fonksiyonlar salar.

Dzenli fade Fonksiyonlar


Yukarda rendiimiz Dzenli fade yazma tekniklerini, PHP'nin bize salad be fonksiyonda parametre olarak kullanrz. PHP'nin ayrca Perl-tarz dzenli ifade fonksiyonlar da vardr. Bu fonksiyonlardan, ya bize bir boolean (doru/yanl) deer dner; ya da fonksiyon istediimiz ii yaparak vard sonular verdiimiz deikene yazar. Biz, daha sonra bu deere bakarak veya deikenin deerlerini kullanarak, PHP programmzn akn kontrol edebiliriz. Burada ele alacamz fonksiyonlara ilikin rneklerde, daha nceki blmlerde oluturduumuz konuk defteri program ile Web

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:96

ziyaretilerimizin sunucuya gnderecei bilgileri dorulamaya ve muhtemel zararl kodlardan ayklamaya alacaz.

ereg() ve eregi()
PHP'nin temel Dzenli fade Fonksiyonu, ereg(), arattmz karakter sralan bulunduu taktirde doru, bulamad taktirde yanl karl bir deer verir. Fonksiyonu yle yazarz: $bir_degisken = ereg("eletirilecek_sra" , $kaynak , $yeni_deiken); Fonksiyonun aradmz eletirmeyi yapmas halinde, buradaki $bir_degisken'in deeri true/doru, yapamamas halinde false/yanl olacaktr. Eletirme srasnn nasl oluturulduunu yukarda grdk; bu ifadelerden iimize uygun olan buraya trnak iinde yazarz. $kaynak, eletirilecek sralamann iinde aranaca deeri tutan deikendir. Fonksiyonun bir dier becerisi, eer eletirilecek sralamay gruplar halinde verirsek, kaynakta yapaca eletirme olursa, buna uygun deerleri bir dizi deikene yazabilmesidir; istersek bir parametre olarak bu yeni deikenin almasn istediimiz ad veririz; bylece eletirme sonucu bulunan deerler kaydedilmi olur. eregi(), aynen ereg() fonksiyonu gibi alr; sadece eletirecei deerlerde bykharf/kk-harf fark gzetmez. Daha nceki blmde oluturduumuz ve kd_01.php adyla kaydettiimiz konuk defteri programnn ak plann, ziyaretinin Form'a yazd ve sunucuda $HTTP_POST_VARS dizideikeninde tutulan deikenlerinden elektronik posta adresi ilge ilgili olan gerekten iinde en az bir @ iareti ile en az bir adet nokta iip iermediine bakarak snayabiliriz. Byle bir snama iin 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 deikeninde kaytl deerin iinde arad sralamay bulursa, eleen deeri $email adl yeni bir deikene yazacak ve if snavnn sonucu doru olacaktr. Bu sralamaya uygun bir deer bulunamazsa, if snav else deyimine atlayacak ve bir hata mesaj retilerek, bu program durdurulacaktr. (Burada, yapt hayat dzeltmesi yani geerli bir elektronik posta adresi vermesini salayan yeni sayfann, include komutu ile ziyaretiye gnderildiine dikkat edin. Bu programn yeni biimi kitapn rnek kodlar arasnda kd_02.php adyla bulunabilir.)

ereg_replace() ve eregi_replace()
Grdmz gibi, ereg() arattmz karakter sralan bulunduu taktirde doru, bulamad taktirde yanl karl verdikten sonraduruyor! Oysa kimi zaman arattmz ve bulunan deerin baka bir deierle deitirilmesi gerekebilir. Bunun iin ereg_replace() ve eregi_replace() fonksiyonlarn kullanrz: ereg_replace("eletirilecek_sra" , yeni_metin , $kaynak); Fonksiyonun aradmz eletirmeyi bulursa, bu deerin yerine verdiimiz yeni metni koyacaktr; yeni metni bir deikenin deeri olarak da verebiliriz. Uygulama rnei iin yine konuk defteri rneine dnelim. Ziyaretilerimiz kimi zaman yanllkla, kimi zaman

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:97

pek de iyi niyet sonucu olmadan, kendilerinden beklediimiz isim, adres ve mesaj yerine sunucu veya baka ziyaretilerin Browser programlar tarafndan kod gibi alglanacak metinler yazabilirler. PHP'de gvenlik blmnde bu konuda daha ayrntl bilgi bulacaksnz. Burada sadece bu tr zararl metinlerin genellikle programlarda bulunmas gereken karakterler ierdiini sylemekle yetinelim. Bu tr karakterlerin banda < ve > iaretleri bulunur! Dolaysyla, biz de ziyaretimizden gelecek verilerin yazld deikenlerin deerlerinde bu iaretleri aratabilir ve bunlar ii bo bir alfanmerik deer ile deitirebilir; yani silebilir. Zararl olabilecek kodlarn arasnda daha bir ok karakter bulunabilir; ancak Script diliyle yazlmas gereken bu kodlardan < ve > iaretlerini kaldrlmas kodlar ilemez hale getirecei iin, u aadaki 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, ziyaretiden gelecek deikenin deerlerinde < ve > iaretlerini aramakta onlarn yerine ii bo bir metin ("") yazmaktardr. (Bu rnei ieren konuk defteri, bu kitapn rnek kodlar arasnda kd_03.php adyla bulunabilir.)

split()
Dzenli fade ile alan bu fonksiyon, vereceimiz eletirme sralamasn snrlayc olarak kullanarak, belirteceimiz deerde bulduu deer paralarn ayrr ve bunlar ayr ayr bir dizi deikenin elemanlar olarak kaydeder. Bu fonksiyonu yle yazarz: $yeni_dizi_deiken = split("eletirilecek_sra" , $kaynak, snr_says); Fonksiyon, arad sralamay bulamazsa, false/yanl sonucunu verir. Burada snr says olarak vereceimiz rakam, oluturulacak yeni dizi deikene en fazla ka eleman yazlmasn istediimizi gsterir. Bu sayy vermezsek, PHP yeni dizi deikenin gerektii kadar elemana sahip olmasn salar. Bir rnek vererek, bu fonksiyonu nasl kullanibileceimizi grelim: <?php $metin = "nsan szyle kendini gsterir, davranlaryla ruh halini aksettirir."; $aranan = " "; $yeni_dizi_deiken = split($aranan, $metin); foreach ($yeni_dizi_deiken as $eleman) { print "$eleman <br>"; } ?> Bu programda PHP, $metin deikeninin ierdii deerde $aranan deikeninin ierdii deeri, yani boluu, eletirilecek unsur olarak kullanacak ve $metin deikeninin deerini boluklarndan paralara ayracaktr. Ayrlcak her yeni para, $yeni_dizi_deiken adl deikenin elemanlar olarak atanacaktr. Programn geri kalan ksm ise, bu yeni dizinin elemanlarn grntlemekterdir.

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:98

sql_regcase()
inde byk harf-kk harf ayrm olan bir deeri byk harf-kk harf ayrm olmayan Dzenli fadeler haline evirir. Bu fonksiyon bizden Dzenli fade almaz, tersine Dzenli fade oluturur. rnek: <?php $metin = "Szler"; echo(sql_regcase($metin); ?> Bu program, Browser penceresine u metni yazdrr: [Ss][][Zz][Ll][Ee][Rr]

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO

.:99

PHP ile Veritaban


PHPyi bir veritabanndan veri ekecek, bunlarla HTML etiketlerinin ieriini oluturacak ve ziyaretimizden alacamz bilgileri bir veritabanna ileyecek ilemleri renebilecek kadar biliyoruz artk. Bu kitapn ba tarafndaki kurma ilemlerini birlikte yaptysak, u anda PHP programlarn gelitirdiiniz kiisel bilgisayardaki kiisel Web sunucusunda MySQL srcleriniz ve veritaban ynetim programnz alyor olmal. Bir kere daha tekrar etmek gerekirse, PHP ile veritabanna dayanan sayfalar yapmak iin mutlaka ve sadece MySQL srclerini kullanmak gerekmez. Bunun yerine szgelimi Microsoftun ODBC srclerini kullanabilirsiniz. Ancak Web sitenize evsahiplii yapan firmann size ODBC destei verip vermediini renmeniz gerekir. Aslnda ayn ekilde, evsahibi firmann MySQL destei verip vermediini de renmek zorundasnz. (PHP ile MS-ODBC srclerini kullanabilmek iin Andrew Stopfordun ASP Today sitesinde http://www.asptoday.com/articles/20000202.htm adresindeki yazsnda daha geni bilgi bulunmaktardr.) Web sitemizde, HTML sayfalarmz ve PHP programlarmz neden veriya dayal hale getirmeliyiz? Bu sorunun cevab, "Baka trl elde edilemeyecek bir otomasyon, ziyaretilerimizle gerek anlamyla etkili biralveri salamak iin!" diye yantlayabiliriz. Yukarda, bir PHP programnn ziyaretiden Frm ile alaca bilgileri, yine kendisine gnderebileceini ve bu bilgileri ileyebileceini grdk. PHP programmzn bu bilgileri bir veritabanna ilediini ve ziyareti bir baka sayfaya gitmek istediinde o sayfann ieriinin, ziyaretinin birka saniye nce yapt tercihlere gre belirlendiini dnn. Bir baka rnek, Web sitemizdeki sayfalarda yer alan unsurlarn gncelletirilmesi iin her gncelletirmede ok sayda program yeniden yazmak veya sayfay yeniden yapmak zorunluu varsa, bu program ve sayfalarn ieriklerini bir veritabanndan alyor olmas halinde, sadece veritabann gncelletirmekle onlarca, belki de yzlerce, HTLL ve PHP belgesini yeniden yazm gibi olabiliriz. Bu blmde nce bir rnek veritaban dosyas hazrlayacaz; daha sonra bunun iindeki verileri PHP program ile sayfalarmza katacaz. Bu dizinin ikinci kitabnda Unix/Linux sistemlerinde veritaban uygulamalar zerinde daha geni duracaz. Burada Windows sisteminde bir MySQL uygulamasn ele almakla yetineceiz.

MySQL Veritaban
Geri bu kitapn konusu kendisi bal bana bir dil olan SQL deil, ama burada sadece MySQL program ile veritaban oluturmakla kalmayalm, bir anlamda SQL diline de ok ksa bir giri yapalm. SQL ook geni bir dildir. Burada yapabileceimiz giri ancak ilk altrmamaz yapmamza yetebilir. SQL, (Structured Query Language, Yapsal Sorgu Dili) veritaban endstrisinin standart dilidir. Fakat HTML konusunda farkl firmalarn sadece kendi Browserlarnn tand trden etiketler gelitirmeleri gibi, SQL alannda da farkl firmalarn ekleri ve dilde yaptklar deiiklikler vardr. MySQL, teknik tabiriyle sunucuda daemon olarak alr ve arzu eden programa, bildirecei (ve eriim hakk bulunan) veritaban dosyasndan veri ekerek, sunar. Bir veritabannda farkl sayda tablolar olabilir. Bir veritaban dosyasnda yer alan tablolarda, stunlar ve satrlar vardr: bunlarn kesitikleri yerlere biz verilerimizi yazarz. Bir SQL veritaban dosyasnda her bir kutunun ne tr veri kabul edecei nceden belirlenir; dolaysyla tr say olan verinin yazlaca kutuya, alfanmerik deer yazlmaz. MySQL, saysal verilerin

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO .:100

trn INT, belirli bir snra kadar deien sayda karakterden oluacak verilerin trn VARCHAR komutuyla belirler.

mySQL veri trleri


MySQL'de bir ok veri tr oluturulabilir. Ancak Web programlar asndan nemli olan bir ka ve zellikleri yle saralanabilir: INT Tamsay: -2147483648'den 2147483647 kadar deien diziye "signed" (iaretli), 0'dan 4294967295'e kadar deienine "unsigned" (iaretsiz) denir. VARCHAR(n) n saysn gememek artyla deien boyutta karakter olabilir. CHAR(n) Kesinlikle n says 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 deiebilen tarih alan. TIMESTAMP 1 Ocak 1970'den 18 Ocak 2038'e kadar olan ve Yl+Ay+Gn+Saat+Dakika+Saniye biimindeki zaman bilgisi. MySQL'de bir tablo oluturmak iin gerekli CREATE TABLE komutu yle kullanlr: CREATE TABLE uyeler (adi VARCHAR(30), soyadi VARCHAR(30), ye_no INT ) ; Bu komutla, "uyeler" isimli stunlu bir tablo oluturulur: birinci ve ikinci stunlarda en fazla 30, karakterlik deien boyutta alfanmerik deerler yer alrken, nc stunda sadece tam say olan deerler bulunabilir. Bu komutla oluturulan tabloya INSERT INTO komutuyla veri girebilirsiniz: INSERT INTO uyeler (adi, soyadi, uye_no) VALUES ('Muharrem','Ta','1234') Bir tablonun oluturulmas ile iine veri yerletirilmesi komutlar ayr ayr zamanlarda, ayr ilemler olarak yaplabilecei gibi, toplu bir metin halinde, otomatik olarak da yaplabilir. MySQL veritabanndan bilgi edinmek iin SELECT komutunu kullanrz: SELECT * FROM uyeler ; Bu, MySQL'e, uyeler adl tablodaki btn deerlerin okunmasn bildirir. Buradaki "*" iareti, "btn stunlardaki btn deerler" anlamna gelir. Diyelim ki yukardda oluturduumuz tablonun sadece "adi" ve "soyardi" stunlarndaki bilgileri almak isteseydik, bu komutu yle yazacaktk: SELECT adi soyadi FROM uyeler ; Bir veritabanndaki bilgilerin yenileriyle deitirilmesini, yani veritaban dosyasnn gncelletirilmesini UPDATE komutu salar. Bu komutu kullanarak veritabanmzdaki baz kutucuklarn iindeki bilgileri deitirebiliriz. Veritaban dosyalarn gncelletirme zorunluu bulunmas ise bize veritaban tasarmnn ok nemli olduunu gsterir. rnein: UPDATE uyeler SET adi = "ahika" ; Bu komut, veritabanndaki btn satrlarda, birinci stundaki deerleri "ahika" olarak deitirmekle sonulanrd. Amacmz bu ise, sorun deil; ancak ou kez MySQL'e hangi satrda (veritaban tekniindeki terimle sylersek, hangi kaytlarda) deiiklik yaplacan daha ayrntl slememiz gerekir. Veritaban dosyamz olutururken, her kaydn dier kaytlarda olmayan (unique) bir stun (bunu da veritaban tekniindeki terimle sylersek. alan) bulunmaldr, ki MySQL'e yaplacak deiikliin tam yerini syleyelim. rnein UPDATE uyeler SET adi = "ahika" WHERE uye_no = 1234; MySQL bu komutu alnca sadece ye numaras 1234 olan kiinin (yani uye_no alanndaki deer 1234 olan kaydn) "adi" alanndaki deeri silecek ve yerine verdiimiz yeni deeri yazacaktr. Byle birincil alan bulunan, iyi dnlm bir veritabanndan seim yapmak da kolay olur. rnein:

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO .:101

SELECT adi soyadi FROM uyeler WHERE uye_no >= 123; deyimi ile tablomuzda bulunan kaytlardan sadece ye numaras 123'den byk olanlar seebiliriz. Bir MySQL veritabanndaki kayd silmek iin DELETE komutunu kullanrz: DELETE FROM uyeler WHERE uye_no = 1234; Vveritabannda sadece bir kaytta ye numaras 1234 olaca iin bu komutla sadece bir satr silinecektir. Bu komutu, diyelim ki yelik kaydn yenilememi kiilerin tmn silmek iin de kullanabiliriz. Veritabanmzda yelik kaydnn yenilendme tarihini gsteren bir alan bulunduunu varsayalm: DELETE FROM uyeler WHERE yenileme_tarihi < 2000-01-31; Bu komutla, yeliini yenileme tarihi 31 Ocak 2000'den eski olan btn yelerimizin kaydn veritabanndan silmi oluruz. Bu komutlarn MySQL'in DOS komut ilemcisi ile komutsatrndan yaplacan belirtmemiz gerekir. Bunu yapabilmek iin MySQL Server'n Windows'da altrlmas gerekir. MySQL'in paylam srmn kullanmak iin Windows sistemlerinde mysqld-shareware.exe programn altrmanz gerekir. Bunun iin DOS komut istemcisi penceresinde "C:/mysql/bin" dizinine giderek, u komutu vermemiz yeter: mysqld-shareware MySQL srclerinizin kiisel Web sunucusunda baaryla altna, kitapn ba tarafnda belirttiimiz kk altrmay yaparak emin olduktan sonra gerek bir veritaban dosyas yazabiliriz. Yukarda grdmz komutlar komut istemci satrndan tek tek verebileceimiz gibi, bir dzyaz dosyasnda toplayp, MySQL programna da otomatik olarak yaptrabiliriz. Bu dosyaya, iindeki verileri alp veritabanna boca edeceimiz iin, Dump dosyas denir. Aadaki metni MySQL programnn kurulu olduu dizindeki /bin/ alt-dizinine (muhtemelen c:\mysql\bin) veri.dump adyla kaydedin (Notpad kullanyorsanz, dosya adna .txt eklendiine 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' , 'Ik Kultur Merkezi, Bursa' , 'Yonetmen'); Bu metnin sadece satr olmasna, rnein Notpad'de Dzen mensnde Szck Kaydr maddesinin iaretsiz olmasna dikkat edin. Daha sonra yine DOS komut istemcisi penceresinde MySQL programnn dizininde /bin alt-dizinine gidin ve u komutu yazn: mysqladmin -u root create veri MySQL veri adl veritabannn oluutuunu bildirecektir. imdi ii bo bir veri dosyamz oldu. Yazdmz dump dosyasndaki bilgileri veritaban dosyasna iletmek iini MySQL yapacakatr. Bunu, u komutla yapabiliriz: mysql u root veri < veri.dump lerin yolunda gidip gitmediini c:\mysql\data dizininde veri adl bir klasr oluturulduunu kontrol ederek anlayabiliriz. Bu klasrn iinde calisanlar.frm, calisanlar.isd ve calisanlar.ism adnda dosyalar bulunmas gerekir.

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO .:102

PHP-MySQL likisi
Bylece, MySQL ile bir veritaban dosyas oluturma ilemi bitmi oldu. bir PHP program yazarak bu veritabanndaki kaytlar okutabiliriz. Bunu yapmadan nce yine hzl ekilde PHP-MySQL ilikisinini salayan fonksiyonlara gzatalm. PHP programlarmzda veritabanndan yararlanabilmek iin programn nce Web sunucusu araclyla veritaban dosyas ile balant kurmas gerekir. Baka bir deyile, PHP programnn veri ile arasnda bir yol amas gerekir. MySQL asndan ise bu balant, veri sunucusunda yeni bir oturum almas anlamna gelir. ki program arasndaki bu ilikiyi PHP'nin mysql_connect() fonksiyonu yapar. Bu fonksiyonun alabilecei parametre vardr: $veri_yolu = mysql_connect ("localhost" , "root" , "parola" ); Burada "localhost" yerine MySQL programnn paras olarak alt sunucunun ad yazlr. "root" bu MySQL sunucusunda alacak oturumun kimin adna alacan belirter. "root" kelimesi, sunucunun ynetici olarak oturum alaca anlamna gelir: "parola" kelimesinin yerine de MySQL'i kurarken belirlediimiz bir kullanc parolas varsa, onu yazarz. Bu komutta yer alan $veri_yolu deikeni, alacak veri yolunun, PHP ile MySQL veritaban sunucusu arasndaki ban tantc iareti olacaktr. Bu balant kurulduktan sonra, atmz veri yolundan gelecek bilgiler ve veritabanna gidecek bilgiler bu deiken araclyla gerekleecektir. Veri sunucusu ile veri yolu balants kurulursa, bu deiken deer tutar hale gelir; balant kurulamazsa bu deiken bo kalr. mysql_connect() fonksiyonunun baarl olup olmadn bu deikenin durumunu snayarak anlayabiliriz. rnein: $veri_yolu =mysql_connect("kara-murat", "root"); if ( ! $veri_yolu) die ("MySQL ile veri balants kurulamyor!); Burada veri sunucusunun bulunduu Web sunucusunun adnn "kara-murat" olduuna, ve ooturumun "root" yetkileriyle aldna dikkat edin. kinci satrdaki if deyimi, $veri_yolu deikeninin deer ierip iermediine bakyor ve deikende bir deer yoksa, balant kurma giriini durdurarak, ziyaretiye hata mesaj gnderiyor. Balant baaryla kurulduktan sonra PHP program, bu yoldan, veritaban sunucusuna, hangi veritaban dosyasndan yararlanmak istediini bildirmelidir. Buna veritaban dosyas seme ilemi denir ve mysql_select_db() fonksiyonu ile yaplr: mysql_select_db( "veritabann_ad" , $veri_yolu ) or die ("Veritaban alamyor!".mysql_error() ); Bu fonksiyonun baaryla icra edilip edilmedii fonksiyondan dnen deerin true/doru veya false/yanl olmasndan anlarz. Bu deer false ise bu deyimin die() blm icra edilecek ve Browser penceresine veritabannn alamad mesajyla birlikte MySQL'in hata mesaj da gnderilecektir. PHP'nin MySQL veritabann seememesi ou zaman kullanc yetkilerinin Internet ziyaretilerini kapsayacak ekimde dzenlenmemi olmasndan kaynaklanr. Bu durum gerek Web sunucusunda ortaya karsa, Web sunucusu ynetimine bavurmak gerekir. imdi bu anlattklarmz biraraya getiren kolay bir PHP programyla biraz nce oluturduumuz "veri" adl veritabanndan bir birinci kiiye ait verileri "okutarak, HTML sayfamzda kullanalm. Aadaki program, veri_01.php adyla 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>

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO .:103

<BODY> <?php $veri_yolu = mysql_connect("kara-murat", "root"); if ( ! $veri_yolu ) die ("MySQL ile veri balants kurulamyor!"); mysql_select_db("veri" , $veri_yolu) or die ("Veritabanna ulalamyor!" . 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("Grevi: %s<br>\n", mysql_result($sonuc,0,"pozisyon")); ?> </BODY> </HTML> Burada, mysql_connect() fonksiyonu ile "kara-murat" isimli sunucuda root adna MySQL sunucu ile ba kurduktan sonra mysql_select_db() fonksiyonu ile bu ba kullanarak veri isimli veritabanndan veri ekeceimizi bildiriyoruz. Daha sonra mysql_query() fonksiyonu ile bu veritabanndaki calisanlar isimli tablodan hereyi seiyoruz ve seilenleri $sonuc dizi-deikeninde topluyoruz. $sonuc deikenin deerlerini grntlemek iin PHP'nin zel bir fonksiyonu olan mysql_result() fonksiyonu kullanyoruz. Burada metin biimlendirmekte yararlandmz printf() fonksiyonunu daha nce tanmtk. mysql_query() fonksiyonu, PHP'nin SQL dilini kullahnarak veritaban ilemleri yapmasn salayan balca aracdr. Yukarda ksaca deindiimiz btn SQL komutlaryla yazacamz btn "query" deyimlerini bu fonksiyon ile icra ettireceiz. mysql_result() ise SQL deil, Data Manipulation Language (DML) denen baka bir veri-biimlendirme dilinin inceliklerinden yararlanmamz salar. Burada $sonu deikeninde veritaban kayt biiminde tutulan verileri PHP'nin ve dolaysyla HTML'in anlayaca biime eviren bu fonksiyondur. imdi bu program biraz gelitirilim ve daha nce kendi kendine bilgi veren Form rneimizi buraya uygulayalm; ancak bu kez, ziyaretimizin verecei bilgileri veritabanna ekleyelim; ve kendi adnn veritabanna eklendiini sayfadaki tabloyu gncelleyerek bildirelim. nce u program, veri_02.php adyla kaydedelim: <?php // Form doldurulduktan sonra program buradan balyor if ( isset ( $HTTP_POST_VARS )) { $veri_yolu = mysql_connect("server", "root"); if ( ! $veri_yolu ) die ("MySQL ile veri balants kurulamyor!"); mysql_select_db("veri" , $veri_yolu) or die ("Veritabanna ulalamyor!" . mysql_error() ); $ekle = mysql_query("INSERT INTO calisanlar ( adi , soyadi , adres , pozisyon ) VALUES ('$adi', '$soyadi', '$adres', '$pozisyon' )", $veri_yolu ); echo (" <HTML>

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO .:104

<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=windows1254'> "); $sonuc = mysql_query("SELECT * FROM calisanlar", $veri_yolu); echo (" <TABLE> <TR> <TD><B>Uzmann Ad</B></TD> <TD><B>alt Yer</B></TD> <TD><B>Grevi</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>Teekkr ederiz.</B></P> <A HREF='index.php'>Ana sayfaya dnmek iin tklaynz</A> "); } // program ilk kez alyorsa buradan balayacak 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=windows1254'> </HEAD> <BODY> <p><B>Mevcut yelerimiz</B></P> ");

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO .:105

$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>Uzmann Ad</B></TD> <TD><B>alt Yer</B></TD> <TD><B>Grevi</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 aramza katlmak ister misiniz?</B></P> <FORM ACTION='$PHP_SELF' METHOD='POST'> <TABLE> <TR><TD>Adnz: </TD><TD><INPUT TYPE='TEXT' NAME='adi'></TD></TR> <TR><TD>Soyadnz: </TD><TD><INPUT TYPE='TEXT' NAME='soyadi'></TD></TR> <TR><TD> Yeriniz: </TD><TD><INPUT TYPE='TEXT' NAME='adres'></TD></TR> <TR><TDALIGN='left'>Greviniz: </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='Tmn sil!'></TD></TR> </TABLE> </FORM> </BODY> </HTML> "); } ?> Program, ilk kez altnda, almaya ikinci yarsndaki else() deyiminden itibaren icra ediliyor; ziyaretilerimize mevcut yelerimizin listesini veriyor ve ye olmak isteyip istemediini soruyor. Arzu edenin ye olabilmesi iin gerekli Form'u da sunuyoruz. Programn her iki blmnde de veri okuyan ve bunu grntleyen, yani programn canalc noktas, mysql_fetch_row() fonksiyonudur. PHP'nin DML aralarndan olan bu

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO .:106

fonksiyonun marifeti, bir veritabanndan elde edilen sonucu satr-satr okumasdr. Nitekim, burada bu fonksiyondan dnen deeri $satir adn verdiimiz dizi-deikene yazyoruz ve sonra printf() bu dizinin elemanlarn srayla Browser penceresine gnderiyor. (Burada olduu gibi $satr deikenin iinde ka ka stun olduunu bildiimiz durumlarda printf() fonksiyonunu dngsz kullanmak mmkndr. Ancak veritabannn stun saysn bilmiyorsak bunu szgelimi count($satir) yoluyla renip, bu bilgiyle bir for dngs kurmak yerinde olur. Programn iki blm arasndaki tek fark, $HTTP_POST_VARS dizi-deikeninin bir deer tutmas halinde (yani ziyareti sayfay atnda karsna kan Form'u doldurduu ve gnderdii zaman) alan birinci blmnde, mysql_query() fonksiyonunun bu kez veritaban dosyasna ziyaretinin verdii bilgileri ilemek zere farkl bir SQL deyimi iermesidir. Nasl yazldn daha nce ele aldmz bu fonksiyon "calisanlar" tablosundaki drt alana elimizdeki drt deikenin deerlerini SQL'in INSERT komutuyla ekliyor. PHP'nin MySQL ile yapabileceimiz veritabayn ynetimi iin 20'ye yakn fonksiyonu vardr; MySQL de bu fonksiyonlar yardmyla ok sayda i yapabilir. Bu konuda ayrntl bilgiyi MySQL ve PHP'nin Internet sitelerin yan sra, http://hagen.let.rug.nl/~s0367672/pm_lin_e.htm adresinde bulabilirsiniz. Bu konuya son verirken, Form rneindenden farkl olarak yukardaki veritaban rneinde ziyaretinin girecei bilgilerle ilgili gvenlik nlemleri alnmadna dikkatinizi ekerim.

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO .:107

PHP'de Gvenlik
Gnmzde Internet'te ne kadar gvenlik nlemi alnsa, yeridir. Sadece iyi niyetli olmayan kiilere kar deil, fakat daha ok ne yaptn tam bilmeyen Web ziyaretilerini de dnmek ve PHP programlarnzn gvenliini arttrmak zorundasnz. Internette iyiniyetli olunmaz. Ac, ama gerek. Internete iine zararl kod yerletirilebilecek bir Form koyarsanz, emin olmalsnz ki, birisi bu zararl kodu koyacaktr. Sadece ktniyetli kiilerin size sz gelimi elektronik posta adresi veya mesaj grnmnde zararl kod gndermesini nlemek iin deil, fakat normal kullanclarn yapabilecekleri sradan hatalar yakalamak ve dzeltmek iin de nlem almanz gerekir. Server gvenlii son derece nemli bir konu olmakla birlikte, bunu salamak genellikle tasarmcnn sorumluluunda deildir. Bununla birlikte sayfalarmzn ve veritabanmzn gvenlii ve Web uygulamalarmzn doru ilemesi bizden sorulur. Bir form ile sizin sayfalarnza veya veritabannza ne gibi zararlar verilebilir? Bu zararlarn banda, en hafifinden sizin sayfanz baka yere ynlendirmek gelebilir. Ktniyetin ls arttka bu, Server programnn aklarndan yararlanarak, Serverdaki dosyalar deitirmeye veya tahrip etmeye kadar gidebilir. Normal ziyareti hatalar arasnda ise szgelimi elektronik posta adresini iki @ iaretiyle yazmaktan tutun, bu iareti koymamaya, metktubun gidecei bilgisayarn adresini eksik yazmaya kadar uzanan bir dizi yanllk bulunabilir. Ziyaretiler formu eksik doldurabilirler. Bu gibi eksiklikler ve yanllklar daha sonra dzeltmek zaman kaybna yol aar. Kimi zaman eksik doldurulmu bir Form, bu bilgilerin ulatrlaca programda hataya yol aabilir. Bu sebeple, zellikle Form yoluyla alnan bilgilerin denetimi ve dorulatlmas arttr. Bir Formun ierdii bilgilerin denetimi ve dorulanmas iki yerde yaplabilir: istemcitarafnda, sunucu-tarafnda. stemci tarafnda, yani ziyaretiye gndereceimiz HTML sayfasnn iinde yer alan kodlarla yapacamz denetim-dorulama, hzl alr; ve ziyareti ile sunucu arasnda iletiim kurulmadan nce yaplr; bylece ziyaretinin szgelimi gnder dmesini tkladktan sonra ok beklemesi gerekmez. Ne var ki bu yntemde denetim-dorulama kodu ziyaretiye gnderilmitir; kt niyetli kii neyi denetlediinizi grecek ve isterse bu denetimi kaldracak size zararl kod paracklar gnderebilecektir. Denetimin sunucu tarafnda yaplmas, belki biraz daha fazla zaman harcamay gerektirir, fakat gvenlik asndan daha etkili olabilir. Elektronik posta adresi dorulama ve mesajlarn iinden zararl kodlar ayklama yntemlerinden Dzenli fadeler blmnden sz ettik. Orada ele aladmz rnek kodlar gelitirilerek ziyaretilerin girdilerinde daha sk aramalar yaplabilir.

Parola ve SSL
PHP gibi, kendisi ziyaretinin Browser'na gnderilmeyen bir dille, sitelerimi parola ile korumak mmkn ve kolaydr. Sitenize sadece sizin vereceiniz parola ile girilmesini istiyorsanz, ana sayfann yle balamas yeter: <?php if (!isset($parola) || $parola != "gizli_kelime") { ?> <FORM ACTION="parola_igir.php" METHOD="POST">

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO .:108

Parola: <INPUT NAME="parola" TYPE"password"><BR> <INPUT TYPE="submit"> </FORM> <?php } else { // Buraya gizlenen sayga girecek ?> PHP ayrca mevcut hemen hemen btn sunucu kullanc kimlik dorulama protokolleri ile uyumludur; ve sunucu ynetimi ile iliki kurularak daha karmak kullanc kimlik dorulama yntemleri uygulanabilir. Bu yntemler arasnda Secure Socket Layer (SSL) yntemlerini, ve OpenSSL ve ModSSL teknikleri sayabiliriz.

Trnak areti Sorunu


PHP4.0' tasarlayanlar, zellikle zararl kodlar gizlemekte kt niyetli kiilerin yararland tek ve ift trnak iaretlerinin sisteme zarar vermesini nlemek amacyla, ziyareti girdilerindeki trnak iaretlerinin otomatik olarak Escape karakteri ile zararsz hale getirilmesini salam bulunuyorlar. Buna gre bir ziyareti bir forma sz gelimi "PHP'nin yararlar" yazacak olursa bu "PHP\'nin Yararlar" haline dnecektir. Kimi zaman irkin grnse de bu, bir sitenin gvenlii iin nemli bir kazantr. Bu sistemin ileyebilmesi iin sunucu ynetiminin PHP kurulumu srasnda php.ini dosyasnda gereken dzenlemeyi yapm olmas gerekir. Bunun yaplmad durumlarda, programc olarak siz, PHP'nin deikenlerin deerlerinde gerektiinde tersbl iareti uygulamasn, bu deikeni addslashes() fonksiyonu ile birlikte kullanarak zmleyebilirsiniz. rnek: $yeni_degisken = addslashes($eski_degisken)

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO .:109

PHP Kaynaklar
Gvenlik dahil, PHP konusunda bavurulacak kaynaklarn bir ksm yle sralanyor. Ayrca bu kitapn rnek kodlar arasnda, PHP Hosting Companies Search the Directory.htm adl belgede k sayda kurum ve firmasn 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

Seval ZBALCI seval.ozbalci@bayar.edu.tr - Internet Programlama Ders Notu - CB Turgutlu MYO .:110

You might also like