İbrahim Halil Kutluay Nisan 2013 HTML-CSS-PHP MYSQL-SQL
İbrahim Halil Kutluay
Nisan 2013
HTML-CSS-PHP MYSQL-SQL
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
2
Ġçindekiler
Ġçindekiler ............................................................... 2
GĠRĠġ .................................................................... 21
Kullanım Kuralları ................................................... 23
HTML DĠLĠ ............................................................. 24
Bir Web Sitesi Bilinmesi Gereken Temel Bilgiler ........ 26
Bir web sitesi için .................................................... 26
Domain Uzantı Adları ............................................ 28
TCP / IP .............................................................. 29
PORT .................................................................. 30
Web Server ......................................................... 30
Apache ............................................................ 32
IIS .................................................................. 32
Bir Web Server yazılım paketi seçerken dikkat edilmesi gereken bir kaç ilkeyi sıralayalım: ........... 32
Web‘de Gezme ĠĢlemine Genel Bir BakıĢ ................. 35
HTML‘in baĢlıca özelliklerini Ģöyle sıralayabiliriz: .......... 36
Web Tarayıcıları ...................................................... 39
Microsoft Internet Explorer ................................. 39
Netscape Navigator ........................................... 40
Firefox ............................................................. 40
Opera .............................................................. 40
Google Chrome ................................................. 40
Yandex Browser ................................................ 40
Tarayıcılar Ġçin Yardımcı Programlar ve Ek Birimler .. 40
HTML Editörleri ....................................................... 42
Expression Web ................................................... 42
Dreamweaver ...................................................... 42
Word .................................................................. 42
NVU ................................................................... 43
HTML‘in Temel BileĢenleri ........................................ 44
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
3
Etiketler (Tag) ..................................................... 44
HTML Yazım Kuralları ............................................ 45
HTML Dosyasının Bölümleri.................................... 45
Türkçe bilgi içeren bir sayfa örneği ise; ...................... 46
<html>...</html> ............................................... 47
<head>...</head> .............................................. 47
<title>...</title> ................................................. 47
<body>...</body> .............................................. 47
Meta Etiketleri Arama Motorları Ġçin Sitemize
Eklememiz Gereken Bilgiler ................................ 48
Meta Tağlarının GeliĢmiĢ Kullanımı ......................... 50
Sayfanın Süre AĢımını Belirtmek .......................... 50
Bir Sayfanın Belirli Bir süre Ekranda Kalıp
Otomatikman BaĢka Bir Adrese Yönlenmesini Sağlamak ......................................................... 50
Türkçe Karakterleri Görüntülemek-Kod Sayfası ........ 51
<BODY> Etiketinin Parametreleri ........................... 52
TrueType Fontlar-Harf GeniĢliği Serif ve Sans Serif
Harfler ............................................................. 52
H1,H2,H3,H4,H5,H6 BaĢlık Etiketleri .................... 53
<br> etiketi...................................................... 54
<p>…</p> etiketi ............................................. 55
Genel Biçimlendirme Etiketleri .................................. 57
Metni Koyu, veya Ġtalik Yazdırma ........................ 58
HTML Dilinde Renk Kodlaması ............................. 59
Güvenilir 216 Renk ............................................ 62
Sıralı Listeler..................................................... 65
Sırasız Listeler .................................................. 67
<HR> Etiketi ile Çizgi OluĢturma ......................... 68
Resim ve Multimedya Dosyalarını Kullanmak ........... 69
Marquee ile Resim Ve Metin Kaydırma .................... 71
Resimleri Kullanırken Dikkat Edilecekler; .............. 73
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
4
Video ve Ses Dosyalarının Kullanımı ....................... 74
Tablolar ................................................................. 75
BaĢlık, Satır ve Veri Etiketleri................................. 75
Sütun ve Satır BirleĢtirme – Colspan- Rowspan ........ 78
Zemin - Bgcolor ................................................ 78
Tablonun geniĢliği- Width ................................... 78
Tablonun Çerçevesi - Border ............................... 79
Hücre içindeki boĢluk miktarı CELLPADDING ......... 79
Hücreler arası boĢluk miktarı CELLSPACING .......... 80
Sembol ĠĢaretlerinin HTML Dilindeki KarĢılıkları ........ 80
Genel Sayfa Kullanım ġekilleri .................................. 82
Çerçeveler -Frames ................................................. 86
Avantajları ........................................................... 86
Dezavantajları...................................................... 86
Frame Parametreleri ............................................. 88
Frame Satırları ve Sütunları ................................ 89
Yatay Dikey KarıĢık Frame OluĢturmak ................. 91
HTML‘de Bağlantı‘ya (LINK) GiriĢ.............................. 93
HTML‘de Bağlantı Türleri .......................................... 97
HTTP bağlantıları: .............................................. 97
FTP bağlantıları: ................................................ 97
Haber Grupları: ................................................. 97
Elektronik Posta Bağlantısı: ................................ 98
Dosya Bağlantıları: ............................................ 98
Diğer bağlantılar: .............................................. 98
Resimleri Link BaĢlığı Vermek Ġçin Kullanmak .......... 99
Resim Haritası (Image Map) ile Link Kullanımı ....... 100
Link Verirken Relative (göreceli) ve Absolute (mutlak)
Adreslemelerin Farkları ....................................... 101
KULLANICI ĠLE ETKĠLEġĠM VE FORMLAR .................. 103
Form Etiketinin Alt Seçenekleri ............................ 106
Form Elemanları Çizelgesi ................................... 107
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
5
INPUT ............................................................... 110
Kullanıcının klavyeden metin girmesi için: ............. 113
Parola GiriĢi için: ............................................. 113
Onay Kutusu için (Check iĢareti): ...................... 113
Tekil Seçme Kutusu için (Radyo düğmesi): ......... 114
Listeleme Kutusundan SeĢmek Ġçin (SELECT)...... 114
Uzun Metin GiriĢi Ġçin (TEXTAREA) ..................... 115
Gönder ve Sil düğmeleri (Submit ve Reset) ........ 115
Tabindex ........................................................ 116
URL Kodları .................................................... 118
CSS ile Biçimlendirme Teknikleri, Dinamik HTML ....... 120
CSS Stillerine Neden Ġhtiyaç Duyulur .................... 120
Cascading Style Sheets -CSS ve Kullanım ġekilleri . 121
Yerel Stil ġablonu ........................................... 122
Sayfa Ġçi Global Stil ġablonu ............................ 122
Site Ġçi Global Stil ġablonu ............................... 124
Birden fazla stil Ģablonu verilirse Tarayıcı ne yapar? 125
HTML içinde bölüm oluĢturma (DIV) ........................ 126
CSS ve Seçici(Selector) Kavramı ve Seçici Tipleri ... 127
ĠsimlendirilmiĢ Seçiciler .................................... 127
Sınıf Seçiciler .................................................. 128
Karma Seçiciler (Pseude Classes) ...................... 129
ġartlı Seçiciler (Contextual Selectors ) ............... 131
Bir Alana Tanımlı Stillerin DıĢında Stil Uygulamak .. 133
CSS Blokları ve Denetlenebilir Özellikler ................... 133
CSS Biçimlendirme Tablosu ................................. 133
Font Özellikleri Ġçin CSS Kullanımı: .......................... 139
FONT-FAMILY (Yazıtipi ailesi): .............................. 139
FONT-STYLE(YazılıĢ ġekli): .................................. 140
FONT-VARIANT (Yazıtipi türü):............................. 140
FONT-WEIGHT (Yazıtipi Koyuluğu): ...................... 140
FONT-SIZE (Yazıtipi boyutu): .............................. 141
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
6
Renk ve Zemin Özellikleri: ................................... 142
Metin Özellikleri: ............................................. 143
Konum (Pozisyon) Özellikleri ............................... 145
Konum ―POSITION:‖ Değerleri ......................... 146
CSS ve Katman (Layer) Kavramı .......................... 147
Katman Ġndeksi – (Z-index): ............................ 149
BoĢluk bırakma, Margin : .................................... 150
Xhtml BELGE TÜRÜ ............................................ 151
Sonuç .................................................................. 152
Altın Öğütler ......................................................... 153
Hosting Hizmeti Alırken ...................................... 153
Web Sitesi Yaparken ........................................... 153
Site Tasarımı Adımları ......................................... 154
Bir Site Tasarlarken ............................................... 156
Bir Web Sitesinin Tutulmasını Sağlayan Etkenler ....... 158
Tanıtım ............................................................. 159
Kullanıcı Dostu Tasarım ....................................... 160
EriĢilebilirlik ....................................................... 160
Kaliteli Ġçerik ..................................................... 161
Geri Besleme ..................................................... 161
Php Programlama Dili ............................................ 162
Php Programlama Dili ............................................ 162
Php Dilinin GeçmiĢi ............................................. 162
Neden PHP ........................................................ 164
Interaktif Web Sayfaları Hazırlamak Ġçin Yöntemler 165
PHP ve ASP KarĢılaĢtırması .................................. 167
PHP ve Cold Fusion KarĢılaĢtırması ....................... 169
PHP Dilinin Kapasitesi ......................................... 169
PHP Nasıl ÇalıĢır ................................................. 170
PHP Dili ve Veritabanı Programları ile ĠliĢkisi ............. 172
PHP Dilinin GeniĢletilebilirliği .................................. 175
Bazı PHP Kütüphaneleri ve iĢlevleri ....................... 175
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
7
PEAR (PHP Extension and Application Repository) .. 179
PHP - Web Sunucusu – PHP Kurulumu ..................... 179
XAMPP .............................................................. 180
APPSERV ........................................................... 180
Uniform Server .................................................. 181
EasyPHP ........................................................... 181
Php Öğrenmek Zormu ........................................... 182
Ġlk PHP Programımız – Merhaba Dünya .................... 182
PHP KOD YAZIM KURALLARI ................................... 182
Açıklama (Yorum) Satırları ..................................... 187
PHP ile Ekrana Çıktı Verme ..................................... 189
echo() fonksiyonu-(Ekrana yazdırma) ................... 189
print() fonksiyonu – (Ekrana Veri Yazma) .............. 190
Escape Kodlar .................................................... 191
DeğiĢken Nedir ? ................................................ 192
DeğiĢken Türleri ................................................. 195
Alfanümerik DeğiĢkenlerin Ġçeriğine Dizi Olarak EriĢme ....................................................................... 196
Diziler (Array) .................................................... 197
Çok Boyutlu Diziler ............................................. 198
Dizi Tanımlama Kuralları ..................................... 199
Nesneler (Objects) ............................................. 200
Sabit Değerler - Constants .................................. 201
define ("SABIT_ADI", değeri); ............................. 202
Operatörler .......................................................... 204
Aritmetik Operatörler: ........................................ 205
BirleĢik Atama Operatörleri .................................. 207
Bir Arttırmak veya Azaltmak için .......................... 208
Kontrol Blokları ve KarĢılatırma Operatörleri ............. 208
KarĢılaĢtırma Operatörleri ...................................... 208
ĠĢlem Önceliği Sıralaması .................................... 211
if komutu ............................................................. 212
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
8
if-endif Kullanımı ve PHP ile HTML Kodunu Ayırma .. 215
Endif .............................................................. 217
switch komutu ...................................................... 217
Tek KoĢula Göre Ġki Sonuç - Üçlü Operatör (Ternary Operatör)............................................................. 220
Döngü Kavramı ..................................................... 220
For Döngüsü ...................................................... 221
While Do Döngüsü .............................................. 223
Do While Döngüsü .............................................. 223
For .. Each Döngüsü ........................................... 225
Döngüyü Kırmak için Break Komutu ..................... 226
Döngüyü Devam Ettirme : Continue ..................... 227
Döngü Ġçinde Döngü Kullanımı ................................ 228
Döngü ve Kontrol Bloklarında PHP ve HTML Ġç içe Kullanım .............................................................. 229
BaĢka Bir Dosyayı Ġthal Etme ................................. 230
include() fonsiyonu ............................................. 231
require() fonksiyonu ........................................... 231
include_Once ve require_Once ............................. 231
include() ve türevlerindeki güvenlik açığı .............. 233
include() ile Kodun Yeniden Kullanımı ................... 234
HEREDOC Nedir ................................................. 235
Fonksiyon Kavramı ve Kategorilere Göre PHP Fonksiyonları ........................................................ 236
DeğiĢkenlerle ĠĢlem Yapan Fonksiyonlar ................ 237
isset() fonksiyonu (değiĢkene değer atanmıĢ mı
kontrol etmek) ................................................ 237
unset() fonksiyonu (değiĢkeni hafızadan atmak-yok
etmek) ........................................................... 238
empty() (DeğiĢken boĢmu) ............................... 238
is_string(), is_integer(), is_double() fonksiyonları ile
tip tespiti........................................................ 239
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
9
print_r () fonksiyonu ........................................ 240
DeğiĢken Tiplerini DönüĢtürme ve DeğiĢken Tipini Öğrenme ........................................................ 241
gettype() fonksiyonu (DeğiĢken tipini alma)....... 242
settype() fonksiyonu (değiĢekene bir tip atama) . 243
Dizilerle ĠĢlem Yapan Fonksiyonlar ..................... 245
array_merge() fonksiyonu- (Dizileri birleĢtirme) .. 246
array_push() fonksiyonu–(Dizilere değiĢken ekleme) ..................................................................... 246
array_shift() fonksiyonu–(Dizinin ilk elemanını silme) ..................................................................... 247
array_slice() fonksiyonu – (Diziden kopyalama) .. 247
sort() ve rsort() fonksiyonları-(Dizileri sıralama).. 248
asort() ve ksort() fonksiyonları-(ĠliĢkili dizileri sıralama) ....................................................... 248
Program Durdurma Fonksiyonları ............................ 249
exit() fonksiyonu (kodun çalıĢmasını durdurmak) ... 249
die() fonksiyonu (kodun çalıĢmasını durdurmak) .... 249
eval() fonksiyonu (kodun çalıĢmasını durdurmak) .. 249
Tarih ve Zamanla ĠĢlem Yapma ............................... 250
Avantajları ........................................................ 250
Dezavantajı ....................................................... 251
time() fonksiyonu (Ģu anki zaman bilgisini alma) . 251
microtime() fonksiyonu (Ģu anki zaman bilgisini
hassas birimle alma) ........................................ 251
strtotime() fonksiyonu (Metni zaman bilgisine
çevirme) ........................................................ 252
date () fonksiyonu (tarih zaman bilgisini metne
çevirme) ........................................................ 252
mktime() fonksiyonu (sayılardan tarihi oluĢturma)
..................................................................... 256
checkdate() fonksiyonu-Tarih geçerli mi ............. 257
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
10
setlocale() fonksiyonu (bölgesel ayarlar) ............ 257
Tarih Bilgilerini Türkçe Yazdırmak ...................... 258
getdate() fonksiyonu (tarih zaman bilgisini alma) 259
Matematiksel ĠĢlemlerde Kullanılan Fonksiyonlar Ve ĠĢlevleri .......................................................... 260
ceil() fonksiyonu (yukarı yuvarlama) .................. 260
floor() fonksiyonu (aĢağı yuvarlama) ................. 260
round () fonksiyonu (matematiksel yuvarlama) ... 260
rand() fonksiyonu (rastgele sayı üretme) ........... 261
mt_rand() fonksiyonu (rastgele sayı üretme) ...... 261
srand() ve mt_srand() fonksiyonları (ilk sayıyı
vererek rastgele sayı üretmek) ......................... 262
getrandmax() ve mt_getrandmax() fonksiyonları
(Üretilebilecek en yüksek sayı) .......................... 263
abs() fonksiyonu (mutlak değer) ....................... 263
sqrt() fonksiyonu (karekök alma) ...................... 263
pow() fonksiyonu (üs alma) .............................. 263
hypot() fonksiyonu (hipotenüs hesaplama) ......... 264
log() fonksiyonu (logaritma) ............................. 264
log10() fonksiyonu (logaritma) .......................... 264
base_convert() fonksyionu (sayının tabanını değiĢtirme) ..................................................... 264
bindec() fonksiyonu (desimal düzene çevirme) .... 265
decbin() fonksiyonu (Onluk düzenden ikilik düzene
çevirme) ........................................................ 265
dechex() fonksiyonu (16 lık düzene çevirme) ...... 265
decoct() fonksiyonu (8 lik düzene çevirme)......... 265
hexdec() fonksiyonu (Hex düzeninden ikilik düzene
çevirme) ........................................................ 265
octdec() fonksiyonu (8‘lik düzenden 2‘lik düzene
çevirme) ........................................................ 266
max() fonksiyonu (en büyük değeri bulma) ........ 266
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
11
min() fonksiyonu (en küçük değeri bulma) ......... 266
Trigonometrik fonksiyonlar ..................................... 266
sin() fonksiyonu (sinüs) ................................... 266
cos() fonksiyonu (kosinüs) ............................... 266
tan() fonksiyonu (tanjant) ................................ 266
asin() fonksiyonu (arcsinüs) ............................. 266
cos() fonksiyonu (arckosinüs) ........................... 267
atan() fonksiyonu (arctanjant) .......................... 267
deg2rad() fonksiyonu (açıyı radyana dönüĢtürme)
..................................................................... 267
rad2deg() fonksiyonu (açıyı radyana dönüĢtürme)
..................................................................... 267
Metin ĠĢleme Fonksiyonları ............................... 268
substr() fonksiyonu (Metnin bir parçasını alma) ... 268
chr() fonksiyonu (ASCII kodun karakter karĢılığı) 270
ord() fonksiyonu (Karakterin ASCII kodunu bulma)
..................................................................... 270
strlen() fonksiyonu (Metnin uzunluğunu bulma) .. 270
count_chars() fonksiyonu (Metin içinde karakterlerin tekrar etme sayısını bulma) .............................. 271
str_word_count() fonksiyonu (Metin içindeki kelime sayısını bulma)................................................ 271
strpos() ve stripos() fonksiyonları (Metnin bulunduğu pozisyon) ....................................................... 272
strstr () ve stristr () fonksiyonları (Metnin ilk bulunduğu yer) ............................................... 273
wordwrap() fonksiyonu (Metni satırlara ayırma) .. 274
explode() fonksiyonu (Metni bölümlere ayırma) ... 274
implode()fonksiyonu (Metni bölümlere ayırma) ... 275
strtoupper() fonksiyonu (büyük harfe çevirme) .. 275
strtolower () fonksiyonu (küçük harfe çevirme) .. 275
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
12
ucfirst () fonksiyonu (ilk harfi büyük harfe çevirme)
..................................................................... 275
ucwords () fonksiyonu (kelimelerin ilk harfini büyük
harfe çevirme) ................................................ 276
number_format() fonksiyonu (Rakamları ekrana
biçimlendirerek yazdırmak) ............................... 276
strcmp () fonksiyonu (iki metni karĢılaĢtırma) ..... 277
strcasecmp () fonksiyonu (iki metni karĢılaĢtırma) ..................................................................... 278
str_pad () fonksiyonu (metnin etrafını boĢlukla (yada karakterle) destekleme) ................................... 278
printf() ve sprintf() fonksiyonu (biçimlendirerek çıktı verme)........................................................... 279
parse_str() fonksiyonu (get ile alınan değiĢkenleri parçalayarak bir diziye atma) ............................ 283
Veri ġifreleme Fonksiyonları ................................... 284
cyript() fonksiyonu (Metni verilen bir anahtara göre Ģifreleme) ....................................................... 284
sha1() fonksiyonu (Metni hash algoritması ile Ģifreleme) ....................................................... 285
md5() fonksiyonu (Metni MD5 algoritması ile Ģifrelem) ........................................................ 286
Düzenli Ġfadeler (REGEXPS) .................................... 287
Temel Seviye Regexpler ...................................... 288
BaĢlangıç Düzeyi Regexpler ................................. 289
Üst Düzey Regexp Ġfadeleri ................................. 290
En Üst Seviye (Guru ) Düzeyi Regexp Ġfadeleri....... 292
preg_match() fonksiyonu (metinler eĢitmi) ......... 294
preg_match_all() fonksiyonu ............................ 295
ereg() fonksiyonu (dizilim arama) ..................... 295
eregi() fonksiyonu (dizilim arama) ..................... 296
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
13
ereg_replace() fonksiyonu (dizilim arama ve
değiĢtirme) ..................................................... 296
split() fonksiyonu (metni parçalara ayırma) ........ 297
sql _regcase() fonksiyonu (düzenli ifade üretme) 298
Kullanıcı Tanımlı Fonksiyonlar GeliĢtirmek ................ 299
Basit Bir Fonksiyon Yazalım - myecho ................... 299
GLOBAL ve STATĠK DEĞĠġKENLER .......................... 302
Dizi Fonksiyonları .................................................. 305
array() fonksiyonu (değerleri diziye çevirme) ...... 305
count() fonksiyonu (dizinin eleman sayısını bulma) ..................................................................... 305
print_r () fonksiyonu (değiĢken içeriğini yazdırma) ..................................................................... 305
var_dump () fonksiyonu (değiĢken içeriğini yazdırma) ....................................................... 305
Dizileri Sıra ile ĠĢlemek .......................................... 307
list() fonksiyonu .............................................. 307
each() fonksiyonu ........................................... 307
For.. Each ile dizileri iĢlemek .................................. 307
For ile dizileri iĢlemek ............................................ 308
PHP ve Formlar ..................................................... 309
Süper Globaller (Superglobals) ............................ 309
Form Dizaynında Altın Kurallar ................................ 312
Formlardan Bilgi Alma ........................................... 313
Form Verilerini ĠĢleme (Ġki dosya ile) ....................... 313
Form Verilerini ĠĢleme POST Metodu ........................ 316
Form Verilerini ĠĢleme (Tek dosya ile) ..................... 317
Form Verilerini ĠĢleme POST Metodu ........................ 320
Hesap Makinesi Programı ....................................... 322
Basit Bir ġifreli GiriĢ Sayfası ................................... 324
Birden Fazla Sayfaya Yayılan Formlar ...................... 325
PHP ile Posta Gönderme......................................... 325
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
14
mail() fonksiyonu – PHP ile eposta göndermek ....... 326
Web Sayfasından Bir Siteye Dosya Yükleme (Upload) 333
PHP SERVER DEĞĠġKENLERĠ .................................. 336
Kullanıcının Girdiği Değerlerin Doğruluğunu Kontrol Etme ................................................................ 338
Windows ve Unix Dosya EriĢim Yetkilendirmesi ...... 339
PHP Klasör Fonksiyonları ........................................ 341
mkdir() fonksiyonu (Klasör oluĢurmak) .............. 341
rmdir() fonksiyonu (Klasör silmek) .................... 341
chdir() fonksiyonu (Klasör değiĢtirmek) .............. 341
is_dir() fonksiyonu (Dizin mi) ............................ 341
opendir() fonksiyonu (Klasörü açmak) ............... 342
readdir() fonksiyonu (Klasörü okumak-listelemek)
..................................................................... 342
closedir() fonksiyonu (Klasörü kapatmak) ........... 342
PHP Dosya Fonksiyonları ........................................ 345
file_exits() fonksiyonu (Dosya var mı?) .............. 345
filesize() fonksiyonu (Dosya boyutunu bulma) ..... 346
is_file() fonsiyonu (Dosya mı ) ......................... 347
is_readable() fonksiyonu (Dosya okunabilir mi?) . 347
is_writable() fonksiyonu (Dosya yazılabilir mi? ) .. 348
is_executable() fonksiyonu (Dosya çalıĢtırılabilir mi?
) ................................................................... 348
touch() fonksiyonu (dosya oluĢturma) ................ 349
unlink() fonksiyonu (dosya silme) ...................... 350
copy() fonksiyonu (dosya kopyalama) ................ 350
readfile() fonksiyonu (Dosyayı satır satır okumak ve ekrana yazmak) .............................................. 350
fopen () fonksiyonu (dosya açma) ..................... 351
fgets () fonksiyonu (dosyadan satır satır okuma) . 352
fseek () fonksiyonu (dosya içinde bir yere
konumlanma) ................................................. 352
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
15
fread () fonksiyonu (dosyadan belirli sayıda karakter
okuma) .......................................................... 353
fgetc () fonksiyonu (dosyadan birer birer okuma) 353
feof () fonksiyonu (dosya sonuna gelindi mi) ...... 353
fclose () fonksiyonu (dosyayı kapat) .................. 353
fputs() ve fwrite() fonksiyonu (dosyaya yazma-dosyaya ekleme) ............................................. 356
flock() fonksiyonu (Kullanımdaki dosyayı kilitleme) ..................................................................... 357
fileadate() fonksiyonu (Dosyaya son eriĢim tarihi- file access date ) .................................................. 359
filemdate() fonksiyonu (Dosyanın son değiĢtirilme tarihi- file modification date) ............................. 359
filecdate() fonksiyonu (Dosyanın oluĢturulduğu tarih - file creation date) .......................................... 359
CSV Dosya Fonksiyonları ........................................ 359
fgetcsv() fonksiyonu (CSV dosyasını satır satır okuma) .......................................................... 360
fputcsv() fonksiyonu (Değerleri CSV formatında yazma) .......................................................... 361
KullanıĢlı Bir Örnek Kayıt Arama ............................. 362
Öğrenci Notlarını Webde Yayınlama ...................... 362
Basit Telefon Rehberi ............................................ 365
Basit Sözlük ......................................................... 369
Basit Ziyaretçi Defteri ............................................ 372
PHP Çerez - Cookie Fonksiyonları ............................ 377
setcookie() fonksiyonu – (Çerez bırakma) .......... 379
Aynı sayfada birden fazla çerez bırakmak .............. 383
PHP Dilinde Oturum – Kullanımı .............................. 384
PHP ve MYSQL Kullanımı ........................................ 385
MySQL Nedir ? ...................................................... 386
Veritabanı ve Tablo Nedir ....................................... 387
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
16
Mysql Tablo Tipleri ................................................ 387
Mysql Veri Tipleri ............................................... 387
Metin tipleri .......................................................... 388
CHAR ve VARCHAR Farkı ........................................ 388
BLOB ve TEXT Alanlar ...................................... 389
Sayısal Veri Tipleri ................................................ 389
Tarih / Zaman Tipleri ............................................. 390
Küme Tipi ............................................................ 391
Tablo Tasarlama, Key Ve Ġndex Kullanımı ................. 392
MYSQL ‗i Komut Satırından Yönetmek ................... 395
Mysql‘i BaĢlatmak .............................................. 395
Komut Satırından Veritabanı OluĢturmak .............. 395
Komut Satırından Tablo OluĢturmak ..................... 395
Komut Satırından Veri GiriĢi ................................ 396
Komut Satırından Veri Sorgulama ........................ 396
Komut satırından Bilgi DeğiĢikliği Yapmak ................ 397
Komut Satırından Kayıt Silmek ............................... 398
SQL Dilinin Tarihçesi.............................................. 399
ĠliĢkisel Bir VTYS Ġçin 12 kural ................................ 400
SQL Dilinin Bölümleri ............................................. 403
A. DDL (DATA DEFINITION LANGUAGE) KOMUTLARI ....................................................................... 404
B. DML (DATA MANIPULATION LANGUAGE) KOMUTLARI ....................................................... 404
Veritabanı içindeki seçmek, değiĢtirmek, güncellemek ve silmekle ilgili SQL deyimleridir. ............................... 404
C. DCL (DATA CONTROL LANGUAGE) KOMUTLARI .. 404
SQL Komutları ve Örnekler ..................................... 405
A. DDL KOMUTLARI ............................................ 406
CREATE Komutu .............................................. 406
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
17
CREATE komutu tablo ve view gibi bir veritabanı nesnesi
yaratmayı sağlar. (Create ayrıca yeni veritabanıda oluĢturabilir.) ....................................................... 406
Mysql‘de sütun adlarını sınırlamak için ― ` ‖ karakteri kullanılır. Normalde bu verilmedende iĢlem yapılır.
normal SQL nostasyonlarında bu karaktere gerek yoktur. .......................................................................... 406
Kullanım Yapısı: ................................................. 406
ALTER DEYĠMĠ................................................. 407
Daha önce yaratılmıĢ nesnenin değiĢtirilmesini sağlar. Örneği bir tablonun tasarımını değiĢtirmek gibi. ........ 407
ALTER TABLE ders01a ADD msn VARCHAR( 40 ) NOT NULL ; ................................................................. 407
DROP DEYĠMĠ ................................................. 407
Bir nesnesin silinmesini sağlar. ............................... 407
DROP TABLE ders01a ............................................ 408
B. DML (DATA MANIPULATION LANGUAGE) KOMUTLARI ....................................................... 408
SELECT DEYĠMĠ ............................................... 408
Temel Kullanımı: ................................................... 408
Parametrelerin Anlamları: ................................. 409
AS Deyimi ile Alias Tanımlama ................................ 411
Where Deyimi ....................................................... 412
And ve Or ile Birden Fazla KoĢulun Kontrol Edilmesi 414
In ve Not In Deyimleri ........................................ 414
Like ve Not Like Deyimleri: .................................... 415
Group By Deyimi .................................................. 416
Order By Deyimi: .................................................. 416
SELECT Ġçinde Aritmetik ĠĢlemler ............................ 417
Aritmetik ĠĢlem Operatörleri ................................... 418
Aggregerate fonksiyonları ...................................... 419
sum() fonksiyonu – Bir sütunun toplamı ................ 419
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
18
Bir sütuna göre bir select ifadesinin toplamını alır. .... 419
avg() fonksiyonu – Bir sütunun ortalaması ......... 420
min() fonksiyonu – Bir sütundaki en küçük değer 420
max() fonksiyonu – Bir sütundaki en büyük değer ..................................................................... 421
count() fonksiyonu – Bir sorguya göre dönen kayıt sayısı ................................................................ 422
JOIN ĠġLEMĠ ......................................................... 422
INNER JOIN ....................................................... 423
LEFT JOIN ......................................................... 424
RIGHT JOIN ...................................................... 424
TABLOYU KENDĠSĠ ĠLE ĠLĠġKĠLENDĠRME (SELF JOIN) ....................................................................... 424
ĠÇĠÇE SELECT NESTED SELECTS .......................... 425
UNION KULLANIMI ................................................ 425
EXISTS KULLANIMI ............................................ 426
C. DCL (DATA CONTROL LANGUAGE) DEYĠMLERĠ ...... 426
GRANT DEYİMİ .................................................. 426
GRANT CREATE DATABASE, CREATE TABLE .............. 426
TO ayĢe ............................................................... 426
SQL FONKSĠYONLARI ............................................ 427
Metinlerle ĠĢlem Yapan SQL Fonksiyonları .............. 427
ascii() fonksiyonu ................................................. 427
char() fonksiyonu ............................................ 427
concat() fonksiyonu ......................................... 428
length() fonksiyonu ......................................... 428
DönüĢtürme Fonksiyonları ...................................... 428
conv() fonksiyonu ........................................... 428
bin() fonksiyonu .............................................. 428
oct() fonksiyonu .............................................. 428
hex() fonksiyonu ............................................. 428
Tarihlerle ĠĢlem Yapan SQL Fonksiyonları .............. 429
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
19
TABLOLARDA DEĞĠġĠKLĠK YAPMAK: ........................ 431
INSERT Komutu .................................................... 431
UPDATE Komutu: .................................................. 431
DELETE DEYĠMĠ .................................................... 432
Kullanım biçimi: .................................................... 432
DELETE FROM tablo ............................................. 432
PHPMYADMIN ....................................................... 434
PhpMyAdmin Kurulumu ....................................... 435
PhpMyAdmin'i ÇalıĢtırma ve Tanıma ..................... 436
PhpMyAdmin ile Database OluĢturma .................... 438
PhpMyAdmin ile Tablo OluĢturma ......................... 438
Bir Veritabanının Modelini Çıkarmak ..................... 440
MySQL ve PHP ...................................................... 442
PHP Dili Mysql Fonksiyonları Tablosu ..................... 443
mysql_connect() deyimi(Database bağlantısı) ..... 446
mysql_select_db() deyimi ................................. 447
mysql_query() fonksiyonu- Mysql‘e sorgu göndermek ..................................................................... 448
mysql_numrows() fonksiyonu-Sorgudan Dönen Kayıt Sayısını Bulmak............................................... 448
mysql_result()-Sorgudan Dönen Kayıtları ĠĢlemek449
Kayıtları Ekrana Listelemek ............................... 449
DeğiĢkenleri Sorguların Ġçinde Kullanmak ........... 450
mysql_fetch_assoc() fonksiyonu- sorgu sonucundan
bir satır almak ................................................ 452
mysql_error() fonksiyonu- MySQL hatalarını konrol
etmek ............................................................ 452
PHP ile Veritabanı OluĢturma Listeleme ve Silme . 453
PHP ile Tablo OluĢturma, Listeleme, Güncelleme ve Silme ................................................................ 455
PHP ile Tablolara Veri GiriĢi, Listeleme, Güncelleme ve
Silme ................................................................ 457
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
20
Örnek Uygulama: PHP ile ġifreli GiriĢ Sayfası Yapılması
.......................................................................... 460
PHP ve GÜVENLĠK ................................................. 473
addslashes() fonksiyonu (metindeki zararlı olabilecek karakterleri etkisiz yapmak) ............................. 476
stripslashes () fonksiyonu (etkisizleĢtirilmiĢ kodları ilk haline döndürmek) ............................................. 476
strip_tags () fonksiyonu (HTML etiketlerini metinden çıkarmak) ......................................................... 477
PHP ile Header Kullanımı ........................................ 478
header() fonksiyonu-(BaĢlık bilgilerini kullanmak) .. 478
Bir Nesne OluĢturalım ............................................ 483
PRATĠK BĠLGĠLER .................................................. 487
Resim Albümü: .................................................. 487
GiriĢ sayfası yapmak .......................................... 490
Sayfada Tarih Yazdırma ......................................... 491
CMS Sistemleri ..................................................... 495
DĠĞER SÜRÜME DAĠR NOTLAR ................................ 498
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
21
GĠRĠġ
Son yıllarda internet denen olgu hayatımızın içine öyle
bir girdi ki artık çıkması mümkün olmayacak noktayı bile çoktan geçti. Önceleri fantazi yada prestij olsun diye web
sitesi yaptıran Ģirketler artık bunu zorunluluk olarak görmeye baĢladılar. Bir çok firma teklif mektuplarını
elden yada kağıda baskılı gönderen Ģirketleri doğrudan
elemeye baĢladı.
Internet denen Ģeyle 1992 de tanıĢtım. Daha doğrusu
internet denen sanal dünya ilk tanıĢmamızda sanal olarak gerçekleĢti. ArkadaĢlarla bazı üniversitelerin yurt
dıĢına doğrudan bağlanabildiğini konuĢmuĢtuk yani hepsi bu.
1995 yılında Çukurova Üniversitesinin internet kursuna katıldım. Ftp, ls, sz gibi komutları öğrenmiĢ ne de çok
sevinmiĢtim. Ardından sürekli takip ettiğim dergilerde, her Ģey internet, web tarayıcı, Netscape, Frontpage,
Outlook, ICQ, IRC gibi baĢlıklara çıkmaya baĢladı.
1998 yılında ilk resmi iĢime baĢladıktan bir süre sonra
Ģirketin ilk internet sitesi için benimde HTML öğrenmem gerekmiĢti. Bende Joe Barta‘nın yazdığı ücretsiz HTML
öğrenme setinden faydalanarak bugünkü Ģartlarda
yüzüne bile bakmayacağım ilk sitemi yapmıĢtım.
Derken Hakkı Öcal üstadın kitapçıkları çıkmaya baĢladı. HTML, Javascript, PHP… Hatta kendisi ile yazıĢan Daphne
rumuzlu arkadaĢım sayesinde birkaç kez e-mail gönderip yazıĢmıĢlığımızda oldu. Bu vesile ile bugünlerde çok sık
kullanılan ―web sitesi olmayana kız vermiyorlar”
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
22
lafını ilk kez ben bir –emailimde yazdım Hakkı Hocama.
Patenti bana ait olsa gerektir ama kimse takmaz sanırım.
Etrafta yığınla Ġngilizce kaynak varken neden Türkçe bir
kaynak sorusu beni hep üzmüĢtü. Hakkı Öcal üstadın kitapçıkları bir açığı doldurmuĢtu evet ama onlarda
yüzeyseldi sonuçta. ĠĢin asıl kötü tarafı kaynak yerinde sayarken PHP çok yol katetmiĢti. Ġsim zikretmek
istemiyorum ancak para verip aldığım orijinal kitaplarda son derece yüzeysel konular, son derece yetersiz bir
anlatımla verilmiĢti.
Yabancılara baktığımda kendimize kızmaya baĢlıyordum.
Mesela Paul Hudson‘un online kitabı bizde yazılmıĢ bütün kitaplardan kat be kat iyiyken, web sitesinde bedava
yayınlanmaktaydı. Bruce Perens‘in kitapları da ilk yılda parayla satıldıktan sonra PDF halinde bedava veriliyordu.
Bense para verip aldığım Türkçe kitaplarda merak
ettiğim basit Ģeyleri bile bulamıyordum.
Sonuçta iĢ baĢa düĢtü ve 2007 yılında yazmaya
baĢladığım notlar, 2008 yılında bu kitabın ilk taslağına dönüĢtü. Ancak uzun bir süre ilgilenme Ģansım olmadı.
Artık daha fazla öyle kalmasına gönlüm razı olmadı ve sıkı bir çalıĢma ile yayınlamaya karar verdim.
ÇeĢitli kaynaklardan esinlenmeler olduğunu ilk baĢta yazmıĢtım. BaĢta dediğim gibi bu materyaller için maddi
beklenti içinde değilim, ancak kullanımı konusunda çeĢitli sınırlar da getirmek zorundayım. Çünkü onca emek
harcadıktan sonra bazılarının bunları kaynak bile göstermeden kendilerinmiĢ gibi sahiplenmesi ayıp ötesi
bir durum olurdu.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
23
Kullanım Kuralları
1. Bu çalıĢmanın tamamı veya bir kısmını kaynak
belirtmeden yayınlamanız, çalıĢmamımı sahiplenerek kendinizinmiĢ gibi sunmanız yasaktır.
Kaynak belirterek yaptığınız alıntıları bir e-mail ile bildirirseniz sevinirim.
2. ÇalıĢmamızdaki yazı ve örnek kodları ticari amaçla
satılan bir kitap için kullanamazsınız. Ticari olmayan çalıĢmalarınızda ise alıntı yapma
kurallarına uymanız gereklidir.
3. Bu çalıĢmayı tamamen öğrenciler ve öğrenmek
isteyenler bir Ģeyleri araĢtırmak istediklerinde bir kaynak bulabilsinler diye, maddi bir beklenti
olmadan hazırladım. Beni teĢvik edecek bir mail, bir teĢekkür, siteme verilmiĢ bir link bu konudaki
Ģevkimi artıracaktır.
4. Bu çalıĢma için harcağım emek hakkı için; Ģunu da
hatırlatırım ki: Koyduğum kurallar haricinde davranıp emek hırsızlığı yapanlardan hakkımı, öbür
dünyadaki hesaplaĢmada talep edeceğim.
5. Emek hırsızlarına karĢı yasal haklarım saklıdır. Bu
yasal müeyyideler konusunda sizi önceden
uyarmak gibi bir zorunluluğum yada lüksüm yoktur.
Umarım yararlı bir Ģeyler ortaya çıkarmıĢımdır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
24
HTML DĠLĠ
Atası olan ARPA-NET ve daha sonra adeta çağı
değiĢtiren Internet çağımızın en büyük kütüphanesidir. Bu bilgiler değiĢ tokuĢ edilirken herkesin ortak bir dilden
konuĢması gerektiğinden buna bir çare arayan uzmanlar, 1986‘da, Standart GenelleĢtirilmiĢ ĠĢaretleme Dili
(Standart Generalized Markup Language, SGML) adıyla
bir protokol –dili- ortaya çıkardılar. Daha sonra ise günümüzde hala geliĢtirilen HTML protokolu üzeri bir
standart oldu.
Burada dil derken bir ayrıma dikkat etmek gerekir. HTML
bir dildir ancak bu dil makineye komut veren değil sadece bilgiyi görüntüleyecek olan bilgisayar programına
―yazının şurasını kalın yap, burada tablo yapılacak, kenarlıklı olacak, bu kısım bir pragraf” gibi komutlar
veren bir dildir. Bu bakımdan HTML‘nin bir betik dili olduğu hatırlanmalıdır.
HTML, önceleri Macintosh, ardından IBM uyumlu bilgisayarların yardım dosyalarının oluĢturulmasında
kullanıldı. Ancak, HTML kısaltmasının açık Ģekli olan Hypertext Markup Language‘de geçen Hypertext terimi,
1950 yılında Ted Nelson adlı bir bilgisayar uzmanı
tarafından içinde “hot” yani baĢka bir metinle veya resimle ilintilendirilmiĢ noktalar bulunan metin anlamına
kullanılmıĢtı. Apple bunu bir metne yada simgeye tıklayınca baĢka bir yere gitme yöntemi olarak kullandı.
Böylece metinler hareketli gibi davranmıĢ oluyordu.
Asıl aĢama ise 1989 yılında yaĢandı. CERN
uzmanlarından Tim Berners-Lee, laboratuvar yönetimini ortak bir yazı biçimlendirme sistemine ikna edebilmek
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
25
için, “Enformasyon Yönetimi: Bir Öneri” baĢlıklı bir
rapor hazırlayarak bilgisay Ģebekeleri arasında bilgi alıĢveriĢi için Hypertextin ortak bir dil olmasını önerdi.
Doğrusu imza attığı devrimi kendisi bile hayal edememiĢ olsa gerek.
Bugünkü Internet‘i Internet yapan iki ana baĢlık vardır. Birincisi bilgisayar arası iletiĢimi gerçek zamanlı
olmaktan çıkartan ve iletiĢimi daha sağlam hale getiren HTTP bağlantı protokolünün geliĢtirilmesi; diğeri ise
HTML dilinin çok yalın ancak resim, ses, video gibiher materyali taĢımaya yetecek kadar güçlü olmasıdır.
Ağ teknoloji 1980‘lerin baĢlarında bağlantının gerçek zamanlı olmasını gerektiriyordu. Internet‘in adı da ağlar-
arası ağ anlamına gelen Ġngilizce ―Inter-networks-network: Inter-net kısaltmasından doğmuĢtur. Bir
bilgisayar diğerine bağlandığında iletiĢim gerçek zamanlı
ve birebir olma durumundaydı. Gönderilen ile alınan bilginin aynı olup olmadığını kontrol etmek ancak böyle
mümkündü. HTTP (Hypertext Transmission Protocol-Hyper Metin İletim Kuralları) bunu ortada
kaldırdı. HTTP protokolünü bir otobanın ve yanında uzayıp giden bir otoyol çifti gibi düĢünülebilir. Otoban
bakımda ise otoyoldan iĢinize devam edebilirsiniz.
HTTP‘nin , 1990 yılında kurulan World Wide Web
Konsorsiyomu‘nun (W3C) tarafından resmi standartları kabul edildi. Bu yüzden 1990 bugünkü Internet‘in de
doğum tarihi olarak kabul edilebilir. W3C sürekli olarak http ve HTML içinde bulunan eksiklikler için ortak
standartlar belirlemekte ve bunları duyurmaktadır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
26
Web ortamında çalıĢan dinamik dillerin, HTML‘in
pabucunu dama attığı söylense de bu doğru değildir. Çünkü dinamik diller kullanıcının tarafında değil sunucu
tarafında çalıĢmaktadır. Yani dinamik dilin ASP veya PHP yahut JSP olması fark etmez çünkü kullanıcı hep HTML
verisi almaktadır.
Bir Web Sitesi Bilinmesi Gereken Temel Bilgiler
Bir web sitesi için
Her web adresi aslında bir numara bloku tarafından temsil edilir. Bu o sitenin IP numarasıdır. Örneğin
212.175.12.43 gibi.
IP numarası hatırlamak kolay olmadığından her
site için bir isim tanımlanmasının hatırlamayı kolay
kılacağı düĢünülmüĢtür. Bu isimlere alan adı (domain name) denir.
Hangi ismin hangi IP tarafından karĢılanacağını tutmak içinse NS (name server) dediğimiz rehber
bilgisayarlar kurulmuĢtur. (9 ana NS bilgisayar vardır ve tamamı ABD ‗dedir). Name server üzeride
kayıt sorgulamak içine DNS denilen servisten yararlanılır. Örneğin IP adresi olarak
194.27.128.101 gibi numaraları akılda tutmak zor olduğundan 1983‘te Wisconsin Üniversitesi DNS‘yi
geliĢtirmiĢtir. DNS isimleri rakamlara çevirir ve bu da daha kolay kullanım sağlar. Bazen Ttnet DNS
sunucuları hata verdiğinden ―internet çalıĢmıyor‖ diyenler olur. Oysa adres çubuğuna IP no yazılırsa
siteye eriĢim sağlanması mümkündür.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
27
Ġsimleri tahsis etmek ve çakıĢmaları önlemek üzere
Domain Register iĢi yapan Ģirketler kurulmuĢtur. Bunların iĢi uygun bir alan adını belirli bir ücret
karĢılığı kullanıcılara kiralamaktır. Kiralama iĢlemi ile birlikte bu alan adının internette hangi IP no
üzerinde olduğuda burada kayıt altına alınır.
Bir sitenin eriĢilebilir olması için DNS bilgisayarında
IP ile ağa bağlı bir bilgisayar olması gerekir. Bu kendi bilgisayarımızda olabilir ancak bu sistemlerin
gerçek sunucu olması iĢlemlerin aksamasını engelleyeceğinden ve bu sunucularda bizim için
hayli masraflı olacağından yeni bir iĢkolu doğmuĢtur. HOSTING dediğimiz bu iĢ kolunun ana
amacı kullanıcıların web sitelerini kendi sistemlerinde yayınlamak ve bunun karĢılığında
ücret almaktır.
Hosting Ģirketleri sunucu bilgisayarlarına Web server adı verilen bir program kurarlar. Bu
program ise 80 nolu portu dinleyere kendisine bağlanan kiĢilere istedikleri dosyaları iletir.
Web server ile kullanıcı TCP/IP iletiĢim protokolü üzerinden konuĢurlar.
Kullanıcı Web Server programına kendisine kurulu olan ve Browser (Web tarayıcı, Gezgin) adı verilen
programlar ile 80 nolu http portundan bağlanır.
Kullanıcıları ile Web server arasında köprü olarak
ise internete çıkarmak üzere Internet Servis Sağlayıcı (ISS- Ingilizcesi ISP – Internet Service
Provider) yer almaktadır. Zaten gerçek zamanlı iletiĢimi gereksiz kılanda bu iĢlemdir bir nevi.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
28
Kullanıcı örneğin www.tcmb.gov.tr yazdığında
browser bu talebi ISS‘ te bağlandığı bilgisayara iletmekte, o da gerekli arama iĢleminden sonra
bilgiyi talep etmektedir. ĠĢte bu aĢamada kullanıcı bağlantıyı kesse bile web server bunu
bilmemektedir. Zaten bilmesine de gerek yoktur.
Web sunucu HTML metni ( içerik ve o içeriğin
ekranda nasıl gösterileceğine dair biçimlendirme bilgileri) gönderir ancak metni biçimlendirme iĢlemi
kullanıcı tarafından yer alan browser tarafından yerine getirilir. Browserlar iĢte bu yüzden HTML
yorumlama motoru denilen engine barındırırılar.
Her yorumlayıcı farklı mantıkla ve ayrı firmalar
tarafından yazıldığından bazı metinlerin ekranda görüntüleme iĢleminde farklılıklar oluĢabilir. Ayrıca
bazen Ģirketler sadece kendi tarayıcısına yönelik
etiketleri üstelik W3C tarafından onaylanmadan motoruna ekleyebilir.
Örneğin BLINK etiketi NETSCAPE O yüzden site tasarımında ne çok bu konuya dikkat edilmelidir.
Dolayısı ile BLINK kullanılan bir sayfa Netscape ile normal görünürken, Safari ile farklı görünecektir.
En büyük Ģansımız ise tarayıcılar hatalı bir etikete rastlayınca bunu göz ardı ederek geri kalanları
çalıĢtırmaya devam etmesidir.
Domain Uzantı Adları
Günümüzde alan adları yaĢanan sıkıntıların ardından
çeĢitlendirilmiĢ ve alternatifler artmıĢtır. Ancak biz temel
standartlar üzerinden anlamlarını belirtelim.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
29
.com -Ticari Ģirketlere ait alan adını belirtir
.edu -Eğitim kurumlarına ait alan adını belirtir
.gov -Hükümet ve devlete ait alan adını belirtir
.mil -Askeri alan adını belirtir
.net -Ağ servis sağlayıcılarına ait alan adını belirtir
.org -Dernek, spor kulübü gibi organizasyonlara ait alan adını belitir
TCP / IP
Transmission Control Protocol / Internet Protocol Kelimelerinin baĢ harflerinden oluĢan Paul Baran
tarafından düĢünülmüĢ bir sistemdir. Paul Baran‘dan talep edilen Ģey Ģuydu. ―A,B,C Ģehirlerinde
bilgisayarlarımız var, A,B,C birbirleriyle konuĢabilsin,
bilgi gönderebilsin, ama A devre dıĢı kalsa bile B ve C konuĢmaya devam edebilsin, bu diğerleride içinde geçerli
olsun‖. Paul Baran bu iĢ için paket anahtarlamalı ağ iletiĢimi tekniğini düĢündü. Çünkü istenen Ģey verinin
iletilmesiydi. Her koşul ve şart altında bile verinin iletilmesi birinci öncelikti. (İlk öncelik güvenlik
olmadığı içinde bu gün güvenlik anlamında bir sürü ekstra yatırıma vs gerek duyulmakta). Veriler
paketlere bölünecek ve hedef yerde bu paketler birleĢince verinin kendisi oluĢmuĢ olacaktı.
Paul Baran daha sonra A,B,C lokasyonlarının nükleer füze merkezleri olduğunu öğrendiğinde
aslında geliştirdiği şeyin ne olduğunu anlamıştı anlamasına da bilmeden de olsa internetin ilk
öncüsü de olmuştu. Kısaca TCP / IP protokolü de
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
30
Ģüphesiz ilk olarak askeri amaçlı geliĢtirilen bir
protokoldü ve temel amacı ―bir nükleer savaĢ anında tüm telefon Ģebekesi yok olsa bile biz iletiĢimi devam
edip karĢı tarafa nükleer saldırı ile cevap verebilelim.―
1983 yılında TCP / IP ye temel hali verildi. TCP / IP
protokolü Unix iĢletim sistemine eklenmiĢ ve 1984 yılında DNS kavramı oluĢturulmuĢtur. Günümüzde
internet hayatın içine öyle girmiĢtir ki, TCP / IP sadece internetin değil tüm ağ protokollerinin arasından en çok
kullanılan durumuna yükselmiĢtir.
PORT
TCP / IP de her bilgi bilgisayarlar arasında portlar üzerinden iletilir. Ġletim için geçilen yol aynı olsada
bilgilerin doğru adrese gitmesi için portların kullanımı Ģarttır. Bir gazete datıcısını düĢünün. Dağıtım kanalı hep
aynıdır. Sokaklar. Ancak gazetelere doğru yerlere
ulaĢtırmasının tek yolu adreslerdir. Yani kapı numaraları.
HTTP iĢlemleri için 80 nolu port kullanılır. Mail alıp
gönderme için 25 ve 110 nolu portlar kullanılır. MSN, ICQ, IRC, FTP vs vsvs tüm yazılımların ayrı bir port
kullanımı vardır.
TCP /IP veriyi iletirken baĢına port‘u da kaydettiğinden, o
paketin hangi yazılım için olduğu bilgisi de otomatikman iletilmiĢ sayılabilir. Böylece bilgisayarda aynı anda bir çok
yazılım ile internet kullanılabilmektedir.
Web Server
Internette tanımlı bir alan adına karĢılık gelen bir numara
(IP numarası) vardır demiĢtik. Bu IP nolu bilgisayar sayfa
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
31
gelen kiĢilere istedikleri bilgileri gönderebilmek için hep
açık olmak zorundadır. Ayrıca bu bilgisayarda gelen talepleri toplayıp onlara cevap verecek bir de program
yüklü olmalıdır.
Web server aslında hem bu iĢlere yarayan programlara
hemde bu programların kurulduğu bilgisayarlara verilen bir isimdir. Kafa karıĢtırıcı olabilir ama ama iki tanımda
doğrudur. En çok bilinen Web Server programları Apache, MS Internet Information Server (IIS),
Xitami gibi yaygın sunuculardır.
Bu programların, bilgi alıp-vermenin yanı sıra, elektronik
posta alıp verme ve yönlendirme, veritabanlarına eriĢme ve içinden seçme yapma (Query, SQL, vb. gibi), kendi
sabit diskinde duran bir dosyayı alıp karĢı tarafa aktarma (FTP, Gopher, WAIS) veya karĢı tarafın vereceği dosyayı
alıp kendi sabit diskine kaydetme yeteneği olur.
Ġlk Web Server programı, yukarıda, HTML dilinin geliĢtirilmesindeki öncü konumu nedeniyle sözünü
ettiğimiz, Ġsviçre‘deki CERN kurumu tarafından geliĢtirildi; ama kısa zamanda UNIX platformunda,
anonim bir tarzda ve ücret ödemeden kullanılabilen bir Ģekil aldı. KiĢisel bilgisayarların UNIX gerektiren
bilgisayarlara oranla daha ucuz olması, Microsoft‘un NT, IBM‘in OS/2 iĢletme sistemlerinin UNIX‘e ciddî rakip
haline gelmiĢ bulunmaları nedeniyle, bu sistemlere dayalı Web Server programları da hızla artmaktadır.
Apache Web Server ise bir çok iĢletim sisteminde çalıĢabilmesi ve ücretsiz olması nedeniyle Linux ile
birlikte iyi bir ikili olmuĢ ve Internette en çok kullanılan
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
32
Web Server olma özelliğini açık ara ile elinde
tutmaktadır.
Apache
Açık kaynak kodludur
Bir çok iĢletim sisteminde çalıĢabilir (hatta bir çok
sistemde zaten kurulu halde gelir)
Tamamen ücretsizdir
IIS
Kaynak kodu kapalıdır.
Windows iĢletim sisteminde çalıĢır.
Ücretsiz değildir.
Linux ve FreeBSD adlı, ücretsiz dağıtılan UNIX iĢletme sistemleri de, ticarî olanları aratmayacak niteliklere
sahiptir. Ayrıca bu tür ücretsiz programlar, Apache Web
Server‘ın ücretsiz sürümünü de içerdiklerinden sıfır maliyet ve kurulum ile web server edinmek mümkündür.
Bir Web Server yazılım paketi seçerken dikkat edilmesi gereken bir kaç ilkeyi sıralayalım:
1. Yazılım paketi yeterli güvenliği sağlayacak özelliklere sahip olmalıdır. Binalarda bir odadaki yangının yandaki
odaya sıçramasını önleyen ateĢe dayanıklı duvarlardan (Firewall) esinlenerek adlandırılan bir dizi program,
Web Server yazılımının bulunduğu bilgisayarın, kötü niyetli kiĢiler tarafından bozulmasına engel olmaktadır.
Ancak Web Server‘ın kendi içinde mevcut güvenlik
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
33
önlemlerinin neler olduğunu dikkatle araĢtırmanız
gerekir. Bunuda tarafsız bir gözle yapmak gerekir örneğin çoğu kiĢi için Unix çok güvenli, Windows ise
berbattır yada bunun tersi düĢünülebilir. Oysa bu bir takım tutma olayı değild,r ve önyargılı olmak yanlıĢtır.
Asıl güvensiz olan sistem değil sistemin baĢında oturan sistem yöneticisidir.
Yönetici ne kadar dikkat ederse sistemde o kadar güvende demektir. Burada önemli olan, Internet‘e
açılmanın, iyi niyetli-kötü niyetli herkese açılmak olduğunu unutmamaktır. Özellikle form denilen,
HTML‘in ziyaretçi bilgisayarın evsahibi bilgisayara talepten baĢka Ģeyler göndermesine imkan veren
etiketlerini ve ona bağlı CGI (Common Gateway Interface-Ortak Geçit Arabirimi) adı verilen ziyaretçinin
ev sahibi bilgisayardaki programları harekete
geçirebildiği buluĢma noktasında yer alacak programları tasarlarken, daima kötüniyetli kiĢileri
dikkate alarak hareket etmek gerekir. Internet‘te güvenliğin ne kadar kolay sarsılabildiğine ve ne kadar
kolay önlem alınabileceğini bir örnek verelim.
Sayfanızda, ziyaretçinin doldurması gereken ―Elektronik Posta Adresiniz:‖ diye bir metin kutusu bulunduğunu
düĢünün. Bu kutuya bütün ziyaretçilerin elektronik posta adreslerini yazacaklarını düĢünüyor ve bu bilgiyi
iĢleyecek CGI programında, ziyaretçinin bu kutuya yazacağı bilgiyi, alıp doğruca Web Server‘ın ―Mail‖
programına veriyorsunuz.
Peki, ya kullanıcı adres yerine;
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
34
“[email protected]; mail [email protected]</etc/passwd”
yazarsa? Bu yaptığınız basit ama ölümcül hata sonucu, forma girilen bu adrese, bilgisayar sisteminizdeki bütün
password-parola dosyaları email ile gönderilecektir.
Oysa, programı yazan kiĢi, elektronik posta adresini Mail
programına gönderirken ―unless ($mail_to = ~/^[\w-.]+\@[\w-.]+$)‖ Ģeklinde bir satırla, girilen bilgideki
karakterleri kontrol etse sorun halledilebilecektir.
2. Özel Bilgilerin Korunması ve Doğrulatma: Web hizmeti sunan kiĢi, sadece baĢkalarının kendi
bilgisayar sisteminde arzu edilmeyen Ģeyler yapmalarını önlemekten değil, aynı zamanda
kendisine emanet edilen baĢkalarına ait bilgileri de saklamak ve baĢkalarından korumak zorundadır. Bu
bilgiler, ziyaretçinin adı, elektronik adresi, hatta kredi
kartı numarası olabilir. Bunlar, sizin Internet‘te çizdiğiniz portreye güvenilerek size verilmiĢ mahrem
bilgilerdir.
Ziyaretçi bu bilgileri size, kötüye kullanılmayacağı
güvencesiyle vermektedir. Aynı bağlamda, Web hizmeti sunan kiĢi olarak, sizin de bu bilgilerin
kolayca ve baĢkalarına açık hale getirilmeden doğrulatılmasına ihtiyacınız olacaktır. Web Server
programınız, örneğin kredi kartı numarasını, yeni programlar edinmeye ihtiyaç kalmadan
doğrulatabilmelidir.
3. Web Server, siteye yapılan ziyareterin kaydını uygun
Ģekle kayıt altına almalıdır? Örneğin sayfanıza kaç kiĢi uğramıĢ, sitenizin en çok hangi sayfası
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
35
görüntülenmiĢ, en çok hangi dosya indirilmiĢ, han
gisteden sizin sitenize en çok ziyaretçi gelmiĢ bunların bilinmesi önemlidir.
Özellikle elektronik ticarete dayalı veya mesajını daha çok sayıda kiĢiye iletmek amacıyla hazırlanan Web
alanlarını iĢletenlerin, sayfalarının varlığını duyurmak için, mümkün olan her yoldan yararlanmaları gerekir.
Çok önemsiz gibi görünebilir ama Google içerik ile reklamı birleĢtirmeyi akıl eden reklam yapısı Ģu anda
alanında dünyanın en büyüğü olmayı baĢarmıĢ bir Ģirket. Örneği sitenize gelen ziyaretçi eğer mobilya
hakkında bilgi arıyor ise belkide mobilya almaya niyeti vardır bu durumda ona mobilya reklamı
gösterilmelidir… ĠĢte bu formül Google Ģirketini bir numara yapmıĢtır.
4. Web Server programıyla ilgili teknik destek ve sorun
çözme hizmeti alıp almamak, programın seçiminde belki de en önemli unsur sayılabilir.
Web’de Gezme ĠĢlemine Genel Bir BakıĢ
Internet ve intranet ortak dili, HTML dilidir. Bir Web sayfasında yer alan belgenin içindeki bazı kelimeler,
simgeler, fotoğraflar, grafik unsurlar veya bunların parçaları bir baĢka sayfa ile hiper-link kurularak,
bağlanmıĢtır.
Kullanıcı, hiç bir komut öğrenmek zorunda kalmadan, hiç
bir bağlantının Internet‘teki adresini bilmek zorunluluğu olmadan bu sayfalardaki bağlantıları tıklayarak, yazıdan
yazıya, Ģekilden Ģekilde, gidebilir. Aslında kullanıcı ya da
ziyaretçinin bir HTML sayfasıyla iliĢkisi burada da
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
36
bitmemektedir. Çoğumuz ulaĢtığımız bir alanın adresini
Web tarayıcı programında sık sık ziyaret etmek istediği yerlerin arasına koyabilir (bookmark) ve arzu ettiği
zaman doğruca iĢaretlenmiĢ olan bu adreslere gidebilir.
HTML’in baĢlıca özelliklerini Ģöyle sıralayabiliriz:
1. Belge biçimlendirme: HTML, Web tasarımcısına, belgelerini ziyaretçinin ekranında nasıl oluĢmasını
istiyorsa öyle Ģekillendirme imkanı verir.
2. Bununla birlikte tarayıcı programlarının HTML
komutlarını yorumlayıĢlarında az da olsa fark vardır ve bu fark sayfalarınızın bir ziyaretçinin
bilgisayarında baĢta, diğerinin bilgisayarında baĢka
gösterilmesine yol açabilir. Ayrıca ziyaretçileriniz, tarayıcı programlara verdikleri komutlarla, aldıkları
sayfalarda genel değiĢiklik veya kısıtlamalar yapabilirler. Siz sayfanızda ne tür harf türü (font)
kullanmıĢ olursanız olun, ziyaretçiniz tarayıcı programa ―Sadece Times fontları kullan‖ demiĢ ise,
sayfanız bu ziyaretçinin ekranında sizin istediğinizden farklı biçimde görülecektir. Ziyaretçi
tarayıcı programına ―Grafik unsurları gösterme!‖ demiĢ ise, sayfalarınız ve tabiî vermek istediğiniz
görsel mesaj tamamen farklı bir nitelik kazanacaktır. Bu duruma rağmen, bugünkü
Ģekliyle HTML, Web tasarımcısına adeta bir gazete ya da dergi sayfası tasarlarcasına, oluĢturmak
istediği görsel etkiyi sağlamasına yeterli tasarım
araçları sunmaktadır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
37
3. Ġlk çıktığında web sadece durağan sayfaların
aktarıldığı bir yer iken bugün canlı yayın radyo ve tlevizyonlara varıncaya kadar hayatımıza grmiĢtir.
Bununla birlikte HTML, bir kelime iĢlem ya da masaüstü yayıncılık programının oluĢturabileceği
görsel özelliklere sahip sayfalar oluĢturamaz. Bu kısıtlamalara, Internet‘i tasarlayan uzmanların,
platformlar (Windows 3.x, Windows 95/98, Windows NT, Unix, MacOS), donanımlar
(Macintosh, PC, Sun) ve tarayıcı programların hepsi tarafından doğru Ģekilde anlaĢılabilen bir
platform oluĢturma isteği sebep olmaktadır.
HTML, dililinin hassas ölçmelere ve biçimlendirmelere izin vermemesi HTML için eksiklik değil bilinçli bir tercihtir.
Çünkü bu durumda ancak belirli platformlarda çalıĢır duruma gelecekti. HTML dilinin platformdan bağımsız
olması adına bu yol seçilmiĢtir.
4. HTML ile oluĢturulacak statik alanların içine
dinamik sonuçlar doğuracak programlar konulabilir. Bu dillerle HTML sayfalarını
duraganlıktan çıkartmak ve ziyaretçi ile etkileĢen, ziyaretçinin arzu, beğeni ve özelliklerine göre
içeriğini değiĢtirebilen Web alanları tasarlamak mümkündür
5. Web‘de bulunan aĢağı yukarı bütün içerik yani metin, ses, video türü mer materyal sanat eseri
kabul edilmektedir. Kısaca telif hakkı ve bu hakka sahip birisi vardır. Dolayısı ile telif hakkı size ait
olmayan veya sahibi tarafından size izin verilmeden bir sanat eserini yayınlayamazsınız.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
38
Bir sanat eserini Web sayfanıza koymak ve
kamuoyunun ulaĢabileceği Internet gibi herkese açık bir ortama yerleĢtirmek, yasaların ―yayın‖
saydığı bir fiildir. Ġzinsiz sanat eseri yayınlamak ise, Türk Ceza Yasası‘na göre ağır hapis cezasıyla
cezalandırılan bir suçtur. Ceza yasaları olmasada bu ahlaki bir suçtur.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
39
Web Tarayıcıları
Bir Web tarayıcı kullanıcının yazdığı adresi yada tıkladığı
linki ilgili web serverdan talep eden varsa dönen bilgiyi içinde tanımlı motor ile yorumlayıp ekran görüntüsünü
oluĢturup ekranda gösteren yazılımdır.
Burada çok dikkat edilmesi gereken nokta Ģudur. Her tarayıcının yorumlayıcı motoru farklı kiĢiler tarafından
geliĢtirildiği için haliyle her komutu aynı Ģekilde
yorumlamaları beklenemez. ĠĢte bu yüzden bazı web sayfaları bir tarayıcıda diğerinde olduğundan farklı
görünebilirler. Web sitesini ziyaret edebilecek kiĢilere de illa Ģu tarayıcı kullanılmalıdır gibi bir sınır
konamayacağından sayfa bazı kiĢiler tarafından hatalı olarak görülecektir. ĠĢte bu yüzden web sitesi yaparken
mutlaka sayfanın diğer tarayıcılarda nasıl göründüğü
kontrol edilmelidir.
HTML‘i kullanarak, ticarî amaçlı Web tasarımı yapan kiĢi,
Internet ile bağlantılı bilgisayar kullanıcılarının (Internet kullanıcılarının) hepsinin ekranında aynı Ģekilde
gösterilecek sayfalar yapmaya mecburdur. Buna karĢılık bir firmanın intranet ortamı için Web tasarımı yapan kiĢi,
HTML‘in sadece kendi firmasının standart olarak
benimsediği tarayıcının anlayabileceği özelliklerinden yararlanması mümkündür.
Microsoft Internet Explorer
Windows ortamında tarayıcı piyasasına, diğer
tarayıcılardan sonra girmesine rağmen, Ģu anda pazarda %80 in üzerinde bir oranda kullanıma sahiptir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
40
Netscape Navigator
Netscape Communications Corporation‘ın (NCC) piyasaya sürdüğü NN, IE‘ın hızlı yükseliĢi sonucu gerilemiĢ ve
sonunda yerini Open Source kardeĢi Firefox‘a bırakmıĢtır.
Firefox
Netscape tarayıcısının kaynak kodu üzerine geliĢtirilmiĢtir. Hızla yaygınlaĢmıĢtır. Firefox Google
tarafından da maddi anlamda desteklenen bir projedir
Opera
Norveçli bir firmanın geliĢtirdiği Opera standartlara en uyan tarayıcı olması ile ünlüdür. Sekmeli arabirimde ilk
defa Operada gelmiĢ bir yeniliktir. Günümüzde eski
günlerini aramakta olsada hala bir ölçekte kullanımdadır.
Google Chrome
Google‘ın çıkardığı tarayıcı olup Google adı üzerinde yaygınlaĢarak epey bir kullanım oranına kavuĢmuĢtur.
Yandex Browser
Rusya menĢeili arama motoru Yandex‘in Google
Chrome‘un açık kaynaklı kısmı üzerine kurulu tarayıcısıdır.
Tarayıcılar Ġçin Yardımcı Programlar ve Ek Birimler
Tarayıcılar eskiden sadece iletilen metni göstermekteydi.
ġimdi hiçbir eklenti gerekmeden bir çok resim dosyayısını gösterebilmekte ve çözücü (CODEC- COder
DECoder) yardımı ile video dosyalarını
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
41
oynatabilmektedir. CODEC kullanılması tarayıcıların asıl
alanlarında kalmasına izin verir. Çünkü sürekli yeni görüntü ve ses formatları çıkmaktadır. Haliyle her
tarayıcının buna ayak uydurması mümkün değildir. Plug-In denilen ek birimler tarayıcıya tamamen farklı bir
programı açmak yerine, belirli bir tür dosya türünü ekranda canlandırabilme yeteneği kazandıran eklerdir.
Tarayıcı program bilgisayara kurulurken bu ek birimler olmaksızın (ya da çok yaygın olanları ile) yüklenir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
42
HTML Editörleri
Genel olarak HTML editörleri iki grupta incelenirler, Metin
editörleri ve WYSIWYG editörler. Normal metin editörlerine en bilinen örnek Windows ile birlikte gelen
notepad programıdır. WYSIWYG editörler ise HTML dosyasını tarayıcı içindeymiĢ gibi göstererek kullanıcının
yazdığı metinlerin geri planda HTML karĢılığını
kaydederler.
Günümüzde editörler öylesine geliĢmiĢtir ki, hata
kontrolü, Mouse ile çizerek sayfa çatısı kurma, hazır temalar, hazır sayaç çeĢitleri, FTP ile sayfayı siteye
upload etme seçeneklerinin hepsini birden içinde barındıran editörler ortaya çıkmıĢtır.
Expression Web
Windows iĢletim sisteminde çalıĢır. Tema, WYSIWYG ve FTP desteği verir.
Dreamweaver
Hem metin hemde WYSIWYG tasarıma izin verir. Ayrıca
PHP, ASP, CF gibi dilerlide kullanmayı sağlar. Sürükle bırak form dizayn etme, veri tabanına otomatik bağlantı
ve sorgu dizayn etme, hazır formlar, FTP ile upload ve en önemlisi Mouse ile çizerek sayfa çatısını CSS formatında
çizebilmesidir.
Word
Word aslında kelime iĢlemcidir ama sayfaları HTML
olarak kaydetmeyede izin verir. En büyük sorunu ise Word ile oluĢturulan bir HTML sayfası, aynı iĢi yapan ve
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
43
Notepad ile oluĢturulmuĢ bir sayfadan yakalĢık iki kat
daha büyük olmasıdır. Hele sayfada tablo da bulunuyorsa durum dahada vahimdir.
NVU
Bedava bir editördür. Composer kodu üzerine geliĢtirilmiĢtir. WYSIWYS tasarıma izin verir. Tablo
kullanma yeteneği kısıtlıdır. Frame vs konularda da kullanıcıyı sıkıntıya sokmaktadır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
44
HTML’in Temel BileĢenleri
Bir web sitesinin temeli içeriktir. Resimde olsa metinde
olsa görüntüde olsa sonuçta hepsi içeriktir. Bu içerikler ise Etiket denilen (TAG) iĢaretleyiciler yardımıyla
biçimlendirilir.
Etiketler (Tag)
HTML komutları içeren ve tarayıcıların tanıyabildiği dosya, aslında içinde ASCII karakterlerden baĢka bir Ģey
olmayan, düz yazı dosyalarıdır. Tarayıcıya, sayfayı ekranda oluĢtururken vermesini istenilen biçimle ilgili
komutlar bir dizi özel etiketler ile belirtilir. Bunları içerikten ayırmak içinse ―<>‖ çifti arasına almak gerekir.
Sayfa tasarımı yaparken örneğin <b> etiketi kullanılırsa tarayıcıya ―ben buraya bu etiketi koydum. Artık benden
ikinci bir komut gelene kadar her Ģeyi ekrana KOYU olarak bastır‖ denilmiĢ olur. Dolayısıyla HTML‘de ilke,
önünde etiketi olmayan herhangi metne yer vermemektir. Önünde etiketi olmayan herhangi bir metin
parçası, tarayıcı tarafından temel paragraf olarak
nitelenir.
HTML, içinde kontrol kodu olmayan metin dosyasıdır.
Yani Wordde bir dosya yazdığınızda içinde HTML etiketleri kullanmıĢ ble olsanız bu dosya metin dosyası
olmadığından HTML dosyası değildir. Böyle bir dosyanın adındaki uzantıyı silerek, yerine ―.html‖ uzantısını
verilirse ekrana gelecek olan dosyadaki metin değil, Çinçe yada Japonca dilini çağrıĢtıran karakterler yığını
olacaktır. HTML düz yazı olduğuna göre, bir HTML dosyası oluĢturmak için, herhangi bir kelime-iĢlem
yazılımı kullanılabilir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
45
HTML Yazım Kuralları
1. Etiketlerin büyük harfle veya küçük harfle
yazılması arasında fark yoktur. <br> ile <BR> aynı iĢi yapmaktadır.
2. Bir kaç istisna tiket hariç bütün etiketlerin birde sonlandırma çifti vardır. Sonlandırma için aynı
etiketin önüne ―/‖ (bölü) iĢareti konulur. Örneğin <strong>Türkiye</strong> gibi.
3. <!-- ile --> arasındaki metinler yorum olarak ele alınır ve gösterilmez.
İyi bir programcı açtığı etiketi kapatmayı unutmamalıdır. Bunun için en kolay yöntem
önce açma ve sonladırma etiketlerini yazma
sonra içerisini doldurmaktır.
HTML Dosyasının Bölümleri
HTML dosyası iki kısımdan oluĢur.
1. Head denilen baĢlık kısmı.
2. Body denilen metnin kendisi
Web tarayıcılar, HTML etiketini gördükten sonra hemen HEAD ve BODY etiketlerini arar ve ekrandaki sayfayı
buna göre biçimlendirirler.
Basit bir HTML örneği,
<HTML>
<HEAD>
BaĢlık Metni
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
46
</HEAD>
<BODY>
Body Metni
</BODY>
</HTML>
<html>
<head>
<title> İlk Sayfam </title>
</head>
<body>
Sayfama Hoş geldiniz
</body>
</html>
Türkçe bilgi içeren bir sayfa örneği ise;
<HTML>
<HEAD>
<meta http-equiv = "Content-Type" content =
"text/html; charset = windows-1254">
</HEAD>
<BODY>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
47
Merhaba. Web Tasarım Rehberi‘ne HoĢ Geldiniz!
</BODY>
</HTML>
<html>...</html>
Örneklerde görüldüğü gibi bu etiket bloku tarayıcıya
HTML dosyasının baĢladığını ve bittiğini belirtir. Tüm diğer kodlar bu iki etiket arasına yazılır.
<head>...</head>
Etiketleri arasında ise sayfa hakkında bilgiler verilir. title gibi etiketler, anahtar kelimeler, sayfanın dili vs
burada yer alır. Bu alandaki bilgiler ekranda görünmezler. Sadece title tarayıcı baĢlığı olarak kullanılır.
<title>...</title>
Title etiketi tarayıcı penceresinin üstüne yazılacak olan baĢlığı belirtir. Yazılan metin penceresinin üstünde
tarayıcı adı ile birlikte yazılır.
<body>...</body>
Bu etiketler ise sayfanın ekranda görüntülenecek olan
kısmını yazdığımız bloktur. Parametreleri ile birlite sayfanın zemin rengini, linklerin rengini, arkaplan
resmini ayarlamak mümkündür.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
48
Meta Etiketleri Arama Motorları Ġçin Sitemize Eklememiz Gereken Bilgiler
Normal olarak oluĢturulan her sayfanın HEAD kısmına
sayfanın açıklamasının yapıldığı, sayfa hakkında anahtar kelimelerin belirtildiği meta etiketler konabilir ve
konulmalıdırda.
Anahtar kelimeler arama motorlarının sayfayı tanımasını
ve tespit etmesini sağlar. Yeni nesil arama motorları (Örn : Google gibi) meta etiketlerinin yanısıra belgenin
Gövde kısmındaki içeriği de dikkate alır. Eskiden sırf ziyaretçi çekmek için popüler metinlere meta
etiketlerinde alakasız yer verilir bir nevi kullanıcı aldatılırdı. Google BODY kısmınıda dikkate alarak bu iĢe
bir önlem almıĢ olmaktadır.
NAME: Sayfanın yazarı, sayfanın yayın tarihi, vb., bilgiler içerir. <META NAME="bilginin türü"
CONTENT="bilgi"> Ģeklinde yazılır.
<META NAME="keywords" CONTENT = "kelime1
kelime2 kelime3">
"keywords" sayfa hakkında bazı anahtar kelimeler
içerir. Böylece arama motorları için index oluĢturmaya yardımcı olur. (Dikkat: bu kısma ilgisiz alakasız Ģeyler
yazarak arama motorları aldatıldığından artık sadece bu alan değil komple içerik indekslenmektedir. Kısaca
kendinizi kandırmayın)
<META NAME ="description" CONTENT
="metin">
"description" etiketi site hakkında tanımlanma bilgisini
içerir. Bu etiketi tanımayan arama motorları ise
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
49
sayfanın ilk bir kaç kelimesini tanımlama aracı olarak
kullanır. Örnek:
<META NAME="description" CONTENT ="KiĢisel PHP
sitem.">
<META NAME="author" CONTENT ="Adı
Soyadı">
Arama yapanlara siteler gösterilirken bazı arama
motorları site yazarını bu etiketi tarayarak bulur. Örnek:<META NAME="author" CONTENT="Türkiye"
HTTP-EQUIV: Ġçinde yer aldığı sayfanın, Web Server tarafından ziyaretçiye gönderilmesinde oluĢturulacak
Response Header (KarĢılık BaĢlığı) bölümünde yer alacak bilgiler içerir. <META HTTP-EQUIV="bilginin
türü" CONTENT="bilgi"> Ģeklinde yazılır.
AĢağıda, meta etiketlerinin content bölümünde açıklama
yapılmıĢ ve parantez içinde bu sayfa için uygun örnekler
verilmiĢtir.
<meta name="author" content="Sayfayı düzenleyenin adı">
<meta name = "Description" content = "Sayfanın açıklaması">
<meta name="keywords" content="Arama motorlarına yardımcı olmak için sayfa hakkında anahtar kelimeler (bu
sayfa için HTML,ders,web sayfası,web sitesi, PHP vs) ">
<META name="copyright" content="Telif hakkı ve
tanımları" >
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
50
Eğer sayfa içeriği Ġngilizceden farklı ise hazırlanan
sayfada herhangi bir karakter görüntüleme sorunu sorunu yaĢamamak için <head> bölümünde sayfasının
kod sayfasını belirten meta etiketleride eklenmelidir.
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-9">
<meta http-equiv="Content-Type" content="text/html;
charset=win-1254">
Bugünlerde arama motorları için yapılabilecek iĢlemler SEO Uzmanlığı adıyla ayrı bir meslek haline
dönüĢmüĢtür. Bu konuda bazı materyalleri ilerleyen
konularda bulacaksınız.
Meta Tağlarının GeliĢmiĢ Kullanımı
Sayfanın Süre AĢımını Belirtmek
Bu iĢlem için ―expires‖ etiketi kullanılır.
<META HTTP-EQUIV="expires" CONTENT="Wed, 04 Apr 2008 23:59:59 GMT">
Yukardaki örnekte sayfanın 4 Nisan 2008 günü Greenwich saatiyle gece yarısından itibaren arama
motorlarından ve ziyaretçilerin bilgisayarlarında geçici Internet dosyaları klasöründen silinmesini sağlar.
Bir Sayfanın Belirli Bir süre Ekranda Kalıp Otomatikman BaĢka Bir Adrese Yönlenmesini Sağlamak
Bu iĢlem için ―refresh‖ etiketi kullanılır. Böylece tanımlı süre sonunda hedef URL otomatik açılır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
51
<meta http-equiv = "refresh" content ="5;
url=http://abc.com/dnm.html">
Bu sayfanın 5 saniye ekranda kalacağını ve daha sonra URL
ile belirtilen adresteki sayfanın yüklenmesini sağlar.
Türkçe Karakterleri Görüntülemek-Kod Sayfası
Yukarda örneğini gördüğümüz meta etiketi sayesinde
sayfa için bir kod sayfası belirtebiliriz. Böylece hazırlanan sayfanın ekranda hangi karakter seti ile
görüntüleneceğinin bilgisini tarayıcıya vermiĢ oluruz. Türkçe için 3 adet karakter seti kullanma imkanımız
vardır.
Windows-1254
Iso-8859-9
UTF
Türkçe bilgilerin görüntülenebilmesi için
<meta http-equiv="Content-Type" content = "text/html; charset=windows-1254">
<meta http-equiv="Content-Type" content = "text/html;
charset=iso-8859-9">
Seçenekleri kullanılabilinirse de en doğrusu UTF-8 kod sayfasının kullanımıdır. UTF evrensel karakter seti olmak
iddiasındadır. Bu konuda da hayli yol katetmiĢtir. Bu
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
52
nedenle artık UTF kodlamasının kullnaılması kesinlikle
önerilir.
<meta http-equiv="Content-Type" content = "text/html; charset=utf-8">
<BODY> Etiketinin Parametreleri
Body etiketi çeĢitli parametreler ilede kullanılabilir. Bunlar
Bgcolor : Sayfanın zemin rengini belirtir
Background : Sayfanın zemini için bir resim kullanılmasını sağlar.
Text : Sayfadaki yazıların rengini belirtir. Bu renk belirtilmiĢ ise sayfa içinde renk belirten etiket
görülmediği sürece tüm içerik bu renkte basılır.
Örneğin
<body bgcolor=‖aqua‖ text="red" background=―1.jpg">
Normalde resimler için en boy belirtilebilir ancak <body>
etiketinde bu durum söz konusu değildir. Seçilen resim tarayıcı tarafından tüm sayfayı kaplayacak Ģekilde
sayfaya yerleĢtirilir.
TrueType Fontlar-Harf GeniĢliği Serif ve Sans Serif Harfler
Daktilolarda, kağıdı hareket ettiren mekanizma, her
harfin geniĢliğine göre farklı hareket yeteneğine sahip
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
53
olmadığından ―i‖ veya ―k‖ veya hepsinden geniĢ olan ―m‖
harfi de aynı geniĢlikte bir alana yazılırdı. Zamanla teknoloji sayesinde bu sorun aĢıldı. Harfleri
büyüklüklerine göre göreli geniĢlikte olan fontlarla bütün harfleri aynı geniĢlikte olan fontların farkı buradan
kaynaklanır. Günümüzde, teknik gerekçelerle eski tip fontlar hala vardır.
Harflerin genel karakteristiğine göre ayrımda ise fontlar serif, sans serif ve dekoratif olarak üçe ayrılır. Serif
harfler kuyruklu yazılmıĢ, sans serif harfler ise düz olan biçimdir. Web de görsel etki, zıtlıklardan yararlanarak
sağlanır. Bir sayfada yer alacak bir metnin serif diğerinin sans serif harflerle yazılması iyi bir zıtlık oluĢturup
okunulabilirliği artıracaktır Ekranda okuma kolaylığı açısından sans serif harfler tercih edilmelidir. Özellikle
küçük puntolu serif harflerin okunması çok zor olabilir.
Sans serif harfler içeren en bilinen fontlar Arial Verdana ve Tahoma fontlarıdır. Serif için en bilinen örnek ise
times New Roman fontudur.
H1,H2,H3,H4,H5,H6 BaĢlık Etiketleri
HTML bize H1, birinci yani en büyük, H6 sonuncu, yani en küçük olmak üzere altı ayrı büyüklükte baĢlık
kullanma imkanı veriyor. Farklı baĢlık büyüklüklerini daha yakından tanımak için, Ģu sayfayı yazarak, örneğin
baslik.htm adıyla kaydedin:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1254">
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
54
<title>BaĢlıklar</title>
</head>
<body>
<p><font face="Arial">
<h1>H1: baĢlık 1<h1>
<h2>H2: baĢlık 2 <h2>
<h3>H3: baĢlık 3 <h3>
<h4>H4: baĢlık 4 <h4>
<h5>H5: baĢlık 5 <h5>
<h6>H6: baĢlık 6 <h6>
Normal Metin
</font> </p>
</body>
Paragraf etiketi gibi, baĢlık etiketinin de arkasına koyabileceğiniz tek özellik ALIGN‘dır ve bununla baĢlığın
sola, sağa, ortaya hizalanmasını veya sağ sol marjların
aynı anda hizalanmasını sağlayabilirsiniz.
<br> etiketi
Bu etiket metni iki satıra bölmek için kullanılır. Enter tuĢunun iĢlevini taĢır. HTML metni biçimlendirirken
MSWORD gibi davranır. Yani ―alt satıra geç‖ yada ―yeni paragrafa baĢla‖ iĢaretini görmedikçe metni sağa doğru
yazmaya ve pencere sonuna gelince alta doğru kaydrmaya devam eder. Metni bölmek için HTML
kodunda iken enter tuĢuna basmıĢ olmanız tarayıcı için
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
55
bir anlam ifade etmez. Tarayıcı <br> etiketini görünce
bir alt satıra geçer.
<HTML>
<BODY>
Bu satır çok çok çok ama çok uzun bir satır. Ancak HTML
için için bunun için bir önemi yok. Çünkü ne yazarsanız yazın özel etiketi görmedikçe aynı paragraftaymıĢ gibi
ekrana görüntülenmeye devam edilecektir.
Bu satır da bir önceki gibi <br><çok çok çok ama çok <br> uzun bir satır. <br>Ancak HTML için için bunun için
bir <br>önemi yok. <br>Çünkü ne yazarsanız yazın <br> özel etiketi görmedikçe aynı paragraftaymıĢ
<br>gibi ekrana görüntülenmeye devam edilecektir. <br> Bu satırın farkı ise BR etiketi ile bölünmüĢ olması.
</BODY>
</HTML>
<p>…</p> etiketi
ĠĢlev olarak <br>etiketine benzer ancak temelde
farklıdır. <p> etiketi </p> ile sonlandırılır. <br> sadece alt satıra geçerken bu etiket paragraf baĢı yapar.
<HTML>
<BODY>
<br>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
56
Bu satır çok çok çok ama çok uzun bir satır. Ancak HTML için için bunun için bir önemi yok. Çünkü ne yazarsanız
yazın özel etiketi görmedikçe aynı paragraftaymıĢ gibi ekrana görüntülenmeye devam edilecektir.
<p>
Bu satır çok çok çok ama çok uzun bir satır. Ancak HTML
için için bunun için bir önemi yok. Çünkü ne yazarsanız yazın özel etiketi görmedikçe aynı paragraftaymıĢ gibi
ekrana görüntülenmeye devam edilecektir. </p>
</BODY>
</HTML>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
57
Genel Biçimlendirme Etiketleri
Genel Biçimlendirme Etiketlerinin Listesi
Öncelikle Ģunu belirtmek gerekiyorki biçimlendirme etiketlerinin çoğu “obsolete” yani devre dıĢı
bırakılmıĢ durumdadır. Bu yüzden bu listede sadece birkaç temel etiketi bırakıp eski standarda uygun
olanları ise çıkarmak durumunda kaldım. Çünkü bu
etiketleri kullanmak için zaman harcamak yerine en uygunu yeni standart olan CSS kullanımını
öğrenmenizdir.
<strong> Kapatılana kadar her metin koyu
harflerle yazılacaktır
<em> Kapatılana kadar her metin italik olarak
yazılacaktır
N
<OL>..</OL>
Sıralı (Ordered) listeler, liste unsurlarının baĢına, tasarımcının
arzusuna göre, ya rakam, ya harf koyarak, sıralanmıĢ listelerdir.
<LI> Liste elemanlarını belirtir
<UL>..</
UL>
Sırasız (Ordered) listeler, liste
unsurlarının baĢına, tasarımcının
arzusuna göre, ya içi dolu ya da içi boĢ bir yuvarlak, veya dört köĢe nokta
konularak sunulan listelerdir. Listenin baĢladığını ve bittiğini belirten bu iki
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
58
etiketin arasına liste unsurları (list item)
<LI> etiketi ile yazılır.
<CODE>..
</CODE>
Ġçindeki metnin bilgisayar programı
veya benzeri bir Script parçası olduğunu gösterir:
<CODE>
// bu bir delphi satırıdır
Showmessage(Mesaj)
</CODE>
HTML‘in metin biçimlendirmekten çok metnin bölümlerini tanımlamakta kullanılan ve özellikle Internet‘in metin
ağırlıklı olduğu ilk dönemlerinden kalma, ACRONYM, BLOCKQUOTE, CITE, CODE, DEL, DFN, EM, INS, KBD,
PRE, Q, SAMP, STRONG, SUB, SUP, VAR, B, I, U, SUP, SUB etiketlerini de ismen hatırlatmak yeterlidir.
W3C konsorsiyumu artık metinlerin bu Ģekilde değil CSS ile biçimlendirilmesini standart kabul etmektedir.
Dolayısıyla bu tagların çoğu artık obsolete dediğimiz ve sadece geriye dönük uyumluluk açısından varlıklarını
sürdürmektedirler.
Metni Koyu, veya Ġtalik Yazdırma
Bu iĢler için yukardaki tablodada görüleceği gibi <strong> <> ve <em> etiketleri kullanılır.
<html>
<head>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
59
<title>Sayfa baĢlığı </title>
</head>
<body>
<h1> Sayfama hoĢ geldiniz </h1>
<p>HTML etiketleri ile, </p>
Tüm yazıları
<strong>koyu renkte</strong>
<em>italik yönde</em>
yazmak mümkün
</body>
</html>
Burada paragraf etiketini kullandığımıza dikkat edin. <p>..</p> etiketleri, paragraf etiketleridir. Tarayıcı bu
etiketi gördüğü anda, bir sonraki içerik parçasını alt satıra kaydırır.
Paragraf etiketinin nasıl bloklanacağı ALIGN parametresi
ile belirtilir. Örneğin paragraf etiketini <p align=center> Ģeklinde kullanırsanız, </p> etiketine kadar gireceğiniz
bütün metin, bulunduğu yerde ortalanacaktır.
HTML Dilinde Renk Kodlaması
Web tarayıcılar renk belirtmek için, ya Ġngilizce kelimeleri ya HEX karĢılıklarını yada RGB değerlerini kullanırlar.
Aslında bilgisayarda sadece üç renk vardır. Kırmızı yeĢil ve mavi. Diğer renkler bunların karıĢımından ibarettir.
RGB (Red Gren Blue) dediğimiz Ģey aslında o rengi elde
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
60
edilmek için hangi renkten ne kadar karıĢtırılacağını
veren sayılar grubudur.
HEX sisteminde sayılar 16 lık sistemde ele alınır. Sayı
sistemini 1‘den 10‘a kadar sayılar normal halleriyle diğerleri ise A,B,C,D,E,F harfleriyle ifade edilir. Yani ―11‖
yerine ―1A‖ ―12‖ yerine ―1B‖ yazmak gerekir.
Renkleri belirtirken, ―00‖ ise o renkten yüzde sıfır
oranında, ―FF‖ ise yüzde 100 oranında karıĢtırılması belirtilmiĢ olur. Bilgisayar ve televizyon ekranında beyaz
renk, her üç rengin de yüzde yüz oranında olması halinde, siyah ise her üç rengin de yüzde sıfır oranında
olmasıyla sağlandığına göre #000000 Siyah, #FFFFFF ise Beyaz rengi ifade eder.
Renk Adı HEX
kodu RGB kodu
Black #000000 rgb(0,0,0)
Red #FF0000 rgb(255,0,0)
Gren #00FF00 rgb(0,255,0)
Blue #0000FF rgb(0,0,255)
Yellow #FFFF00 rgb(255,255,0)
Aqua #00FFFF rgb(0,255,255)
Fuchsia #FF00FF rgb(255,0,255)
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
61
Gray #C0C0C0 rgb(192,192,192)
White #FFFFFF rgb(255,255,255)
Bunlar 16 renk temel renktir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
62
Güvenilir 216 Renk
Tüm tarayıcıların hepsinde birden 256 renk paleti kullanıldığında hep aynı renkte gösterilen renk koları
vardır. Bu renkler 216 adettir. Bunlar Güvenilir 216 Renk (216 Web Safe Colors) olarak bilinirler. AĢağıdaki tabloda
kodları verilen renkler her bilgisayarda ve tarayıcıda aynı renk sonucunu verir.
000000 000033 000066 000099 0000CC 0000FF
003300 003333 003366 003399 0033CC 0033FF
006600 006633 006666 006699 0066CC 0066FF
009900 009933 009966 009999 0099CC 0099FF
00CC00 00CC33 00CC66 00CC99 00CCCC 00CCFF
00FF00 00FF33 00FF66 00FF99 00FFCC 00FFFF
330000 330033 330066 330099 3300CC 3300FF
333300 333333 333366 333399 3333CC 3333FF
336600 336633 336666 336699 3366CC 3366FF
339900 339933 339966 339999 3399CC 3399FF
33CC00 33CC33 33CC66 33CC99 33CCCC 33CCFF
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
63
33FF00 33FF33 33FF66 33FF99 33FFCC 33FFFF
660000 660033 660066 660099 6600CC 6600FF
663300 663333 663366 663399 6633CC 6633FF
666600 666633 666666 666699 6666CC 6666FF
669900 669933 669966 669999 6699CC 6699FF
66CC00 66CC33 66CC66 66CC99 66CCCC 66CCFF
66FF00 66FF33 66FF66 66FF99 66FFCC 66FFFF
990000 990033 990066 990099 9900CC 9900FF
993300 993333 993366 993399 9933CC 9933FF
996600 996633 996666 996699 9966CC 9966FF
999900 999933 999966 999999 9999CC 9999FF
99CC00 99CC33 99CC66 99CC99 99CCCC 99CCFF
99FF00 99FF33 99FF66 99FF99 99FFCC 99FFFF
CC0000 CC0033 CC0066 CC0099 CC00CC CC00FF
CC3300 CC3333 CC3366 CC3399 CC33CC CC33FF
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
64
CC6600 CC6633 CC6666 CC6699 CC66CC CC66FF
CC9900 CC9933 CC9966 CC9999 CC99CC CC99FF
CCCC00 CCCC33 CCCC66 CCCC99 CCCCCC CCCCFF
CCFF00 CCFF33 CCFF66 CCFF99 CCFFCC CCFFFF
FF0000 FF0033 FF0066 FF0099 FF00CC FF00FF
FF3300 FF3333 FF3366 FF3399 FF33CC FF33FF
FF6600 FF6633 FF6666 FF6699 FF66CC FF66FF
FF9900 FF9933 FF9966 FF9999 FF99CC FF99FF
FFCC00 FFCC33 FFCC66 FFCC99 FFCCCC FFCCFF
FFFF00 FFFF33 FFFF66 FFFF99 FFFFCC FFFFFF
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
65
Sıralı Listeler
<OL>..</OL>: Sıralı (Ordered) listeler, baĢına, tasarımcının isteğine bağlı olarak, rakam, harf yada özel
bir karakter koyarak, yazılmıĢ listelerdir. Listenin baĢladığını ve bittiğini belirten bu iki etiketin arasına liste
satırları (list item) <LI> </LI> etiketleri arasında yazılır.
TYPE : Etiketi biçimlendirir.
o ―1‖ rakamla;
o ―A‖ büyük harfle;
o ―a‖ küçük harfle;
o ―i‖ küçük Romen rakamları ile;
o ―I‖ büyük Romen rakamları ile sıralanmayı sağlar
COMPACT: listenin mümkün olduğu kadar az satır
aralığı ile verilmesine yarar
START : listenin harf veya rakamdan baĢlayacağını
belirtir) Ģeklinde üç parametresi olabilir.
ġimdi örneğin, milli takım listesini hazırlayalım.
Yanlarındada sırt numaraları olsun.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
<title>Web Tasarım Rehberi - Renkler</title>
</head>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
66
<body>
<p><font face="Arial">
<H2>Takım Kadrosu</H2>
<ol type=1 compact>
<LI>RüĢtü</LI>
<LI>Serdar</LI>
<LI>Ümit</LI>
<LI>Önder</LI>
<LI>Emre</LI>
<LI>Yıldıray</LI>
<LI>Tümer</LI>
<LI>Tuncay</LI>
<LI>Hakan ġükür</LI>
<LI>Gökdeniz</LI>
<LI>Semih</LI>
</OL>
</font> </p>
</body>
</html>
TYPE parametresini ―1‖ değil, ―a‖ olarak değiĢtirirseniz
sayfadaki liste, bu defa rakamla değil, küçük harflerle sıralanmıĢ olacaktır:
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
67
! Bu tag Türkçe harflerle uyumsuzdur. A,b,c,ç Ģeklinde
devam etmez. A,b,c,d Ģeklinde listeler
Sırasız Listeler
<UL>..</UL>: Sırasız (UnOrdered) listeler. Bu tip liste satırlarının baĢına ya içi dolu ya da içi boĢ bir
yuvarlak, veya dört köĢe nokta konulur.
TYPE : Etiketi biçimlendirir
o DISC, içi dolu daire
o CIRCLE, içi boĢ daire;
o SQUARE dörtköĢe nokta ile sıralanmayı sağlar
COMPACT listenin mümkün olduğu kadar az satır aralığı ile verilmesine yarar.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
<title>Web Tasarım Rehberi - Renkler</title>
</head>
<body>
<p><font face="Arial">
<H2>Takım Kadrosu</H2>
<ul type=disc compact>
<LI>RüĢtü</LI>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
68
<LI>Serdar</LI>
<LI>Ümit</LI>
<LI>Önder</LI>
<LI>Emre</LI>
<LI>Yıldıray</LI>
<LI>Tümer</LI>
<LI>Tuncay</LI>
<LI>Hakan ġükür</LI>
<LI>Gökdeniz</LI>
<LI>Semih</LI>
</UL>
</font> </p>
</body>
</html>
<HR> Etiketi ile Çizgi OluĢturma
Yatay Çizgi (horizontal rule) etiketi, bulunduğu yerde,
belirtilen parametrelere göre yatay bir çizgi çizilmesini sağlar. Bu etiketin kapanıĢıĢ çifti yoktur. Pencere
boyunca çizgiyi çizer ve iĢlevi biter. Parametreleri Ģunlardır;
Width : Çizginin geniĢliğini ayarlamak için kullanılır.
Size : Çizginin kalınlığını ayarlamak için kullanılır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
69
Color : Çizginin rengini ayarlamak için
kullanılır.
Align :Bu parametre right,left ve center değerlerini
alabilir. Çizginin sayfadaki yatay konumunun sola, sağa veya ortaya
hizalanmasını sağlar.
Örnek:
<HR><p> Türk Milli Takımı Kadrosu </p>
<HR width=400><p> Türk Milli Takımı Kadrosu </p>
<HR size =12 color=‖#cccccc‖><p> Türk Milli Takımı
Kadrosu </p>
Resim ve Multimedya Dosyalarını Kullanmak
Belgeye resim, video, ses dosyaları eklemek normal
içerik eklemekle aynı değildir. Örneğin bir tablo içine istediğinizi yazıp; belgeyi açtığınızda bu yazıyı
görebilirsiniz. O metin belge içeriğinin bir parçası durumundadır. Ama iĢ resim, ses ve video dosyalarına
gelince bu aĢamada iĢ değiĢir ve HTML sayfasında dosyanın bulunduğu yeri belirtmeniz gerekir.
Bu iĢlem için URL adreslerinden faydalanılır. Belge metinleri begenin içindeki yer alırken resim vs dosyaların
kendileri değilde sadece URL adresleri HTML sayfasında yer alır. Web server böyle bir bağlantı gördüğü anda ilgili
dosyayı kontrol eder ve bulursa talepte bulanan tarayıcıya iletir. Tarayıcılar, resim formatı olarak JPG,
GIF, PNG türlerini desteklerler.
<HTML>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
70
<HEAD>
<TITLE>ÖRNEK SAYFA</TITLE>
<META http-equiv="Content-Type" content="text/html;charset=windows-1254">
</HEAD>
<BODY text="#0000CC">
<DIV align="center"><IMG src="img/logo1.jpg" alt="Logo resmi"></DIV>
<H1 align="center">Fenerbahe Spor Kulübü<BR>
2006-2007 ġampiyonu</H1>
</BODY>
</HTML>
IMG etiketinin çeĢitli parametreleri vardır. Bunlar
ALT : Resim için alternatif metin belirtir. Eğer kullanıcı tarayıcısını resimleri göstermemeye
ayarlamıĢsa, tarayıcı resim gösterme kapasitesine
sahip değilse veya en önemlisi eğer resim verilen adreste yoksa bu metin ekranda görüntülenir.
WIDTH: Resmin ekranda görüntülenecek boyutunu belirtir. Belirtilmez ise orijinal boyutunda
gösterilir. Farklı boyut verilirse resim fiziksel olarak etkilenmez sadece ekranda gösterilirken
yeniden boyutlandırılır
HEIGHT: Resmin ekranda gösterilecek yüksekliğini
belirtir. Belirtilmez ise orijinal boyutunda gösterilir. Farklı boyut verilirse resim fiziksel olarak
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
71
etkilenmez sadece ekranda gösterilirken yeniden
boyutlandırılır
BORDER: Resim için bir çerçeve çizilmesini sağlar.
ALIGN = Resmin hizalamasını belirtir. LEFT ile sola, RIGHt ile sağa, CENTER ile ortaya hizalanır.
<IMG src="img/logo1.jpg" alt="Logo resmi">
img klasörü içindeki logo1.jpg dosyasını sola hizalı olarak
görüntüle. Alternatif metin olarak gerekirse ―logo resmi‖ metnini kullan.
<IMG src="img/logo2.jpg" width="200" height="180">
<IMG src="img/logo2.jpg" width="100" height="90">
<IMG src="img/logo2.jpg" width="50" height="45">
Resimler aynı zamanda link verme iĢlemi için
kullanılabilirler.Bu konu ilerleyen kısımlarda iĢlenmiĢtir.
Marquee ile Resim Ve Metin Kaydırma
Marque etiketi verilen parametrelere göre bir metnin
yada resmin bir yerden bir yere verilen yönde ve hızda
hareket ettirilmesi için kullanılır. Parametreleri;
Direction : Bu parametre right,up,down
değerlerinden birisini alır ve buna göre içerğin hangi yöne kayacağı belirlenir. Up yukarı, right
sağdan, down ise aĢağı doğru kaymayı gerçekleĢtirir.
Behavior : DavranıĢla ilgili bir parametredir. Alternate değeri verilirse yazılar kaybolmadan
pencere içinde gider gelir. YaĢı yetenler Kara ĢimĢek filmindeki arabanın önünde sağa sola giden
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
72
ıĢığı hatırlayacaktır. Bu iĢlem aynı etkiyi
vermektedir.
Bgcolor : Kayan yazıların arka plan rengini
belirler.
Height : Yazının kayacağı alanın yüksekliği
Width : Yazının kayacağı alanın geniĢliği
Loop : Yazının kaç kez kayacağı belirlenir.
Daha sonra da yazı durur.
Scrolldelay : Kaydırma hızı, iki hareket
arasındaki süreyi ms cinsinden belirtir
Srollamount: Kayan yazının bir defada kaç piksel
hareket edeceğini belirtir.
Marquee aslında Internet explorer‘a özgü bir etiket olup diğer tarayıcılar tarafından kerhen desteklenmektedir.
KiĢisel tecrübelerime göre marquee etiketi çok dikkatli kullanılmalıdır. Mutlaka diğer tarayıcılar ilede
denenmelidir. Özelikle alternate parametresi farklı
tarayıcılarda farklı davranmaktadır. Bu bakımdan dikkatli olup tarayıcı uyumunu maksimumda
tutulmasında fayda vardır.
Marquee en çok haber baĢlıklarının dar bir alanda geçiĢ
yapması için alandan tasarruf ve vurucu etki açısından kullanılır. Sayfaya bir nebze olsun hareket katar. Ancak
ne olursa olsun sayfada 4-5 tane her biri ayrı yöne kayan
marquee etiketi çok berbat bir dizayna sebep olur.
<MARQUEE BEHAVIOR=tip BGCOLOR=renk
DIRECTION=yön HEIGHT=n HSPACE=n LOOP=n
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
73
SCROLLAMOUNT=n SCROLLDELAY=n VSPACE=n
WIDTH=n>
Resimleri Kullanırken Dikkat Edilecekler;
1. ĠĢin durumuna göre PNG, GIF KPG kullanımına karar verilmelidir. GIF dosyaları sadece 256 renge
kadar desteklerler. Ama daha keskin görünürler. JPG resimler isedaha az yer kaplarlar ancak kayıplı
bir format olduğundan resimde hassasiyet kaybı olacaktır. PNG ise GIF formatının lisans sorunlarına
çare olarak geliĢtirilmiĢ gir formattır. Ancak IE6 sürümü transparan PNG resimlerle sorunludur.
2. Büyük resimleri kullanmaktan gerekli olmadıkça kaçınmalıdır. Hiç kimse dakikalarca bir resmin
yüklenmesini beklemez. Resim kendisi için çok
önemli ise ayrı tabii. ĠĢte bu yüzden her zaman resimlerin boyutunun küçük, miktarının az
utulması tavsiye edilir.
3. Eğer büyük resimler kullanmak zorunlu ise,
bunların JPEG formatına çevrilip ve kalitesinin düĢürülmesi tavsiye edilir. JPEG resimler daha hızlı
yüklenirler.
4. Siteye her girenin en son tarayıcı ve Windows
kullandığı düĢünülmeden, herkes için kod yazılmalıdır.Resimlere her zaman ALT tagı
kullanılarak alternatif metinler verilmelidir. Böylece resim özelliğini kapatanlar yada metin bazlı tarayıcı
kullananlarda o ekranda resim olduğunu görebilsinler.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
74
5. GIF ve PNG dosyaları kullanıken "Interlaced" haline
getirilmeleri daha uygun olacaktır. Interlace tipli resimler kademe kademe yüklenir ve yavaĢ yavaĢ
netleĢerek resmi daha hızlı yükleniyormuĢ gibi gösterir. Aksi tadirde resmin tamamı yüklenmeden
görüntülenmeyecektir.
Video ve Ses Dosyalarının Kullanımı
Eğer sayfa yüklendiğinde bir ses dosyasının çalınması
istenirse <BGSOUND> etiketi kullanılabilir.
<BGSOUND SRC='ses.wav.mid' LOOP=5>
Bu Ģekilde yüklene ses sürekli aynı olacak ve durdurulması istendiğinde bir iĢlem yapılamayacaktır.
ĠĢte bu yüzden bu yöntem çok önerilmez. Ama dinamik
bir dil yardımı ile ses dosyası rastgee değiĢecek Ģekilde bir iĢlem yapılırsa daha iyi bir etki bırakabilir.
Video dosyası göstermek içinse <Object> etiketinin kullanımı gerekir.
Dikkat edilecek nokta desteklenen uzantılardır. Ayrıca kullanıcı tarafında gerekli codeclerin yüklü
olup olmadığınıda hesap etmek ve çok nadir bulunan formatlardan kaçınmak gerekir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
75
Tablolar
HTML sayfalarında veriyi çizelge halinde sunmak için
tablolar düĢünülmüĢtü. Ancak tasarımcılar birden bire bunu sayfanın iskeletini kumak içinde kullanmaya
baĢladılar. Böylece tablolar sayfalar için içerikten sonra temel öge haline geldiler. Ancak günümüzde sürekli
yaygınlaĢan CSS kullanımı, table ve frame (çerçeve)
gerektiren durumları çok daha pratik çözmeye imkan verdiğinden eski önemleri azalmaktadır. Buna rağmen
Table veri çizelgeleri için sürekli kullanım alanı bulacaktır. Div etiketleri ile table etiketi kullanmadan
tablo oluĢturabilemektedir ancak bu henüz yaygınlaĢmamıĢtır.
Bir tabloyu bir Excel sayfasına benzetebilrsiniz. En genel hali ile ise mutfak dolabına benzetebilrsiniz. Çatal, kaĢık,
baharat, tabak, tava her Ģey kendine ait çekmecelerde durmaktadır.
BaĢlık, Satır ve Veri Etiketleri
HTML‘de bir tablonun baĢlangıcı ve bitiĢi <TABLE>..</TABLE> etiketiyle iĢaretlenir. Tablonun
sütun baĢlıkları <TH>..</TH>; gövdesi <TBODY>..</TBODY> etiketiyle belirtilir. Sütun
baĢlıkları veya gövde etiketinin hemen altında tarayıcıya bir tablo satırı baĢladığını söylemeniz gerekir. Bunu
<TR>..</TR> etiketiyle yaparız. Bu iki etiketin arasında Tablonun değerleri, yani içinde bilgiler bulunan hücreleri
oluĢturan etiket, <TD>..</TD> yer alır. Bu iki etiketin arasında tablonuzun ilgili hücresinde yer alacak bilgi
bulunur.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
76
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<TITLE>Tablonun Esaslari</TITLE>
<BODY>
<p><font face="Arial">
<h1><center>HTML'de Tablo</center></h1>
<table align=center border=3 width=70%>
<thead align=center>Bu tablomuzun BaĢlığı (thead)</thead>
<thead><tr><th>Birinci sütun baĢlığı (th)</th><th>Ġkinci sütun baĢlığı(th)</th><th>Üçüncü
sütun baĢlığı(th)</th><th>Dördüncü sütun baĢlığı(th)</th><th>
<tbody>
<tr><td>Satır 1 Sütun 1</td><td>Satır 1 Sütun 2</td><td>Satır 1 Sütun 3</td><td>Satır 1 Sütun
4</td></tr>
<tr><td>Satır 2 Sütun 1</td><td>Satır 2 Sütun
2</td><td>Satır 2 Sütun 3</td><td>Satır 2 Sütun 4</td></tr>
<tr><td>Satır 3 Sütun 1</td><td>Satır 3 Sütun 2</td><td>Satır 3 Sütun 3</td><td>Satır 3 Sütun
4</td></tr>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
77
<tr><td>Satır 4 Sütun 1</td><td>Satır 4 Sütun 2</td><td>Satır 4 Sütun 3</td><td>Satır 4 Sütun
4</td></tr>
</tbody>
</table>
</body>
</html>
Kullanılan parametreler
<td> için :
Bgcolor :Hücrenin Zemin rengini ayarlar
Background:Hücre arkaplanına bir resim yerleĢtirmekte
kullanılır
Width :Hücre geniĢliği
Height :Hücre yükselekliği
Align :Metin yaslama yönü. Left, Right ve Center
olabilir.
Her zamanki gibi yine tekrarlayalım tabloları biçimlendirmek için artık en genel olan CSS
kullanılmalıdır. Buradaki biçimlendirme etiketlerini sadece bilgi olarak bilmeniz yeterlidir. Bu nedenle
aĢağıdaki etiketleri tasaramlarınızda kullanmanız önerilmez.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
78
Sütun ve Satır BirleĢtirme – Colspan- Rowspan
Bir tablonun baĢlığında ve gövdesinde yer alan hücreler
yatak ve dikey olarak komĢuları ile birleĢtirilebilirler. Bunun için COLSPAN ve ROWSPAN etiketlerini kullanırız.
Zemin - Bgcolor
Bir tablonun, her bir satırın, her bir sütunun ve her bir
hücrenin ortak veya ayrı zemini olabilir. Bu zemin düz renk olabileceği gibi bir resimde olabilir. Bu imkandan,
uzun ve çoğu zaman gözle takibi zor rakamlar içeren tablolar oluĢturduğunuz zaman, satırlara biri açık, diğeri
renkli zemin vererek, izleme kolaylığı sağlamak için
yararlanabilirsiniz.
Tablonun geniĢliği- Width
Bir tablo, tarayıcı penceresindeki alan kullanımı tamamen tasarlayan kiĢiye bağlıdır. Tablo sayfanın tümüne, belli
bir yüzdesine veya belli bir ölçüsüne yerleĢtirilebilir. Tabloyu oluĢtururken TABLE etiketine ölçü birimi ve
miktarını eklemeniz gerekir. Örneğin, <TABLE WIDTH=50%> ile tablonun ekranın yarısını kullanacağını
belirtmiĢ oluruz. Yüzde yerine pixel olarak mutlak ölçü de verilebilir.
Altın kuralı hatırlayalım. Herkesin ekran geniĢliği farklıdır. Örneği tablonuza 600 pixel geniĢlik verip sola hizaladınız. 800x600 pixel geniĢlikteki bir ekranda tablo
güzel durabilir. Peki 19 inç ekranında 2048 geniĢlikte
çalıĢan kiĢi ne görecektir ? Solda duran ekrana göre çok küçük bir tablo. Tablonun ortaya hizalı olması bu sorunu
bir nebze çözer ama ama width ölçüsünün yüzde olarak
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
79
verilmesi bu sorunun temel çözümüdür. Böylece ekran
büyüdükçe tablo büyür, küçüldükçede küçülür.
Tablonun Çerçevesi - Border
Bir tablonun bütün sütun ve satırları içine alan en dıĢ
çerçevesinin kalınlığını belirlemek için BORDER=xx (xx, pixel cinsinden çerçeve kalınlığı) kullanılır. ―FRAME=x‖ ile
tablonun dıĢ ve hücreler arası çerçeve çizgilerini kontrol edebilir ―x‖ yerine VOID yazarak tüm dıĢ çerçeveyi
kaldırabilirsiniz; ABOVE sadece tablonun üst tarafına; BELOW sadece alt tarafına; HSIDES sadece alt ve üst
taraflara; LHS sadece sol tarafa, RHS sadece sağ tarafa, VSIDES sadece sağ ve sol taraflara çerçeve konulmasını
sağlar.
<TABLE BORDER="1" WIDTH="100"
BGCOLOR="#C0C0C0">
<TR> <TD WIDTH="50"> </TD> <TD WIDTH= "50">
</TD>
</TR>
</TABLE>
Not: Yukarda bazı hücrelere neden
yazıldığın gelince bunun sebebi tarayıcıların boş olan hücreleri göstermemesi ve sayfa dizaynının
ekranda tuhaf durmasıdır.
Hücre içindeki boĢluk miktarı CELLPADDING
Cellpadding değeri bir hücredeki metnin hücrenin
kenarlık çizgisine olan uzaklığını gösterir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
80
Hücreler arası boĢluk miktarı CELLSPACING
Cellsacing değeri ise hücreler arasında bırakılacak boĢluk
miktarını gösterir.
<TABLE BORDER=X CELLPADDING=X CELLSPACING=X
WIDTH=[%veya X] HEIGHT=[% veya X] BGCOLOR=X BACKGROUND="X"
Sembol ĠĢaretlerinin HTML Dilindeki KarĢılıkları
HTML kodlanırken bazen sembollerin kodlanması gerekir. Örneğin ekrana ―a<c‖ yazdırmak istiyorsunuz. Tarayıcı
bu kısmı yorumlamakta sıkıntıya girecektir. Çünkü ―<‖ iĢareti tarayıcı komutlarınında baĢlangıcıdır. Böyle
durumlarda tarayıcının kafası karıĢmakta ve çoğunlukla bu bölüm hatalı etiket olarak ele alınıp yoksayılmaktadır.
Böyle durumlarda tarayıcıya sembol karakterleri ile bu
sembolün karĢılığını ekrana yaz dememiz gerekir.
Kod Tanım Sonuç
BoĢluk
< Küçük <
> Büyük >
" Çift tırnak "
& Ve &
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
81
© Copyright ©
® Kayıtlı ®
¶ Paragraf ¶
¢ Sent ¢
² Üst simge ²
¼ Bölü (örnek ¼) ¼
£ Pound £
° Derece °
¥ Yen ¥
Buradaki sembolü HTML için önemli bir semboldür. Tablo dizaynları açısından çok önemi vardır. Hücre içeriği boĢ ise tarayıcı bunu göstermekte sıkıntı
yaĢar. <td> tagları arasına yazdığınız teb bir boĢlukta dikkate alınmayacaktır. Oysa her hücreye bir
koyarsak HTML bunu hücre içine mecburen koyacak ve
tablomuz düzgün görüntülenecektir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
82
Genel Sayfa Kullanım ġekilleri
Sayfalar genelde belirli sayfa düzenlerinde tasarlanırlar.
Örneğin menü solda içerik sağda, üstte banner, yada sağda kayan haber gibi alanlar vardır. Genel olarak
sayfalar 2 li yada 3 lü sütun halinde tasalarnır. ÇeĢitli sayfa çatısı örnekleri aĢağıda verilmiĢtir.
Üst Banner alanı
Menü
alanı
Ġçerik alanı
Alt bilgi telif vs alanı
Menü alanı
Ġçerik alanı
Alt bilgi telif vs alanı
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
83
Üst Banner alanı
Ġçerik alanı
Menü
alanı
Alt bilgi telif vs alanı
Üst Banner alanı
Menü
alanı
Ġçerik alanı
Kayan
Haber
Sağ menü
alanı
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
84
Alt bilgi telif vs alanı
Üst Banner alanı
Menü alanı
Ġçerik alanı
Alt bilgi telif vs alanı
Üst Banner alanı
Menü alanı
Kayan
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
85
Ġçerik alanı
haber yada
Sağ Menü alanı
Alt bilgi telif vs alanı
ġüphesiz bunları karıĢtırarak daha farklı dizaynlarda yapılabilir ama bunlar ilk etapta size bir fikir verebilir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
86
Çerçeveler -Frames
HTML ilk çıktığında frame teknolojisi yoktu. Ġlk olarak
lanse edildiğinde bir yandan tarayıcı firmaları frame desteğiyle övündüler diğer yandan ise site tasarımcıları
bundan nefret ettiler. Hatta bu tepki yüzünden, Netscape ve Internet Explorer‘ yazılımcıları programlarında frame
seçeneklerini devre dıĢı bırakma kolaylığı bile getirdiler.
Frame düĢmanlığı, mantıksız ancak teknik açıdan çeĢitli açılardan haklıdır. Aslında site iskeleti için frame
kullanımı tablo kullanımından daha esnek ve güzel sonuçlar verir ancak framelerin bir çok dezavantajıda
vardır.
Tablodan farklı olarak frame teknolojisi, bize sayfamızın
bir tarafı sabit kalırken, diğer tarafının içeriğini, kullanıcının tercihine göre değiĢtirme imkanı verir.
Böylece bir tarafta menü dururken diğer tarafta içeriğin değiĢtirilmesi sağlanabilir. Bu sayade menü kodlaması
için tek bir dosya kullanılmıĢ olur.
Avantajları
Ġçeriği kontrol etmek kolaydır. Bir taraf menü diğeri içerik sunmak için kullanılabilir.
Frame hedef değiĢmediği sürece görüntüleniyor
olacaktır.
Dezavantajları
Eski tarayıcılar desteklemezler
Ekranda ilave yer tutarlar
Her bir frame için ayrı bir sayfa oluĢturulması gerekir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
87
Sayfanın kaydedilmesi ve yazdırılması sorun olur
Frame kullanılan sitelerde link vermek zor olur (En önemli sorunlar son üçüdür)
Arama motorları (Google, Yahoo vb) Frameleri sevmezler.
Bir frame de aslında tablo gibi satır sütun mantığı ile oluĢturulur. Ancak tablonun sütun ve satırları ancak
komĢu hücrelerle birleĢtiribilirken frameler tüm ekran üzerinde özgürce konumlandırılabilirler.
AĢağıdaki sayfa düzenini frameler ile kurduğumuzu varsayalım.
Üst Banner alanı (frame banner) (sabit)
Menü
alanı
Menu1
Menu2
Menu3
Frame Menu
(sabit)
Ġçerik alanı (Frame content )
Alt bilgi telif vs alanı frame footer (sabit)
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
88
Kullanıcı sol taraftaki menüden bir sayfayı seçtiği taktirde
_target=content (içerik frame‘nin adı) denildiğinde, üst , alt ve sol frameler yerlerinde sabit dururken orta sağdaki
içerik frame değiĢecektir. Dolayısı ile bu yapı sayesinde her sayfada menüyü ve ana isketlet tablosunu yeniden
kullanmak zorunda kalmamıĢ oluruz. Üstelik menüde değiĢiklik gerektiğinde sadece menü alanında bulunan
frame kodunun bulunduğu sayfayı değiĢtirdiğimiz anda bu kod tüm sayfalara yansımıĢ olacaktır.
ġimdi madem bu kadar üstün neden insanlar kullanmıyor ve kullanmak istemiyor denilebilir. Gerçektende ilk yaptığım site (1998) hariç hiçbir sitede frame kullanmıĢ
değilim. Üstelik ilerde göreceğimiz CSS ve PHP yardımı ile zaten bir menü kodunu her yerden çağırabilme
imkanımız baĢka Ģekillerdede mevcut. Dahası frame kullanılan bir sayfaya link vermek sanıldığı gibi kolay
değildir. Çünkü adres satırında bir Ģey yazarken sayfa
aslında baĢka bir içeriği gösteriyor olabilir. Üstelik arama motorlarıda frame sayfalardan pek hoĢlanmazlar. Ve
linkler direkt alındığında ise frameli bir sayfa frame
olmadan açılabilmektedir.
Frame Parametreleri
marginwidth="..." (sayı) :Soldan boĢluk
miktarını belirtir.
marginheight="..." (sayı) :Sağdan boĢluk
miktarını belirtir
scrolling=".." (yes, no, auto) :Kaydırma
çubuklarının gösterilip gösterilmyeceğini belirtir.
noresize :Pencere boyutlarının sabit
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
89
kalır ve Fare ile boyutlandırma yapılamaz
frameborder="..." (yes, no) :Çerçeveler arasındaki sınır çizgisinin olup olmayacağını
belirler.
border="..." (sayı) :Sınır çizgisinin kalınlığını
(veya çerçeveler arası mesafeyi) belirler
Frame Satırları ve Sütunları
Frame kullanan bir HTML sayfası oluĢturmak, aslında, çerçeve sayısı kadar HTML sayfası oluĢturmaktır
demiĢtik. Tablo ile frame arasındaki en önemli farkta budur.
Frame oluĢturma kodu olan <frameset cols="">...</frameset> Ģeklindedir. Burada frame sayı
belirtilmez, verilen ölçü sayısına göre tarayıcı bunu
kendisi hesaplar. ―cols=‖ ifadesinden sonra sayfamızda kaç çerçeve olması isteniyorsa o kadar ölçü yazılır.
<frameset cols="20%,60%,20%>
Bu komuttaki ―col‖ ifadesiyle dikey frame oluĢturuyoruz
bu çerçeve setinde solda ve sağda ekranın %20‘si eninde
birer alan bırakıp kalan /60 ı ise içerik için kullanacağız. Bu framelerin içine ne konulacağını ise, FRAMESET
etiketinin içine yazacağımız kaynak gösteren satırlarla bildirmemiz gerekir;
ġimdi bunları yazalım. </frame> kodunun önüne Ģunları yazın:
<frameset cols="20%,60%,20%>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
90
<frame name="col1" src="cer01.htm" marginheight="5" marginwidth="5" noresize scrolling="no">
<frame name="co2" src="cer02.htm" marginheight="5" marginwidth="5" noresize scrolling="no">
<frame name="co3" src="cer03.htm" marginheight="5" marginwidth="5" noresize scrolling="no">
<noframes>
<body>
</body>
</noframes>
</frameset>
</html>
Bu kodun içindeki <noframes>..</noframes> koduna
dikkat ettiyseniz içindeki <body> etiketleride ne diyebilirsiniz. BaĢtada dediğimiz gibi eski tip tarayıcı
kullananlar yada frame özelliğini kapatmıĢ kullanıcılar
sayfanın sadece <noframe> blokunu göreceklerdir. Setleri oluĢturacak sayfalara örnek ise
<html>
<head>
<title>Çerçeve 1</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</head>
<body bgcolor="#C0C0C0">
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
91
<p align="center">Çerçeve: 1</p>
</body>
</html>
Bu sayfayı, örnekten anlaĢılabileceği gibi ―cer01.htm‖ adıyla kaydedilmeli. Zemin rengi metinler değiĢtirmek
üzere, cer02 ve cer03 adıyla iki kopyası daha gerekli olacaktır. Ayrıca tüm dosyaların aynı klasörde durması
gerektiğinide unutmamak gerekir. Ana set dosyasındaki frameset içinde bulunan cols ifadesini rows yaptığımız
anda dikey olan frame kolonları bu sefer yatay olarak yerleĢecektir.
Yatay Dikey KarıĢık Frame OluĢturmak
Frameler teknik olarak birbirleriyle birleĢtirilemez ancak
aynı görüntüyü elde etmek mümkündür. Sadece
kodlama Ģekli biraz farklı olacaktır. Frame kullanımında ne kadar frame isteniyorsa belirtilir demiĢtik. Bu
belirtilen frameler için <FRAME SRC> ile kaynak belirtilmediği anda tarayıcı o alanda bir sütun oluĢturur.
Buraya diğer frameler yeleĢtirilebilir. EĢit olmayan sayıda sütun ve sıra içeren frame iĢlevi için bu olay kullanılır.
Birinci sütun tek sıralı, ikinci sütun iki sıralı bir çerçeve sayfası için kodumuz Ģöyle olmalıdır:
<FRAMESET COLS="25%,75%">
<FRAME SRC="cer01.htm" NORESIZE SCROLLING="auto">
<FRAMESET ROWS="20%,80%">
<FRAME SRC="cer02.htm" NORESIZE
SCROLLING="auto">
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
92
<FRAME SRC="cer03.htm" NORESIZE SCROLLING="auto">
</FRAMESET>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
93
HTML’de Bağlantı’ya (LINK) GiriĢ
Buraya kadar gördüklerimiz metini biçimlendiren ve
gösterimi ile ilgili etiketlerdi. Oysa web ile biraz ilgili birisi bile linkler olmadan web ortamından hiçbir Ģey
yapılamayacağını bilir. Çünkü linkler yardımı ile kullanıcılar bir web adresinden diğerine özgürce
gezebilirler. Ancak tabiî ki verilen bağlantının hedefindeki
resim, ses, vide yada web adresi doğru olmalıdır. Aksi taktirde ―kırık link‖ (dead link, broken link) dediğimiz
adeta çıkmaz sokak sayılacak bir kopukluk oluĢur. Örneğin link verirken ―c:\belgelerim\cv.doc‖ linkini
verdiniz ve amacınız kullanıcıların cv dosyanıza eriĢebilmesi. Peki sizin sabit diskinizde kendi halinde
duran bir dosyaya, sabit diskiniz Internet‘e açık değilse, kullanıcı nasıl eriĢecek.. Tabii bu traj komik örnekte asıl
sorun Ģu, hardiskinizi internete açtınız diyelim, bu sefer özel bilgilerinizi nasıl koruyacaksınız?
<A>..</A> etiketi HTML‘e hareket kazandıran ve link vermeyi sağlayan etikettir. HTML etiketleri arasında
Anchor (A) etiketinin yanı sıra, <BASE> ve <LINK> etiketleri de, bir noktadan bir diğerine gitmemizi sağlar.
<PRE></PRE>: Önceden düzenlenmiĢ (preformatted)
metin blokları için kullanılır. Normalde, HTML birden çok whitespace'i tek bir boĢluk karakteriyle değiĢtirdiği için,
görüntülenmesi baĢka türlü mümkün olmayan metin blokları bu tag yardımıyla görüntülenebili
<A>..</A> etiketine özellik kazandıran parametreler Ģunlardır:
ACCESSKEY=‖metin‖: Bu parametre ile, bağlantının fare ile tıklamak yerine, klavyede bir veya birden fazla tuĢa
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
94
basarak yapılmasını sağlayabilirsiniz. ―Metin‖ kelimesinin
yerine yazacağınız karakterler, klavye kestirmesi olur.
CHARSET=‖metin‖: Bağlantı sağlanan Web kaynağının,
tarayıcıda hangi dil kodlamasıyla gösterileceğini belirler. Verilmediği takdirde, kullanıcının tarayıcı programı ISO-
8859-1 olan ASCII kodunu seçer.
COORDS=‖X1, Y1, X2, Y2... Xn, Yn‖: Bu parametre,
bağlantının metinde değil, bir grafik üzerinde oluĢturulması halinde, resmin hangi koordinatları arası
tıklanırsa, bağlantının sağlanacağını gösterir. Bu etiket, SHAPE ile birlikte kullanılır. (Bu sayede bir resmin çeĢitli
kısımlarına basıldığından farklı adreslere gidilmesi mümkün olur. Buna image map denilir)
HREF=‖url‖: URL, (Uniform Recourse Locator) Internet‘te bulunan bir adres demektir.Bu adres, HTTP,
FTP veya elektronik posta yoluyla ulaĢılabilecek bir Web
alanı ve o alanın içindeki bir dosya olabilir. UlaĢılacak dosya, HTML dosyası olabileceği gibi bir Word , Excel
dosyasıda olabilir, grafik, ses, video ya da sıkıĢtırılmıĢ ZIP dosyası da olabilir. Tarayıcılar genellikle, bir bağlantı
ile kendisine gelen dosyayı ne yapacağını bilemezse (örneğin bir zip dosyası), kullanıcıya bu dosyayı yerel
sabit diske kaydetmeyi önerirler.
NAME=‖metin‖: Anchor‘a isim vererek, daha sonra bu
noktaya atıfta bulunma imkanı kazandırır. Bunu, bir sayfanın kendi içinde, link vermek için kullanabilirsiniz.
Çok uzun bir sayfanın baĢtarafına <a name="top"> Ģeklinde bir ―isimlendirilmiĢ Anchor‖ noktası koyarsanız
ve aĢağıda baĢtarafa dönüĢü kolaylaĢtırmak için Ģöyle bir
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
95
bağlantı yapabilirsiniz: <A HREF="ust‖>Sayfa baĢına git
</A>
REL=‖metin‖: Kurulacak iliĢkinin niteliğini belirtir.
Tarayıcılar, çoğu zaman bu ifadeye bakarak, bağlantı kurulunca ne yapabileceklerini bilirler. Örneğin ―metin‖
yerine ―stylesheet‖ yazarak, tarayıcıya alacağı dosyanın, daha sonra metinleri biçimlendirmekte kullanılacağını
söyleyebiliriz.
SHAPE=(RECT/CIRCLE/POLY/DEFAULT): Bu etiketin
karĢısına yazacağınız ifade ile, tarayıcıya bir resim dosyasının üzerine konmuĢ bağlantı noktasının biçimini
tanımlarsınız.
Rect Ģeklin dörtgen,
circle daire,
poly çok kenarlı
default ise arayıcının varsayılan bağlantı Ģekli
olduğunu ifade eder.
Bu parametreyi COORDS parametresi ile birlikte
kullanmak gerekir. Bu durumda COORDS etiketinin önüne yazacağınız ―X1, Y1, X2, Y2, Xn, Yn‖ Ģeklindeki
koordinatların da anlamı farklı olur. SHAPE etiketini ―rect‖ olarak bildirirseniz, X1 ve Y1 Ģekin sol üst
köĢesinin, tarayıcı penceresinin sol üst köĢesinden itibaren kaç pixel sağa ve aĢağı konulacağını; X2 ve Y2
ise Ģeklin sağ alt köĢesinin koordinatlarını gösterir (Örnek: SHAPE=rect, COORDS=‖0,0,9,9‖). SHAPE‘i
―circle‖ olarak tanımlarsanız, koordinatlar dairenin merkezini ve çapını gösterir (Örnek: SHAPE=circle
COORDS=‖10,10,5). Çok kenarlı bir Ģekil tanımlamanız
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
96
halinde, her bir koordinat diğerine, son koordinat da
birinciye bağlanır (Örnek SHAPE=poly COORDS=‖10,50,25,20,20,50‖).
TARGET=‖pencere‖: Bu etiketle linkin sayfa içindeki hangi frame (yada boĢ bir yeni sayfaya) yükleneceği
belirtilir. FRAMESET etiketi bulunan bir sayfada kullanılması halinde, alınacak sayfanın hangi frame içine
konulacağını gösterir. Burada ―pencere‖ kelimesinin yerine Ģu değerler yazılabilir:
―çerçeve adı‖: OluĢturulan çerçevelere önceden isim verilmiĢ ise, o isimler buraya yazılarak, sayfa frame içine
yüklenir. Çerçeve isimleri mutlaka rakam veya harfle baĢlamalıdır.
_blank: Linkin hedefi yeni bir tarayıcı penceresinde açılır. Frameler içinde baĢka bir
siteye link vermek için bu önemlidir.
_parent: Alınacak unsur, o anda açık sayfayı oluĢturmuĢ bir ana sayfa varsa, onun yerine
konulur.
_self: Alınacak sayfa mevcut sayfanın bulunduğu
tarayıcı perceresine konulur.
_top: Alınacak sayfa mevcut pencereye en üstten
itibaren konulur.
Frame kullanan bir sayfada baĢka bir siteye link verildiğinde _blank kullanılmadığında sayfada bulunan
mevcut sabit frameler duracağından diğer site sizin sayfanızın içine gömülecektir. Hele birde link verilen
sitede frame ise iĢte o zaman az yağlı az piĢmiĢ
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
97
bulgur çorbası tarzı birbirine geçmiĢ bir ekran
görüntümüz olacaktır.
HTML’de Bağlantı Türleri
HTTP bağlantıları:
Link, tarayıcının HTTP protokolünü kullanarak
ulaĢabileceği bir alanda ise, bunun gönderme ifadesi, <A
HREF="http://site adresi/sayfa adi.htm">Link metni </A> Ģeklinde yazılır. BaĢka bir Web alanında belirli
dosyaya değil de, alanın birinci sayfasına (home page, index page, vs.) bağlantı veriyorsak, bağlantıyı <A
HREF="http://www.hedefsite.com.tr/"> olarak yazmak gerekir. Web server anasayfa hangi dosya ise onu
gönderecektir.
FTP bağlantıları:
Kimi zaman, HTTP protolünü değil de FTP (File Transfer Protocol) yöntemini kullanarak, bir dosyayı kendi
bilgisayarına indirmesini sağlamamız gerekebilir. Bunun için link ifademiz, örneğin Ģöyle olur: <A
HREF="ftp://download.com/pub/">Bedava programlar</A>
Haber Grupları:
Internet‘in bilgi paylaĢımı amacına yönelik bu kullanımında, tartıĢma gruplarına yer verilen Usenet
servisi için prtokol belirtilmez. Usenet‘ için örnek olarak:
<A HREF="news:comp.ibm.www.developers.html">
GeliĢtiriciler grubu </A>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
98
Elektronik Posta Bağlantısı:
Bazen kullanıcın bir linke tıkladığından hemen o linkteki bir adrese e-mail atmak üzere kullanıcının varsayılan e-
mail programının açılması istenebilir. Örnek olarak
<A HREF="mailto:[email protected]‖>e-mail
gönder </A>
Dosya Bağlantıları:
Sabit bir dosyaya link vermek için kullanılır. En çok intranet ortamlarında kullanılır. Örnek olarak,
<A HREF="file://server/yazılımlar/kulanım.html">Kullanım
rehberi </A> gibi
Diğer bağlantılar:
Internet‘in ilk günlerinde daha sık kullanılmıĢ olsalarda
Gopher, ve çok geniĢ bir alana yayılmıĢ ağlarda veri tabanı araĢtırması yapmaya imkan veren WAIS, çok
yaygın olmamakla birlikte, HREF ifadesi olarak kullanılabilir.
Linkler hakkında detaylı bilgi için http://www.w3.org/addressing/schemes.html adresine
bakabilirsiniz.
Neden “\” değilde “/” kullanılıyor?
HREF ile kullanılan düz bölü ―/‖ iĢareti dikkatinizi çekmiĢ
olmalı. ĠĢin aslı Ģu Unix türevi sistemlerde klasör hiyerarĢisi ―/‖ ile ifade edilirken Windows içinde bu iĢem
―\‖ ile ifade edilemektedir. Aslında ―\‖ iĢareti ile ―‖/‖ arasında hiçbir fark yok ve iĢlevleri de aynı. Yani
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
99
Windows altında link verirken ―\‖ ilede link verirseniz link
çalıĢır ancak unutmayın ki sayfa bir de hosting bilgisayarına yüklenecektir. Peki web server iĢletim
sistemi Windows değilse ne olacak. Tabiî ki link kırılılacak. Windows altında ―\‖ yazılsada web server
programı bunu normal karĢılığna çevirerek iĢlem yapar. Ancak Linux server içinse bu sorundur.
―\dosyalar\sayfa.html‖ yazdığınızda Linux sizin dosyalr klasörü içinde bulunan sayfam dosyasını kastettiğinizi
bilemez.
Resimleri Link BaĢlığı Vermek Ġçin Kullanmak
Link verirken yazdığımız bir kodu ele alalım.
<A HREF="http://site adresi/sayfa adi.htm">Link metni </A>
Burada ―Link metni‖ yazısı link olduğunu belirtmek üzere altı çizili yazılacaktır ve buraya tıklandığı andada hedef
linke gidilecektir. Burada link metni yerine bir resim
dosyası kullanılırsa, resim linkin simgesi olacak ve resme tıklandığında link açılacaktır. Örneğin
<A HREF="http://site adresi/sayfa adi.htm"><img src=‖dugme.jpg> </A>
gibi. Tabii istenirse </A> metninden önce metin
yazmakta mümkündür.
<A HREF="http://site adresi/sayfa adi.htm"><img
src=‖dugme.jpg> <br>Link metni</A> gibi
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
100
Resim Haritası (Image Map) ile Link Kullanımı
Resimlerin farklı kısımlarından farklı yerlere link vermek
isterseniz resim haritalarından faydalabilirsiniz. Örneğin ilk anda aklınıza gelebileceği gibi Türkiye haritası
üzerinde tıklanacak ile göre ilgili ilin sayfasına geçiĢ yaptırılabilir.
Resim haritası bir resim üzerindeki tanımlanmıĢ etkin noktaları (hotspots) link olarak belirler. Etkin noktalar
dikdörtgen veya yuvarlak olabileceği gibi düzensiz Ģekiller de olabilir. Bunlar için uygun koordinatlar
belirtilmelidir.
Dikdörtgen etkin noktanın konumu iki noktayla
tanımlanır: sol üst ve sağ alt köĢeler. Her nokta resmin
sol-üst köĢesinden yatay ve dikey uzaklığını piksel cinsinden belirten bir sayı çiftiyle tanımlanır. AĢağıdaki
örnekte 0,0 etkin noktanın sol üst köĢesinin 50,50 de sağ alt köĢesinin resmin sol üst köĢesine olan uzaklığıdır.
<map name="haritaadi" id="haritaadi"> <area shape="rect" coords="0,0,150,150" href="adana.htm" />
</map>
Yuvarlak etkin noktanın konumunu tanımlamak için üç adet koordinat kullanılır: ikisi (yatay ve dikey değerler)
dairenin merkezini tanımlamak için, üçüncüsü dairenin yarı çapı içindir.
<map name="haritaadi" id="haritaadi"> <area shape="circle" coords="100,150,60"
href="adana.htm" />
</map>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
101
Çok köĢeli etkin noktanın konumunu tanımlamak için
Ģeklin tüm köĢelerinin koordinatları kullanılır. Çok köĢeli etkin noktalar tanımlanan noktaları birleĢtiren düz
çizgilerden oluĢur. AĢağıda beĢ köĢeli bir etkin nokta için gereken kod verilmiĢtir:
<map name="haritaadi" id="haritaadi"> <area shape="poly" coords="310,14,559,195,274,356,5,118,126,411"
href="ankara.htm" />
</map>
AĢağıdaki resimde 4 adet geometrik Ģekle de link
verilmiĢtir. <img> etiketine usemap="#haritaismi" eklendiğinde haritaismi adlı resim haritasına göre resim
içerisinde linkler belirir.
Link Verirken Relative (göreceli) ve Absolute (mutlak) Adreslemelerin Farkları
www.abc.com sitesinin tasarlandığını, www.abc.com/yazilar adresinde ise makaleler
yayınlanacağını varsayalım.
“yazi1.html” dosyasına link verirken
“yazilar/yazi1.html” adresi kullanılabilir. Ancak istenirse “http://www.abc.com/yazilar/yazi1.html”
adreside kullanılabilir. Bunların birincisi göreceli ikincisi
ise mutlak adreslemedir.
Her ikisinin de hem avantajı hem de dezavantajları
vardır:
Relative adreslenerek oluĢturulan sayfaların bir
makineden diğerine taĢınması kolaydır
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
102
Relative linkler bir üst seviyedeki sayfa taĢındığı
zaman kırılırlar. (Örneğimizde ―yazilar‖ kladörü kalkarsa tüm linkler bu ısımdaki tüm linkler
kırılacaktır)
Relative linkleri local serverlarda çalıĢtırıp denemek
daha kolaydır.
Absolute adreslemede yazılan linkler daha uzundur
ve bakımı daha zordur
Bazı dosyaların mutlaka sunucudan yüklenmesini
istiyorsanız (bir kullanıcının sayfanın bir kopyasını kendi makinesine indirmesi durumunda) kesin
sonuç verir.
Bu iki adresleme arasındaki farkları bilerek hazırlanan bir
sitede normalde göreceli ve mutlak adresleme beraber kullanılır, ve göreceli adreslerin sayısı genelde daha çok
olur. Ġyi bir sitede yapılabilecek bir düzenleme,
bütünlüğünün bozulmaması gereken sayfalarda, göreceli adresleme kullanmak, ve her yüklendiğinde değiĢen
sayfalara da mutlak link vermektir, örneğin saatbaĢı değiĢen istatistikler gibi.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
103
KULLANICI ĠLE ETKĠLEġĠM VE FORMLAR
HTML içinde ne sunarsak sunalım kullanıcılar bir
noktadan sonra gezdikleri sayfada kendilerinden bir Ģeyler görmek isteyecektir. Örneğin milli takım açılan
siteyi gezen bir taraftar olsanız ve site imkan verse, takıma baĢarı dileklerinizi sunmak yada maç için taktik
vermek istemezmiydiniz ? Yada imkan olsa oyuncularlar
web sitesi üzerinden bilgi alıĢveriĢinde bulunmak istemezmiydiniz. ĠĢte web de bu iĢlemler için FORM
denilen bilgi giriĢ sistemi kullanılır. Formların beĢ ana parçası vardır;
Bilgi giriĢ kutuları
Action ile gösterilen ve bilgileri iĢlemesi için
tasarlanan hedef
Submit tıklandığından ne iĢlem yapılacağını
gösteren hedef dosya ve bilgilerin iletilmesini istediğimiz yöntem (POST yada GET).
Bilgileri bu hedefe gönderecek SUBMIT düğmesi
Formu ilk haline getirecek olan RESET düğmesi
Form etiketinin kodlanması FORM ACTION="url" METHOD=POST veya GET> Ģeklinde olur.
<form name="forma verdiğimiz ad"
action="isle.php" method="post">
Adınız Soyadınız: <input type="text" name="isim"
size="40">
<input type="submit" value="Gönder">
<input type="reset" value="Temizle"> <form>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
104
Formun name parametresi ile forma bir isim verilebilir.
<FORM> etiketi, içeriğinde kullanılan ACTION parametresi ile kullanıcı SUBMIT butonuna tıkladığında
forma girilmiĢ olan bilgilerin hangi adresteki hangi programa teslim edileceğinin belirtilmesine imkan verir.
Ġsterseniz formu bir sayfada kodlayıp baĢka bir sayfada bu değerleri iĢleyebilirsiniz. Öte yandan parametrik
yöntemle bir sayfadan hem formu gönderip, action içinde aynı sayfayı tanımlayıp, kayıtları aynı sayfa içindede
iĢleyebilirsiniz.
Formun method parametresi ise verilerin, onu iĢleyecek
olan yere nasıl iletileceğini belirtir. Form verileri HTML içinde iki Ģekilde iletilirler.
GET
POST
Get metodu ile iletilen bilgiler diğer programa tarayıcının
adres satırından iletilirler. Örneğin içeriğinde ―ALĠ‖ bilgisi olan ―isim‖ ve içeriği ―ATMACA‖ olan soyisim değerini
―isle.php‖ dosyasına GET ile teslim edecek olursak tarayıcının adres satırı
www.alanadi.com/isle.php?isim=ALĠ&soyisim=ATMACA
Ģeklinde olacaktır. Get yönteminde bilgiler Web Server‘da
―query_string" denen değiĢkenin içine yazılıp diğer programa iletilirken, Post yönteminde bu bilgiler ―stdin"
değiĢkenine yerleĢtirilir ve Ģifrelenerek iletilir.
Buradaki handikap (ve tabiî ki avantaj) adres satırının
herkes tarafından görüntülenebilmesi ve formun hiç çağrılmadan adres çubuğundan bilgilerin verilerek hedef
dosyaya iĢlem yaptırılabilecek oluĢudur. Örneğin isle.php
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
105
dosyası bu bilgileri MYSQL veritabanına kayıt ediyor
olsaydı ve bizde adres çubuğundan
www.alanadi.com/isle.php?isim=MEHMET&soyisim=ATM
ACA
bilgisini göndersek bu bilgilerde veritabanına kayıt
edilmiĢ olacaktı. Haliyle bu iĢlem parola vs iĢlemlerde tercih edilmez. GET yöntemi benim kiĢisel tecrübelerime
göre ekranda listeleme sırasında sayfalama yaparken, resim galerisinde resim adı gönderilirken, dosya adı
gönderilirken yada doğrudan adres satırından bilgi göndermek için uygun bir yöntemdir. Parola vs ekranları
içinse uygun değildir.
GET yönteminin handikapı dediğimiz olayda bir de
avantaj gizlidir. POST yöntemi için form dizayn etmek gerekir ancak GET yöntemi için form dizayn etmeden
doğrudan diğer programa bilgi geçiĢi yapılabilmesidir.
www.alanadi.com/dildegis.php?dil=ENGLISH bilgisi hedef dosyaya yeni dil için bir parametre değieri iletmektedir.
Diğer program ortada bir form olmamasına rağmen bunu GET ile gönderilmiĢ gibi kullanabilir. Oysa bu iĢlem POST
ile yapılamaz.
Ayrıca GET için kullanılan ―query string‖ uzunluğu belli
bir değeri geçemez. POST yönteminde böyle bir sıkıntı yoktur. Özetle
POST
YavaĢ
Güvenli
http header‘ı kullanır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
106
Sınırsız bilgi gönderir
GET
Hızlı
Güvenlik daha zayıf
Taracının adres satırı kullanır.
Max 2048 karakter gönderebilir.
Form olmadan adres satırı ile Veri alınıp gönderilebilir
Formda ayrıca giriĢ kutuları vardır ve bunların her birinin de name parametresi vardır. Bu name parametreleri son
derece önemlidir. Bir INPUT etiketinin name değeri formu iĢleyecek olan dilin (PHP, JSP veya baĢka bir dil) o
kutunun içindeki değere eriĢmek için kullanacağı değiĢken adıdır. Kısaca Input etiketlerinin name
özelliklerini verirken değiĢken tanımlama kurallarına
uygun davranılmalıdır. Örneğin ―adsoyad‖ uygun bir isimdir ama ―ad soyad‖ uygun bir isim değildir. Bu
iĢlemde uygun olmayan isimlerin kulanılması HTML tarafını enterese etmez. Ancak bu değerleri iĢleyecek
olan program bunlarn değerlerine eriĢemez.
Formun Submit seçeneği onu hedefe gönderecek butonu,
RESET parametresi ise formu ilk anki değerlerine geri dönderecek butonu temsil eder.
Form Etiketinin Alt Seçenekleri
Yukardaki örneklerden kolayla anlaĢılabilir ama yinede formun alt etiketlerini detaylıca yeniden görelim.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
107
ACTION=url
Formun gönderildiğinde hangi program tarafından değerlendirileceğini belirtir.
METHOD=get-post Bilgilerin sunucuya hangi yolla gönderileceğini
belirtir. GET değeri verildiğinde kontrollere girilen içerik o anda bulunulan adrese eklenip
değerlendiriciye gönderilir. POST değeri ise form içeriğini direkt olarak derleyici programa
yönlendirir.
TARGET=window
Netscape tarafından getirilen bu tag form değerlendirici tarafından kullanıcıya geri gönderilen
yanıtın hangi pencerede belireceğini gösterir. Pencere isimleri FRAME konumuzu iĢlerken
gösterdiğimiz " _blank" , " _top" gibi değerlerden
biri olabilir.
Submit ve Reset Düğmeleri
Bu düğmeler formun hedefe iletilmesini yada içeriğinin temilenmesini salayan ögelerdir.
Form Elemanları Çizelgesi
Kontrol ġekli YazılıĢı Açıklama
TextBox
<INPUT TYPE="text">
Kullanıcının tek satırdan oluĢan metin girmesi
için kullanılır.
Passwo <INPUT
TYPE="password"
Yukarıdaki gibi
string ifade giriĢi
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
108
rd > yapılır. Bununla
birlikte yazılan karakterler yerine *
karakteri gösterilir.
Hidden ** (görünmez)
<INPUT TYPE="hidden">
Formla birlikte taĢınan bu
alandaki bilgi kullanıcıdan gizlenir.
File
<INPUT TYPE="FILE">
Forma kullanıcının bir
dosyasının ismini girmesine izin
verir.
CheckBox
<INPUT
TYPE="checkbox">
Kullanıcının
doğru/yanlıĢ (true/false) Ģeklinde
mantıksal değer girmesinde
kullanılır.
RadioB
utton
<INPUT
TYPE="radio">
Özel bir seçenek
listesinden seçim yapma imkanı verir.
Radibuttonların name özelliğine
aynı değerler verilerek
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
109
sınıflandırılabilir.
Submit
Submit
<INPUT TYPE="submit">
FORM etiketinin ACTION
özelliğinde belirtilen URL ye form bilgilerini
göndermede kullanılır.
Reset
Reset
<INPUT TYPE="reset">
Bütün form kontrollerini
sıfırlamada kullanılır. Formun sayfa ilk
yüklendiğindeki eski halini
almasını sağlar.
Image
<INPUT
TYPE="image">
Tıklandığında
Mouse imlecinin X ve Y koordinatlarını
göndererek grafiksel onay
buttonu yapmada kullanılır.
Button
<INPUT TYPE="button">
Ġstemci-tarafı (Client-Side)
scriptlerinden JavaScript ya da
VBScript i tetikleyebilecek
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
110
komut düğmesi
oluĢturur
TextArea
<TEXTAREA> Çok satırlı
metinlerin girilmesine
imkan sağlayan bir kontroldür.
ComboBox
<SELECT size="1">
Kullanıcıya açılan bir listeden hazır seçenekler
sunar.
ListBox
<SELECT size="n">
Kullanıcıya liste
Ģeklinde hazır seçenekler
sunar. Buradaki "n" ListBox ın kaç satırlı
olacağını belitir.
INPUT
INPUT etiketi ile ziyaretçiye, forma klavyeden yazarak bilgi girme imkanı verilir. Bu etiketi kullanmanın genel
kodlanıĢı Ģöyledir:
<INPUT TYPE="..." NAME="..." VALUE="..." SIZE="..."
MAXLENGTH=".." SCR="..." CHECKED"...." TABINDEX="X">
ALIGN=tip TYPE değeri bir resim olarak atandığında bir
sonraki satırın resme göre nasıl yerleĢtirileceğini
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
111
belirtir. TOP, MIDDLE veya BOTTOM değerlerinden
birini alabilir.
CHECKED
Kontrol olarak bir iĢaretleme veya seçim kutusu kullanıldığında CHECKED değeri bu kutuların
iĢaretlenmiĢ olarak karĢımıza gelmesini sağlar.
MAXLENGTH=uzunluk
Metin kutusuna kullanıcının maksimum kaç karakter girebileceğini belirler.
NAME=isim Kontrole bir isim verir
SIZE=boyut Kontrolün boyutlarını karakter cinsinden
belirlemenizi sağlar. TEXTAREA kontrolü kullanıldığında en,boy' gibi bir ifade kullanılarak
kontrolün hem eni hem de yüksekliği belirtilebilir.
SRC=adres Kontrol olarak resim seçildiğinde resmin bulunduğu
adresi taĢır.
TYPE=tip
Kontrolün cinsini belirler ve Ģu değerlerden biri olabilir. Checkbox, Hidden, Image, Password,
Radio, Reset, Submit
o CHECKBOX: Bir onay kutusu görüntüler ve
sadece doğru veya yanlıĢ değerlerini alabilir.
o HIDDEN: Web tarayıcısının penceresinde
görünmez fakat içerdiği değer gönderilen form ile web sunucusuna ulaĢır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
112
o IMAGE Bir resmi ifade eder ve üzerine
tıklandığında form değerlerini sunucuya yollar. Genellikle bu amaçla kullanılsa da
istenilirse kullanıcının resmin hangi x ve y noktalarına dokunduğu öğrenilebilir. Bu tag
SRC ile birlikte kullanılır ve SRC komutu resmin bulunduğu URL'yi göstermelidir.
o PASSWORD TEXT kontrolü ile aynı özellikleri taĢır fakat kullanıcının girdiği karakterler bu
kontrolde yıldız olarak görülür. ġifre giriĢi için uygundur.
o RADIO Kullanıcının bir çok seçenek içerisinden bir tanesini seçebilmesine olanak
tanır. Grup içindeki RADIO kontrolleri her zaman aynı ismi taĢımalı kontrollerin
değerleri VALUE değerine atanmalıdır.
o RESET Tıklandığında form içeriğini temizler. Kullanıcının form'u tekrar doldurmasını
sağlar.
o SUBMIT Form içeriğini sunucuya yollar.
VALUE değeri kullanılarak üzerindeki yazı değiĢtirilebilir.
o TEXT Kullanıcıdan tek satırlık veri alınmasına olanak tanır. SIZE ve MAXLENGTH
takıları, bu kontrolle birlikte kullanılabilir
ġimdi Input etiketinin kullanım ilkelerini kullanıcının
yapabileceği iĢlere göre ayırarak detaylıca inceleyelim
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
113
Kullanıcının klavyeden metin girmesi için:
TYPE=TEXT NAME="..." VALUE="..." SIZE="..."
MAXLENGTH="..." TABINDEX="X"
―Size" bu kutunun kullanıcının ekranında gösterileceği
geniĢliği karakter olarak belirler; ―Maxlength" ise kullanıcının girebileceği metnin uzunluğunu karakter
olarak belirler. Bu değer verilmez ise varsayılan değer olan 21 hane sınırı kullanılır. Form ekrana geldiğinde bir
kutunun varsayılan olarak bir değerle gelmesini istiyorsanız bu değer VALUE parametre ile verilmelidir.
Forma bilgi giriĢi yapılırken tab tuĢuna basılacak olursa kutular arasında hareket etmek için kullanılacak sıranın
girilmesini sağlar. Örneğin tabindex değeri 1 olan kutuda
tab tuĢuna basılır ise tabindex değeri 2 olan kutuya geçiĢ yapılır.
Parola GiriĢi için:
TYPE=PASSWORD NAME="..." VALUE="..." SIZE="..."
MAXLENGTH="..."
Metin girme kutusu ile aynı özelliklere sahiptir; fakat bu
kutunun içine kullanıcının gireceği bilgiler ekranda gösterilmez yerine yıldız simgesi gösterilir. Bankalardaki
Ģifre giriĢ ekranı gibidir.
Onay Kutusu için (Check iĢareti):
TYPE=CHECKBOX NAME="..." VALUE="..." [CHECKED]
Bu kutucuğa harf vs girilemez. Sadece fare ile tıklanabilir yada boĢluk tuĢu ile içine check iĢareti konulur. Gene
aynı Ģekilde bu iĢaret kaldırılabilir. Bu kutuda iĢaret
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
114
varsa, tarayıcı ―Value=" hanesine yazacağınız bilgiler ve
kutunun adını bir çift olarak Server‘a gönderir. Kutuda iĢaret yoksa kutunun adı ve değeri Server‘a gönderilmez.
Böylece içinin boĢ olduğu varsayılır. Kutunun ekrana iĢaretlenmiĢ olarak gelmesi için, CHECKED parametrei
kullanılır.
Tekil Seçme Kutusu için (Radyo düğmesi):
TYPE=RADIO NAME="..." VALUE="..." [CHECKED]
Bu eleman formda çoklu seçeneklerden birisinin (ama sadece birisinin) seçilebilmesine imkan verir.
Listeleme Kutusundan SeĢmek Ġçin (SELECT)
Bu etiketi ile, formda bir kutu ve yanında bir aĢağı ok
oluĢturabilirsiniz; kullanıcı aĢağı oku tıklayarak kutudaki elemanları açıp birisini seçebilir. Seçilen kutu içerğine
yazılır. Ġstenirse bunlardan birisi otomatik olarak seçilmiĢ olarak da gösterilebilir. Bu etiketin kullanım Ģekli
Ģöyledir:
<SELECT NAME="...." SIZE="..."
MULTIPLE]>.....</SELECT>
Size hanesine 1, 2, veya 3 vs.. yazarak, ekrandaki kutunun kaç seçenek göstereceğini belirleyebilirsiniz. Bu
hane konulmazsa, otomatik 1 seçenek varsayılır. Bu kutuda gösterilecek seçenekler,
<SELECT....>..</SELECT> etiketlerinin arasına
<OPTION> etiketiyle yazılır. (<OPTION> etiketi kapatılmaz.) Herhangi bir seçeneğin otomatik olarak
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
115
seçilmesi için önündeki <OPTION> etiketinin içine
SELECTED kelimesi konulur. Örnek:
<select name="cinsiyet" size="1">
<option selected>cinsiyetiniz
<option value="Erkek">Erkek </option>
<option value="Bayan">Bayan</option>
</select>
Uzun Metin GiriĢi Ġçin (TEXTAREA)
Metin kutusu, ziyaretçiye, Web Server‘a uzun metin
gönderme imkanı sağlar.
<TEXTAREA NAME="..." rows=.. cols=..>Otomatik
yazılması istenen metin buraya yazılır </TEXTAREA>
―Name=...." parametresi ile ile metin kutusuna Server‘a
gelecek metnin iĢlenmesi ve kullanılması için gerekli
değiĢken adı verilebilir.
―rows=" ve ―cols=" parametreleri ile ise bilgi giriĢi
kutunsun satır sayısı ve karç harf geniĢliğinde olacağı bildirilir. Bu iki parametrenin girilecek metnin uzunluğu
ile ilgisi yoktur.
Gönder ve Sil düğmeleri (Submit ve Reset)
Doldurulan bir formun girlilen bilgileri iĢleyecek programa gönderilmesi için formlarda GÖNDEr (Submit),
ve forma girilen değerlerin yeniden ilk baĢtaki değerlerine dönderilmesi için SĠL(Reset) düğmesi
kullanılır.
Bunun için INPUT etiketi Ģöyle kullanılır:
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
116
<INPUT TYPE=SUBMIT NAME=Gonder
VALUE="Gönder">
<INPUT TYPE=RESET NAME=Sil VALUE="Sil">
Tarayıcının otomatik düğme Ģekli yerine kendi düğme grafiklerimizi kullanabileceğimiz gibi sayfaya birden fazla
ve değiĢik maksatlarla düğme koymakta mümkündür. Ancak her düğmenin ayrı ismi ve ayrı değeri olması
gerekir (aksi takdirde gönderilen bilgilerin ilenmesinde karıĢıklık çıkar). Bu kodu Ģöyle yazabiliriz:
<BUTTON TYPE=SUBMIT NAME=‖Gonder‖ VALUE="Kaydet"><IMG SRC="kaydet.jpg></BUTTON>
<BUTTON TYPE=RESET NAME=‖Sil‖ VALUE="Sıfırla"><IMG SRC="sil.jpg></BUTTON>
Not: Formlarda HTML içindeyken çok önemli olmasa da işin içine PHP ASP vs diller girdikçe
önem kazananan bir konu vardır. O da form
elemanlarına NAME ile isim verirken kullanılan değerlerdir. NAME bu bilgilerin gönderildiği adreste
temsil edilecek olan ismidir.
Bilgiyi işleyecek olan program bilgilerin içeriğine
bu isimlerle erişecektir. Kısaca NAME ile verilecek isimlerde değişken tanımlama kurallarına uyulması
uygun olacaktır. Aksi taktirde PHP ile bunların içeriğini okuyamayız. (Aynı durum ASP ve diğer
diller içinde geçerlidir)
Tabindex
Forma bilgi giriĢi yapılırken tab tuĢuna basılacak olursa kutular arasında hareket etmek için kullanılacak sıranın
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
117
girilmesini sağlar. Örneğin tabindex değeri 1 olan kutuda
tab tuĢuna basılır ise tabindex değeri 2 olan kutuya geçiĢ yapılır.
Burada formlar konusunda çok detaylı durmaya gerek yoktur. Çünkü standart HTML formdan gelen verileri
iĢleme yeteneğine sahip değildir. Bu iĢlem için CGI, PERL, JSP, ASP yada PHP gibi dinamik diller kullanılır.
Form içeren basit bir sayfa kodu ise:
<HTML> <HEAD>
<TITLE>Üye Kayıt Formu</TITLE> </HEAD>
<BODY bgcolor=gray text="blue"> <H2><FONT color="#FF0001">Üye Kayıt
Formu</FONT></H2> <FORM method="post" name="formKayit"
action="mailto:[email protected]?subject=deneme&cc=xx
@xx.com.tr"> <strong>Adı : </strong><INPUT type="text"
name="txtAdi" size="15"> <strong>Soyadı : </strong><INPUT type="text"
name="txtSoyadi" size="30"> <INPUT type="submit" name="kaydet" value="Mail
Gönder"> <INPUT type="reset" name="temizle"
value="Temizle"> </FORM></H3>
</BODY>
</HTML>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
118
Dikkat ettiyseniz kodu yazmak için table vs kullanmadık.
Bilgi giriĢ kutularının uzunluklarının farklı olacağınıda varsayarsak, buna TEXTAREA giriĢleride eklenirse
düzgün ve güzel görünen bir giriĢ ekranı yapmanın imkansız olduğunu görürüz. Bu yüzden en uygun
seçenek form elemanlarını tablo içine yerleĢtirmektir. Sol taraftaki hücreler tanıtıcı metinler ―adı giriniz‖ gibi yazılır,
bunların karĢılarındaki hücreye ise giriĢin yapıalacağı form elemanı konulur. Haliyle bu tasarım daha düzgün
bir görüntü üretecektir.
URL Kodları
Bazen adres satırında % iĢaretlerine boğulmuĢ anlamsız gibi görünen bilgiler yer alır. Bunlar URL Ģemasındaki
karĢılığına göre kodlanmıĢ bilgilerdir. Amaçları bilgileri
kakter seti sorunu olmadan aktabilmektir. HTTP protokolüne göre, ASCII karakter seti içinde yer almayan
karakterler(sadece Türkçe'de yada sadece bazı diğer alfabelerde bulunan harfler), bir Form'da yer aldığı
taktirde, tarayıcı tarafından karĢılıklarına göre kodlanarak gönderilir. Gerçi bir çok HTTP sunucu
programı bu karakterlere tanıyabilir ve bir dosyaya yazarken doğru Ģekilde yazabilirler; ama bu çevirme
iĢleminin bazen program yardımıyla yapılması gerekebilir. Önemli olanların listesi aĢağıda verilmiĢtir.
ü = %FC
Ü = %DC
ö = %F6
Ö = %D6
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
119
ı = %FD
Ġ = %DD
ğ = %F0
Ğ = %D0
Ģ = %FE
ġ = %DE
ç = %E7
Ç = %C7
% = %25
& = %26
[ = +%5B
] = %5D
{ = %7B
} = %7D
? = %3F
= = %3D
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
120
CSS ile Biçimlendirme Teknikleri, Dinamik HTML
CSS Stillerine Neden Ġhtiyaç Duyulur
Etiketleri incelerken gördüğümüz üzere biçimlendirme ile metin iç içe girmekteydi. Böylece hem metnin
etiketlerden ayrılması hemde GOOGLE gibi arama motorlarının sayfamızı indexlemesi zorlaĢmaktadır.
Biçimlendirme etiketleri kullanarak diyelimki belgenizdeki tablo baĢlıklarını hep aynı stilde yazmak istiyorsunuz. O
zaman çaresiz her tablo baĢlığını tek tek biçimlendirmek
zorundasınız. Oysa CSS teknolojisi Word içinde tanımlı hazır biçimlendirmeler gibi biçimlendirme blokları
kullanmaya izin verir. Tablo baĢlığı örneğine geri dönersek, bu baĢlığı bir stil olarak tanımlar –örneğin 14
punto, Tahoma, Kalın ve ortalanmıĢ, mavi zemin renginde- bu stili kaydettiğimiz dosyayı HTML içinde
kullanarak sitemizin (sitenin geneli sadece sayfa değil) genelinde sadece stilin adını vererek ilgili biçimlendirmeyi
uygulayabiliriz. Dahada güzeli, stiller tek bir dosyadan geldiği için stil dosyasındaki bir değiĢiklik anında tüm
sitemizde uygulanacaktır. Tablo baĢlığı örneğindeki gibi örneği forntu değiĢtirsek yada zemin rengini değiĢtirsek
tüm sitemizde ne kadar tablo varsa bu stil hepsi için değiĢtirilmiĢ olacaktır.
CSS bu açıdan büyük kolaylıktır. Ancak unutmayalım ki tarayıcılar içerik gibi CSS etiketlerini de kendilerine göre
yorumlamaktadırlar.
ġüphesiz tek fayda bu değildir. Biçimleri sayfa kodlarında sürekli tekrarlamak aynı zamanda gereksiz kod
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
121
yığınlarına yol açacak sayafaların kod uzunlukları
gereksiz yere artmıĢ olacaktır. Bu yüzden sayfalarımız azda olsa daha geç açılacaktır. Bu ―az da olsa‖
görecelidir. Örneğin tabloda çok fazla satır sütun varsa ve bunlar biçimlendirme içeriyorsa sayfanın açılması
normalden çok daha uzun sürecektir. Bunun alternatifi olarak CSS stilleri genel olarak tek bir dosyadan
çağrılırlar ve kullanım için hafızaya yığılır, adı geçtikçe çağrılarak kullanılır.
CSS web sayfasını biçimlendirmede HTML den daha geniĢ imkânlar sunar. Örneğin div etiketiyle bir katman
oluĢturabiliriz ama hizalama dıĢında baĢka bir özelliğini değiĢtiremeyiz. Ancak CSS ile katmanın sayfa içindeki
konumu, arka plan rengi, kenarlık tipi, yazı rengi, kanlınlığı vb. pek çok özelliğini belirleyebiliriz.
CSS sadece biçimlendime iĢlemi için değil sayfanın
iskeletini tanımlamaktada kullanılır. Bunun için için ekranın ayrılan her bir parçası ayrı bir katman gibi ele
alınır ve bu sayede tablo kullanmadan üstelik framesetler lede uğraĢmadan sayfanın çatısını oluĢturabiliriz.
Cascading Style Sheets -CSS ve Kullanım ġekilleri
Web sayfalarını biçimlendirme konusunu ilk ele aldığımızda yerel biçimlendirme yoluna gitmiĢ ve neyi
biçimlendireceksek o etikete ait kodları hemen orada yazmıĢtık. CSS etiketleri ise hafızaya yığırlır demiĢtik.
CSS sayfa içinde üç Ģekilde kullanılabilir.
1. Yerel (Inline)
2. Sayfa içi global (Embedded)
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
122
3. Site içi global (Linked)
Yerel Stil ġablonu
Yerel Stil ġablonlar, uygulanacak etiketi sadece bir kez
bulunduğu yerde etkiler.
Örnek:
<html>
<head> <title>Css</title>
</head> <body>
<h2>CSS Kullanımı</h2><br>
<h2 style=font-size:20pt; color:blue>CSS
Kullanımı</h2>
</body>
</html>
Görüldüğü gibi bu Ģekilde sadece o an kullanılan etikete
etki edilmiĢtir.
Dezavantajı : Bu kullanımı font taglarının kullanımı
arasında pek bir fark yoktur. Anlık çözümdür ve CSS in
genel mantığına aykırıdır.
Sayfa Ġçi Global Stil ġablonu
Global Stil Ģablonları bir önceki örnekte yaptığımız gibi h2 etiketinin (yada diğer bir etiketin) tüm sayfada aynı
özellikte olması istendiğinde kullanılır. Bunu için Stil
Ģablon özellikleri sayfanın baĢlangıcında (<head></head> etiketleri arasında) tanımlanır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
123
Örnek:
<html>
<head>
<title>Css</title>
<style type="text/css">
<!-- h2 {font-size:20pt; color:blue} -->
</style>
</head>
<body>
<h2>Web Teknikleri</h2>
</body>
</html>
Yukarıdaki örnekte sayfa içerisinde kullanacağımız tüm
h2 etiketlerinin özellikleri sabitlenmiĢtir. Yani sayfa içerisinde nerede kullanırsanız kullanın h2 etiketinin stil
özellikleri hep aynı kullanılacaktır. Stil Ģablon
tanımlamaları <head> </head> etiketleri arasında <style type="text/css"> ile baĢlayıp </style> ile
bitmelidir.
Dezavantajı : Tanımlanan stiller her sayfada tekrarlanmıĢ olur. Diyelim ki stillerinin toplamda 5 kb yer tutuyor olsun 500 de sayfanız olsun. Stiller 2500 KB yer
tutuyor demektir. Ayrıca her sayfa için CSS stilleri de tarayıcıya yeniden gönderilecek ve gereksiz trafik
oluĢacaktır. Hepsinden beteri ise bir stilde değiĢiklik
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
124
yaparsanız diğer sayfaları da değiĢtirmeniz gerekir. 3-5
sayfa için bu kolaydır belki ama binlerce sayfadan oluĢan bir portal düĢünürseniz bu iĢin ne derece zahmetli
olacağı açıktır. Ayrıca bir sayfada farklı diğerinde farklı biçimlere yer verilmiĢ olabilir. Buda sitenin tutarlılığını
düĢürür.
Site Ġçi Global Stil ġablonu
Global stil Ģablonunu, sitemiz içerisindeki tüm sayfalarda
kullanmak istediğimizde uygulanabilecek bir tekniktir. En çok kullanılan biçimde budur. Uygularken, stillerimizi
yukarıda örneklerini verdiğimiz Ģekilde hazırlarız. Fakat bu stil listesini html dosyamızın içerisinde değil de boĢ
bir sayfaya yazarız ve css uzantılı bir Ģekilde kaydederiz. Ardından da html dosyamızın içerisine yine <head>
</head> etiketleri arasına <link rel="stylesheet"
type="text/css" href="dosya_ismi.css"> Ģeklinde ekleriz.
Örnek
h1 {font-size:13pt; color:green}
h2 {font:20pt; color:blue}
h3 {font-size:15pt; color:red}
Yukarıda verilen örnekteki dosyayı stil.css olarak
kaydedip, html dosyamıza geçelim. Html dosyamızın kodları:
Örnek:
<html>
<head>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
125
<title>Css</title>
<link rel="stylesheet" type="text/css" href="stil.css">
</head>
<body>
<h1>Web Teknikleri</h2>
<h2>Web Teknikleri</h2>
<h3>Web Teknikleri</h2>
</body>
</html>
HTML dosyasının kodları arasında geçen <link rel="stylesheet" type="text/css" href="stil.css"> kodu
stil.css dosyasındaki stil özelliklerini kullanmamızı sağlar.
Avantajları :
1. CSS dosyası hafızada durduğundan CSS her seferinde web serverdan yeniden istenmez.
2. CSS dosyası bir tane olduğundan sayfalar küçülür.
Böylece bu iki madde siteyi daha hızlı hale getirir
ve gereksiz trafiği önler.
3. CSS dosyasında yapılacak bir değiĢiklik anında tüm
siteye yansıyacaktır.
4. Sitenin tamamı biçimlendirme açısından tutarlı hale
gelir.
Birden fazla stil Ģablonu verilirse Tarayıcı ne yapar?
ġimdi bir Cd rafı düĢünelim. Elimize geçen tüm CD kutularını buna üst üste yığıyoruz ve kural olarak CD
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
126
aramamız gerektiğinden hep rafın üstünden altına doğru
aramaya baĢlayacağımızı varsayıyoruz. Peki aynı stil Ģablonu iki yada daha fazla sayıda tanımlanırsa ne olacak
? Bu durumda olacak olan Ģudur. Rafın üstünden altına doğru arama yapılır bulunan ilk eĢitlikte iĢe arama biter.
Kısaca öncelik hep en son tanımalanan stilin olur. Özetle
1. Bir HTML sayfaya iki LINK komutu ile ardarda iki
ayrı CSS dosyası bağlarsanız, ikisinde de aynı ada stil Ģablonu içeriyorsa, ikincisindeki, yani Cd rafının
en üstündeki komutlar geçerli olur.
2. Bir HTML‘e biri LINK, diğeri EMBED iki ayrı stil
bilgisi verilirse ve ikisinde de aynı ada sahip stil Ģablonu var ise, ikincisi, yani HTML‘in içinde
EMBED olanı geçerli olur; çünkü HTML önce dıĢ dosyayı okuyacak, onun üstüne kendi içindeki
stilleri koyacaktır.
3. Son olarak, bir sayfada hem LINK, hem EMBED stil bağlantısı olsa ve diyelim ki bir HTML etiketinin
önünde onu biçimlendiren bir yerel stil komutu (INLINE stil) bulunsa, en son okunan yerel stil
komutu olacağı için, tarayıcı ilk iki stili bir kenara bırakıp, INLINE stili uygulayacaktır.
HTML içinde bölüm oluĢturma (DIV)
DHTML‘i bir teknikler demeti olarak ele alırsak, ilk
tekniğimiz, sayfamıza ne metin, ne grafik, ne tablo ve ne de çerçeve sayılmayan, ama içinde bunların tümüne de
yer verebileceğiniz bölüm kavramına dayanan <DIV>..</DIV> etiketidir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
127
<DIV>..</DIV> etiketleri arasında yer alan her Ģey, yani
yazılar, resimler, grafikler, tablolar, video vs içerikler, bu etikete vereceğiniz yerleĢtirme ve değiĢme özelliklerine
uygun hareket ederler.
<div> etiketi ile belgede bölümler oluĢturulabilir. <div>
etiketi için herhangi bir stil özelliği belirlendiğinde <div>..</div> arasına yazılan tüm etiketler bu stilden
etkilenir. AĢağıda oluĢturulan bölümde <div> etiketine style="color:#FFCC66;" stili uygulandığında <div>
içindeki paragraf ve baĢlık da ilgili renkte (turuncuya yakın bir renk) görüntülenecektir.
<div style="color:#FF0000;"> <h4>Bölüm içinde bir baĢlık</h4>
<p>Bölüm içinde herhangi bir paragraf</p></div>
CSS ve Seçici(Selector) Kavramı ve Seçici Tipleri
XHTML ve CSS kullanımında Selector kavramı önemli bir
yer tutar. Seçici (selector) demek ―stili belirlenebilen etiket‖ demektir. 4 tipi vardır, isimlendirilmiĢ, sınıf,
karma ve Ģartlı.
ĠsimlendirilmiĢ Seçiciler
Bu tip seçicilerin kullanımında html içinde etiketten sonra ID=‖xxx‖ kodlaması yapılır. Bu tip seçici kodlaması # ile
baĢlar.
#mavi { COLOR: blue }
#icerden { text-indent: 2cm }
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
128
isimlendirilmiĢ seçicilerdir. BaĢlarındaki ―#‖ iĢareti
onların diğerlerinden farkını göstermektedir. (Bu iĢaretten sonraki isim bölümü mutlaka harfle
baĢlamalıdır; ama içinde rakam ve kesme çizgisi kullanılabilir.) Bu seçicilerden HTML‘de yararlanmak için,
adlarıyla çağrılması gerekir. Böylece tanımlı olan isimleri ile kodlanmıĢ olan biçimlerin uygulanmasını sağlarlar.
<P ID=icerden>Bu paragraf diğerlerine oranla 2 sm içerden baĢlar<-p>
<P ID=mavi>Bu paragraf mavi olarak gösterilir</p>
Bu seçiciyi kullanırken, aynı etikete iki ayrı kimlik
verilemeyeceğine dikkat edilmelidir. Bunun bize ne getirip götüreceği konu sonunda detaylıca
anlatılacaktır.
Sınıf Seçiciler
Bunların kodlaması ise . ile baĢlar ve istenildiği takdirde
bir sınıf tanımlanıp bu sınıfın biçimlendirme özelliklerinin birleĢtirildiği standart html etiketine de
uygulanabilmesini sağlar.
Ġstenildiği kadar Sınıf Seçici oluĢturmak mümkündür.
Örneğin ―kırmızı‖ diye bir sınıf oluĢturup, bu sınıfın font rengini kırmızı yapıp, dikkat çekmesi gereken kelimeyi,
cümleyi veya paragrafın etiketini bu sınıfa bağlamak mümkündür. Bu stilin komutu Ģöyle yazılır:
.kirmizi { COLOR: red }
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
129
―Kirmizi‖ kelimesinin baĢındaki nokta iĢaretine dikkat
edilmelidir. Bu iĢaret su sınıfı isimlendirilmiĢ seçicilerden ayırmaktadır. HTML sayfasında diyelim ki bir baĢlığı
kırmızı yapmak gerekmekte olsun:
<h1 class="kirmizi">Bu baĢlık kırmızı olacak</h1>
Ya da bir paragrafın tümünü kırmızı renkte olacak denirse:
<P class=.kirmizi>Bu paragrafın tümü kırmızı gösterilerek, dikkati hemen çekecektir.</p>
Yukardaki kullanım sınıf seçici türünün bağımsız kullanımına bir örnektir. Diğer bir kullanımıda bir etikete
bağlı olarak kodlandığı aĢağıdaki kullanım Ģeklidir.
h1.kirmizi { COLOR: red }
Yukardaki Ģekilde tanımlanmıĢ bir sınıf seçici görüldüğü üzere sınırlı kullanıma sahiptir. Bu durumda ―kırmızı‖
sınıfını sadece H1 etiketi ile kullanmak mümkündür.
Sınıf seçiciler HTML içinde bir etiket için birden fazla olmak üzere kullanılabilirler.
Karma Seçiciler (Pseude Classes)
Bunlara karma denmesinin sebebi: kendi baĢlarına sınıf
gibi göründükleri halde ancak bir etiketin belirli durumlarına uygulanabilmeleridir. HTML dilinde buna
uygun Ģimdilik iki etiket vardır. <A> ve <P> etiketleri.
A etikeninin üç durumu olabilir ve bunları karma
seçicilere bağlamak mümkündür.
Link (henüz ziyaret edilmemiĢ olan adres)
Visited (daha önce ziyaret edilmiĢ adres) ve
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
130
Active (üzeri tıklandığı anda). ġimdi bu durumlara
uygun üç CSS etiketi yazalım:
A:link { COLOR: Black }
A:active { COLOR: red }
A:visited { COLOR: Gray }
Bu durumda ziyaretçinin ekranında A etiketleri siyah olarak gösterilecek, kullanıcı herhangi bir bağlantıyı
tıkladığında link metni kırmızı rengini alacak; daha sonra ilgili sayfaya bir daha gelirse bu kelimeler gri olarak
gösterilecektir.
a:link {
font-family:arial;
font-size:11pt; color:blue;
text-decoration:none; }
Sayfamdaki linklerin Yazıtipi arial, boyutu 11 punto, rengi
mavi olsun ve altı çizili olmasın.
a:hover{
font-family:arial; font-size:11pt;
color:red; text-decoration:none;
}
Üzerine gelindiğinde linklerin
Yazıtipi arial,boyutu 11 punto, rengi kırmızı olsun ve Altı çizili
olmasın.
a:visited{
font-family: arial;
font-size:11pt; color:grey;
Ziyaret edilen linklerin ise Yazıtipi arial, boyutu 11 punto,
rengi gri olsun ayrıca altı çizili olsun.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
131
text-
decoration:underline; }
Karma etiketin kullanılabileceği bir diğer durum ise baĢlık
veya metin gibi bir etiketin ilk satırı veya ilk kelimesinin özelliklerini kontrol eden seçicidir. Örneğin:
P:first-line
{ font-variant: small-caps; font-weight: bold }
P:first-letter
{ font-size: 300%; float: left }
Bu seçicilerle oluĢturulan etiketlere HTML‘in içinde Ģöyle
gönderme yapılır:
<P><P:first-line><P:first-letter>B</P:first-
letter>Bir ağaçta ne kadar çok yaprak varsa o kadar az meyve olur </P:first-line> Arap
atasözü..... </P>
ġartlı Seçiciler (Contextual Selectors )
Bir HTML etiketinin her zaman değil de belirli bir koĢulda belirli stiller almasını istediğimizde kullandığımız
Contextual Selectors (ġartlı Seçiciler) grubudur. B (Bold)
etiketi, uygulandığı baĢlık veya paragraf gibi bir etiketi kalın yaparak belirginleĢtirir. Fakat diyelim ki bu etiketi
paragraf etiketi ile birlikte kullandığımızda iĢaretlenen yerin siyah, baĢlık etiketiyle kullandığımızda gri
yapmasını istiyoruz. Bunun için CSS bölümünde bu etiketi P ve H1 bloklarında tanımlarız:
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
132
P { COLOR: black; FONT-FAMILY: 12pt; TEXT-INDENT:
1cm}
P B { COLOR: black}
H1 { COLOR: #008080; FONT-FAMILY: 26 pt serif}
H1 B { COLOR: pink }
Yukardaki tanımlamalara göre HTML kodlanırken H1 etiketi içinde B etiketi kullanılırsa iĢaretlenen kelimeler
pembe, paragraf etiketi içinde B etiketi kullanılır ise iĢaretlenen kelimeler siyah olacaktır.
Not:
CSS kullanımında isimlendirilmiĢ seçiciler daha çok
<DIV> yada <SPAN> gibi yapılar için, sınıf seçiciler ise biçimlendirmeler için kullanılırlar. ĠsimlendirilmiĢ
seçicileri etiket baĢına biden fazla kullanmak mümkün olmadığından bunlarla biçimlendirme yapmak sadece
ekstra iĢ demektir. Bunu basit bir örnekle izah etmeden
farkı anlamak zordur. Biçimlendirme için koyu, italik ve altı çizili biçimlerine ihtiyacımız olsun. Ancak yazı hem
italik hemde altı çizili olursa diye düĢününerek çok daha fazla sınıf tanımlamak gerekecektir. Önce bunu
isimlendirilmiĢ seçiciler için düĢünelim.
1. koyu
2. italik
3. altıçizili
4. koyu italik
5. koyu altı çizili
6. italik alt çizili
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
133
7. koyu italik altı çizili
7 seçici olmadan bu iĢi yapmak zor görünüyor çünkü her etiket için sadece bir isimlendirilmiĢ seçici kullanımına
izin verilmekte. ġimdi ĢimĢekler çaktı sanırım.
Örneği sınıf seçicilerle yapmak için ilk üçü yeterlidir.
Çünkü sınıf seçicileri bir arada kullanmak mümkündür.
Bir Alana Tanımlı Stillerin DıĢında Stil Uygulamak
Herhangi bir <div> bölümünde veya paragrafta
diğerlerinden ayrı stile sahip olması istenen herĢey <span>...</span> etiketleri içerisine yazılabilir. Bu
etiket Basit HTML dersinde kullanılması artık desteklenmeyen <font> etiketi yerine kullanılabilir.
<div style="color:#000000;"><h4>Rastgele bir baĢlık </h4>
<p><span style="color:#cccccc">Bir satır.Ancak rengi
div için tanımlanandan farklı </span> </p>
</div>
CSS Blokları ve Denetlenebilir Özellikler
CSS Biçimlendirme Tablosu
font-
family
Tahoma, Arial Yazı tipini belirler.(Arial ,
Verdana gibi.)
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
134
font-style Normal
italic oblique
Yazının normal veya sağa
eğik olmasını sağlar.
font-variant
Normal small-caps
Yazının, yazıldığı gibi veya tümünün büyük harflerden
oluĢmuĢ gibi görünmesini
sağlar. Ġkinci durumda metnin ilk harfi de boyut
olarak büyük gözükür.
font-
weight
Normal
bold bolder
lighter 100 – 900
Yazının kalınlık-inceliğini
belirler.
font-size Absolute-size (xx-
small | x-small | small | medium |
large | x-large
| xx-large)
relative-size (larger | smaller)
px , pt, %
Yazının büyüklüğünü
METĠN
Word
Spacing
normal |
<boyut:px vb.>
Sözcük aralığı
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
135
Letter
Spacing
normal |
<boyut:px vb.>
Harf aralığı
Text
Decoration
None | underline |
overline | line-through | blink
Metin süsleme
Vertical
Alignment
baseline | sub |
super | top | text-top | middle |
bottom | text-bottom |
Yüzde:200% vb.
Dikey hizalama
Text Transfor
mation
none | capitalize | uppercase |
lowercase
Metin dönüĢtürme
Text
Alignment
Left | right |
center | justify
Metin hizalama
Text
Indentation
Boyut | Yüzde Metin girintisi
Line Height
Normal | <sayı> | <boyut> |
<yüzde>
Satır yüksekliği
RENK VE ARKAPLA
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
136
N
Color Renk adı veya RGB değeri (red
veya #FF0000 gibi)
Renk
Backgrou
nd Color
Renk adı | RGB
değeri (red veya #FF0000 gibi) |
transparent
Arka plan rengi
Backgrou
nd Image
url(images/resima
di.gif)
Arka plana yerleĢtirilecek
resmin adresi
Background
Repeat
repeat | repeat-x | repeat-y | no-
repeat
Arka plan resminin hangi yönde tekrarlanacağını
belirler.
Backgrou
nd Attachme
nt
scroll | fixed Sayfa kaydırma çubuğuyla
hareket ettirildiğinde zeminin de hareket edip
etmeyeceğini belirler.
Background
Position
yüzde | boyut | top | center |
bottom| left | center | right
Zemindeki resmin sayfa üzerinde istenilen yere
yerleĢtirilmesini sağlar.
KUTU ÖZELLĠK
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
137
LERĠ
Magrin Sayısal değer. Nesnenin dıĢındaki nesnelere
olan aralığını belirler.
Padding Sayısal değer. Doldurma
Border Width
Sayısal değer. Kenarlık geniĢliği (kalınlığı)
Border Color
Renk adı | RGB değeri
Kenarlık rengi
Border
Style
none | dotted |
dashed | solid | double
| groove | ridge | inset | outset
Kenarlık stili
Border border-width |
border-style | border-color
Kenarlık kalınlık, style ve
rengi.
Width boyut | yüzde | auto
GeniĢlik
Height boyut | auto Yükseklik
LĠSTE
ÖZELLĠKLERĠ
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
138
List Style
Type
disc | circle |
square | decimal | lower-roman |
upper-roman | lower-alpha |
upper-alpha | none
Listenin harflerden mi yoksa
sayılardan mı oluĢacağını belirler.
List Style
Image
adres | none (list-
style-image: url(images/maddei
mi.gif) gibi.)
Liste simgesi olarak resim
kullanılmasını sağlar.
List Style
Position
inside | outside Listenin ilk satırının diğer
satırlar aynı hizada olup olmayacağını belirler.
List Style list-style-type |
list-style-position| adres (list-style:
lower-roman inside gibi.)
disc (Liste biçiminin disk
(içi dolu daire) Ģeklinde olmasını sağlar.)
circle (Liste biçiminin çember Ģeklinde olmasını
sağlar.)
square (Liste biçiminin
kare olmasını sağlar.)
decimal (Liste biçiminin
rakamlardan oluĢmasını sağlar.)
lower-roman (Liste
biçiminin i,ii,iii gibi küçük
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
139
roma rakamlarından
oluĢmasını sağlar.)
upper-roman (Liste
biçiminin I,II,II gibi büyük roma
rakamlarından oluĢmasını sağlar.)
lower-alpha (Liste biçiminin a,b,c Ģeklinde
küçük harf olmasını sağlar.)
upper-alpha (Liste
biçiminin A,B,C Ģeklinde büyük harf olmasını
sağlar.)
none (Listenin simgesiz
olmasını sağlar.)
Font Özellikleri Ġçin CSS Kullanımı:
FONT-FAMILY (Yazıtipi ailesi):
Ģeklinde kullanılan bu etiketle, uyguladığınız stilin font ailesini seçebilirsiniz. Ġfadenin karĢısına font ailesinin
adını yazabileceğiniz gibi, ―serif‖ (ör. Times), ―sans-serif‖ (ör. Arial), ―cursive‖ (ör. Zapf-Chancery), ―fantasy‖ (ör.
Western), ―monospace‖ (ör. Courier) de yazabilirsiniz.
Bu satırda birden fazla font adı aralarına virgül koyarak yazılabilir. Ġyi bir uygulama, önce tercih ettiğiniz belirli
bir fontun, ardından bu font ailesinin adını ve nihayet
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
140
türü yazmaktır. Çünkü seçtiğiniz font kullanıcının
bilgisayarında mevcut olmayabilir.
Örnek:
P { FONT-FAMILY: "New Century School Book", Times,
serif }
P { FONT-FAMILY: "Arial Black", Helvetica, sans-serif }
FONT-STYLE(Yazılış Şekli):
Bu etiketle harfin normal, italik veya yatık olmasını
sağlayabilirsiniz. (Ġtalik harflerin mutlaka öne yatık olması gerekmez! Ama çoğu italik harf, öne yatıktır.)
Örnek:
H1 { FONT-STYLE: normal }
H2 { FONT-STYLE: italic }
H3 { FONT-STYLE: oblique }
FONT-VARIANT (Yazıtipi türü):
Bu etiketle harfin normal veya küçük harf boyunda ama büyük harf biçiminde olması sağlanabilir:
H1 { FONT-VARIANT: normal }
H2 { FONT-VARIANT: small-caps }
FONT-WEIGHT (Yazıtipi Koyuluğu):
Bu etiketle, fontun normal, siyah, koyu, daha koyu, daha
açık olması sağlanabilir. Verilebilecek değerler, ―normal,‖ ―bold,‖ ―bolder,‖ ―lighter‖ olabileceği gibi, 100, 200, 300,
400, 500, 600, 700, 800 veya 900 olabilir. Burada 100-
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
141
300 ince çizgili harf, 400-500 kalın çizgili harf, 600-900
çok kalın çizgili harf sayılır.
Örnek:
H1 { FONT-WEIGHT: normal }
H2 { FONT-WEIGHT: bold }
FONT-SIZE (Yazıtipi boyutu):
Bu etiketle, fontun büyüklüğünü belirleyebilirsiniz. Bu,
mutlak veya göreli olabilir. Mutlak büyüklük ya punto, santimetre veya inç cinsinden belirli bir rakam (ör. 12
pt, 1cm) veya en küçükten en büyüğe doğru olmak üzere, ―xx-small,‖ ―x-small,‖ ―small,‖ ―medium,‖ ―large,‖
―x-large,‖ ―xx-large‖ olabilir. Göreli büyüklükler ise bir önceki fonta göre daha büyük anlamına ―larger‖ veya
daha küçük anlamına ―smaller‖ olabileceği gibi, bir önceki harf büyüklüğünün yüzdesi olarak verilebilir.
Tarayıcı farklarını düĢünecek olursak en uygun seçenek
punto kullanmaktır Örnek:
H1 { FONT-SIZE: 12pt }
H2 { FONT-SIZE: 90% }
(Yüzde iĢaretinin rakamın önünde değil, arkasında
olduğuna dikkat ediniz.)
Yazıtipi : “FONT:” Ģeklindeki bu parametre ile bir çok
font özelliği birden verilebilir. Bu ifadenin karĢısına harf stili, türü, ağırlığı, ölçüsü ve ailesi ile bu harfin
kullanıldığı satırın satır yüksekliği toplu olarak belirtilebilir. Örnek:
P { FONT: italic bold 12pt/14pt Times, serif }
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
142
Renk ve Zemin Özellikleri:
Renk: “COLOR:” Ģeklindeki bu parametre ile herhangi
bir içeriğin renk özelliğini belirleyebilirsiniz. Renk adları veya kodlarını daha önce ele almıĢtık. Örnek:
H1 { COLOR: blue }
H2 { COLOR: #000080 }
Zemin Rengi: “BACKGROUND-COLOR:” Ģeklindeki bu parametre ile herhangi bir içeriğin arkasındaki zemin
rengini belirleyebilirsiniz. Etiketin rengi ile zemin renginin farkını görebilmek için daima COLOR yükleminden sonra
kullanılması iyi bir 180 152 24 80 uygulama olur. Örnek:
H1 { BACKGROUND-COLOR: blue }
Zemin grafiği: “BACKGROUND-IMAGE:” Ģeklindeki bu
parametre ile herhangi bir içeriğin arkasındaki zemine koymak istediğiniz görüntüyü belirleyebilirsiniz. Ġçeriğin
kendi zemin rengi ile zemine konacak görüntünün birbirini örtmemesi (Perde gibi) için ardarda kullanılması
doğru olur. Zemin görüntüsünün yerini belirtmek için
―url...‖ ifadesi kullanılır. AĢadaki örneklere bakalım:
H1 { BACKGROUND-IMAGE: url(/images/zemin1.gif }
P { BACKGROUND-IMAGE: url(http://www.abc.com/zemin1.gif }
BODY { BACKGROUND: white url(/images/zemin1.gif }
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
143
P { BACKGROUND: black url(/images/zemin1.gif no-
repeat bottom right}
Pozisyon değerleri, üstte solda (left top), üstte ortada (top center), üstte sağda (top right) olabileceği gibi,
ortada ortalanmıĢ (center center), ortada sağda (center right) veya ortada solda (center left), ya da altta solda
(bottom left), altta ortada (bottom center) ve altta sağda (bottom right) olabilir.
Metin Özellikleri:
Kelime aralıkları: “WORD-SPACING:” parametresi ile kelimelerinin arasına konulmasını istediğiniz ilave
boĢlukları belirtebilirsiniz. Burada kullanılan ölçü kullanılan fontun en geniĢ harfi olan ―m‖ harfinin ondalık
bölümüdür.
Örnek:
P { WORD-SPACING: normal }
H1 { WORD-SPACING: 0.2em }
H2 { WORD-SPACING: -0.4em }
Harf aralıkları: “LETTER-SPACING:” parametresi ile
harflerin arasına konulmasını istediğiniz ilave boĢlukları belirtebilirsiniz. Burada kullanılan ölçü de ―m‖ harfinin
ondalık bölümüdür. Örnek:
P { LETTER-SPACING: normal }
H1 { LETTER-SPACING: 0.2em }
H2 { LETTER-SPACING: -0.3EM }
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
144
Metin süsleme: “TEXT-DECORATION” parametresi ile
bir metnin altını çizdirebilir (underline), üstünü çizdirebilir (overline), veya ortasına çizgi
koydurabilirsiniz (line-through), veya bir görünüp, bir kaybolmasını sağlayabilirsiniz (blink). Bunu, altı normal
olarak çizilen A (Anchor) etiketiyle verdiğiniz bağlantı kelimelerinin altının çizilmemesi için de kullanabilirsiniz.
Örnek:
H3 { TEXT-DECORATION: blink }
A:link, A:visited, A:active { TEXT-DECORATION: none }
Metnin bloklanması: TEXT-ALIGN parametresi ile ile
bir metni sağa (right), sola (left) veya ortaya (center) bloklayabilirsiniz. Örnek:
H3 { TEXT-ALIGN: left }
H1 { TEXT-ALIGN: center }
Birinci satırın içerden başlaması: “TEXT-INDENT”
parametresi ile ile bir metnin birinci satırını vereceğiniz ölçüde içerden baĢlatabilirsiniz. Örnek:
H3 { TEXT-INDENT: 1cm }
Satır Yüksekliği: “LINE-HEIGHT” parametresi ile bir
metnin satırları arasına konacak boĢluğu vereceğiniz
yüzde ölçüsü ile normal satır yüksekliğine göre belirleyebilirsiniz. Örnek:
H3 { LINE-HEIGHT: 200% }
H1 { LINE-HEIGHT: 350% }
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
145
(Bu ölçü yüzde 100‘ün altına düĢerse, satırlar birbirinin
üzerine bineceği için okunamaz hale gelir.)
İlk Harf Büyütme : “First-Letter”
Gazete ve dergi yazılarında bazı paragrafların ilk harfi, diğer harflerden çok büyük ve aĢağı doğru iki, hatta üç
satır yüksekliğinde olur. Gazetecilik dilinde buna Gömme Harf denir. Yazılı basının favori masaüstü yayıncılık
programı QuarkExpress'te bile bunu otomatik yapmak için programın beĢinci sürümü beklenmiĢtir. Ġlk HTML
sürümlerinde bu olay olmadığından bu iĢlem hep <FONT> etiketleri ile yapılırdı. ġimdi ise bu parametre ile
yapmak mümkündür.
P.first-letter {font-size: 200%;}
Büyüte oranı tamamen kodlayan kiĢiye bağlıdır. Ġlk harfi
yüzde 200 yerine yüzde 400 de büyütmek mümkündür.
Bunu kod içinde kullanırken ise
<p>Bu paragraf deneme paragrafıdır. Bu paragraf
deneme paragrafıdır. Bu paragraf deneme paragrafıdır. Bu paragraf deneme paragrafıdır. Bu paragraf deneme
paragrafıdır. Bu paragraf deneme paragrafıdır. </p>
Konum (Pozisyon) Özellikleri
CSS kurallarının içinde yer almakla birlikte HTML
içeriklerinin tarayıcının ekranında, yerleĢtirileceği pozisyonu ve ilk konumun daha sonraki değiĢme tarzını
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
146
belirleyen parametreler, son zamanlarda CSS-P
(Cascading Style Sheets-Positioning) Ģeklinde anılmaya baĢladı. Gerçekten pozisyon iĢlemi CSS içinde önemli bir
yere sahiptir ve dikkatlice incelenmelidir.
Konum “POSITION:” Değerleri
Position parametresi ile belirlenen konum,
sabit (static)
mutlak (absolute)
göreli (relative)
değerlerini alabilir.
Mutlak (absolute) konum verilmiĢ bir içerik (paragraf, resim, tablo), HTML‘in diğer içeriği nedeniyle asla yer
değiĢtirmez; kendisine verilen üst (top) ve sol (left) değerlere göre mutlak bir yerde kalır. Buradaki ölçü pixel
cinsindendin ve tarayıcının HTML sayfasını gösterdiği alanın sol üst köĢesi 0-0 kabul edilerek verilir. Örneğin
―top: 20 px; left: 20px‖ Ģeklindeki bir ölçü, bu içeriğin tarayıcının penceresinde sol üst köĢesinden 20 pixel
aĢağı ve sol kenarından 20 pixel sağa doğru yerleĢmesini sağlar.
Sabit (Static) konum, yeri belirlenmek istenen içeriğin, HTML‘in diğer içeriğine göre, nereye geliyorsa, oraya
yerleĢmesini sağlar. Bir anlamda bu içeriğin durumu diğer içeriğe bağlıdır.
Göreli (Relative) konum ise verilecek ölçülere göre
belirlenecek yer, bir önceki içeriğin konumunun bittiği yerden itibaren hesaplanır. Örnek:
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
147
<SPAN STYLE="position:static; background-
color:#000000">Siyah. Konum: sabit</SPAN>
<DIV STYLE="position:absolute; top:40px; left:40px;
background-color:#cccccc">Gri. Konumu: mutlak[Absolute], sol kenarı 40 Pixel santim
içerden.</SPAN>
Görünürlük: “Visibility”
―VISIBILITY:‖ parametresi ile, biçimlendirilen içeriğin ekranda görünmesi yada gizlenmesi sağlanabilir. Ġçerik
gizlenmiĢ (hidden), veya görünür (visible) olabilir. Eğer istenirse (inherit) parametresi ile görünürlük değeri
içinde bulunduğu nesneden miras yolu ile alınmasıda sağlanabilir. Yani ata olan içerik görünüyorsa içinde yer
alan bu kısımda da görünür, aksi takdirde görünmez. Örnek
<div id="kanal01" style="position:absolute; left:10px; top:10x; width:200px; height:200px; z-index:1;
visibility: visible; background-color: #cccccc">Bu içerik Mutlak konuma sahiptir, zemini siyahtır. Div adı kanal01
olan bu alan her koĢuldagrünür </div>
CSS ve Katman (Layer) Kavramı
Photoshop ve Gimp tarzı programları kullananlar bu kavrama yabancı değildirler ancak burada katmanın ne
olduğunu izah etmek gerekecek. Katman kavramını anlamak için aĢağıdaki Ģekle bakalım:
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
148
ġekilde görüleceği gibi 4. katman en üstteki kavram ve
tamamı görünmekte. Onun altındaki katman 3. katman çünkü bu katman 2 nolu katmanın bir kısmını
gizlemekte. Yani her Ģart altında 3 nolu katman 2. katmanın üstündedir. Buna göre tabiî ki 2. katman da 1.
katmanın üzerindedir.
Normal Ģartlarda web sayfalarında içerik yan yana
gelecektir. Dolayısıyla katmana ihtiyaç yoktur diye düĢünülebilir. Ama CSS ve DIV etiketleri için durum
bundan ibaret değildir. DIV ile tanımlanan alanlara boyut vermek mümkün olduğundan bu alanların üst üste
gelmesi de pekala mümkündür. Bunu Ģözmek içinse CSS içinde katman indeksi denilen z-index paraetresi
kullanılır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
149
Katman Ġndeksi – (Z-index):
―Z-INDEX:‖ parametresi, bir içeriğin tarayıcı tarafından
hangi katmanda gösterileceğinin belirtilebilmesini sağlar. Bir sayfada, DIV veya SPAN etiketi ile oluĢturulmuĢ
nesne varsa, onların katman endeksine bakarak, hepsini belirli bir kata koyar. Yanyana gelen nesnelerin kaçıncı
katta olduğu önemli olmayabilir; ancak nesneler üst üste geliyorlarsa, hangisinin hangi altta, hangisinin ortada,
hangisinin üstte duracağı önem taĢıyabilir. Verilecek değer 1, 2, 3 Ģeklinde bir sıra numarasıdır. 1, en alttaki
katmandır; diğerleri sırayla onun üzerindeki katları gösterir. Örnek
<div id="kanal01" style="position:absolute; left:10px; top:10x; width:200px; height:200px; z-index:1; visibility: visible; background-color: #cccccc">Gri
çerçeveli yazi..</div>
<div id="kanal02" style="position:absolute; left:20px;
top:30px; width:220px; height:220px; z-index:2;
background-color: #000000">Siyah Renkli yazi </div>
Konum belirleyen parametreler arasında eni boyu belirlenmiĢ bir nesneye koyduğunuz metnin taĢması
halinde taĢan yazının gösterilip gösterilmeyeceği, veya bir nesnenin içine konulan içeriğin hangi bölümlerinin
gösterilip, hangi bölümlerinin kesileceğini belirleyen diğer iki kontrol parametresi daha vardır. Bunların tarayıcı
yorumları sürümden sürüme değiĢmektedir.
Position: Katmanın yerinin neye göre belirleneceğini (absolute, relative) pencere esas alınarak belirlensin
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
150
Top: Pencereye göre kaç piksel aĢağıda olacağını,
Left: Pencereye göre kaç piksel solda olacağını,
Width: Katmanın geniĢliğini,
Height: Katmanın yüksekliğini,
Background-color: Arkaplan rengini,
Overflow: TaĢan metnin durumunun ne olacağını (hidden, gizli kalsın, gösterilmesin),
Z-index: Üstüste geldiğinde hangi sıra ile yerleĢtirileceğini (1. katmana 1 değeri verilmiĢtir,
dolayısıyla en altta o gösterilecektir),
Padding: Katmanın kenar çizgileri ile içindeki nesneler
arasında bırakılacak boĢluğu,
Border: Kenar çizgilerinin kalınlık, kenarlık türü ve
rengini belirtmektedir.
Boşluk bırakma, Margin :
Ġ.eriğin dört bir yanında bırakılacak boĢluk miktarları
toplu olarak yada üstünde (MARGIN-TOP), sağında (MARGIN-RIGHT), solunda (MARGIN-LEFT) ve altında
(MARGIN-BOTTOM) olacak Ģekilde ayrı ayrı belirtilebilir. Tanım tek bir defada yapılacak ise parametrelerin iĢleniĢ
sırası üst, sağ, sol, ve alt olarak okunacaktır. Örnek:
P { MARGIN-TOP: 10px }
P { MARGIN-RIGHT: 20px }
P { MARGIN-LEFT: 20px }
P { MARGIN-BOTTOM: 10px }
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
151
P { MARGIN: 10px 20px 20px 10px}
Bir etiketin içinde yer alabilecek ―<!—― ve ―-->‖ Ģeklindeki etiketler HTML dilinin yorum etiketleridir; bu
etiketlerin arasındaki Ģeyler, tarayıcılar tarafından
dikkate alınmaz.
Xhtml BELGE TÜRÜ
XHTML aslında bir HTML kodlama standardıdır. <html>
etiketinden önce belge tipi, DOCTYPE ifadesi ile belirlenebilir. XHTML'de üç tip belge türü seçeneği vardır.
Bunlar Transitional (GeçiĢli), Strict (Katı), Frameset (Çerçeve Kümeleri) 'dir.
Transitional (Geçişli): Bu belge türü standart HTML üzerine kurulmuĢ olup artık geçerli olmayan
HTML etiketleri ile de uyumludur. Genelde kullanılan belge türüdür. Belgeye <html>
etiketinden önce aĢağıdaki kod eklenir. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML
4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
Strict (Katı) : Uygunluğu kabul edilmemiĢ etiketleri kabul etmeyen bir belge türüdür. Belgeye
<html> etiketinden önce aĢağıdaki kod eklenir. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML
4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
152
Frameset (Çerçeve Kümeleri) : Bu belge tipi
sayfada çerçeve kullanımına izin verir. Çerçeveler fazla kullanıĢlı olmadıkları için tavsiye edilmezler.
Belgeye <html> etiketinden önce aĢağıdaki kod eklenir.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
"http://www.w3.org/TR/html4/frameset.dtd">
Bir editör kullanırken editörün kodu renkledirme yapabilmesinin yanında XHTM etiketini gördüğü anda
renklendirme Ģemasınıda buna uygun değiĢtirebilmesine dikkat etmek gerekir.
Sonuç
ġu ana kadar genel olarak statik HTML yapımı ile
etiketleri görmüĢ olduk. Her ne kadar burada adı geçmeyen bazı etiketler olsada en genel olanlar burada
ele alınmıĢtır. Üstelik hiç etiket bilmeden Frontpage ile sayfa yapan birisi ele alındığında siz en azından iĢin geri
planı hakkında fikir sahibi oldunuz ve bir avantaj elde ettiniz. Üstelik bir çok iĢyerinde iĢe alırken aday
kiĢilerden sadece notepad kullanarak tasarım yapmaları
beklendiği bilinmektedir. Etiketleri biliyor olmasaysınızz bunu nasıl yapacaktınız ? ġu anda belki size az gelebilir
ama rahatlıkla normal görünümlü bir sitesi tasarlayabilecek kadar bilgi edinmiĢ durumdasınız…
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
153
Altın Öğütler
Hosting Hizmeti Alırken
1. ġirket ne kadar güvenilir. Referansları ne durumda
kontrol edilmelidir.
2. Host referans sitelerinden Ģirket hakkındaki olumlu-yada olumsuz bilgiler kontrol edilmelidir.
3. ġirketin UP-time vaadi kontrol edilmelidir. %100 up time oranını kimse sağlayamaz ama ne kadar
yüksekse o kadar iyidir.
4. Ġhtiyacınız olan hizmete iyi karar vermeliniz.
Örneğin sadece Ģiirlerini yaınlayacağınız bir site için IIS üzerinde hizmet veren bir paket daha pahalı
olacaktır. Oysa Linux+Apache ikili ile çok daha ucuz bir çözüm bulabilirsiniz.
5. ġirketlerin hizmet paketlerini detaylıca karĢılaĢtırın. Paketlerde kaç Mb alan verileceği, ne kadar Bant
GeniĢliği tanındığını, Veritabanı dahil olup olmadığını, ilave mail hesabı verip verilmediğini
kontrol etmelisiniz.
6. Kontrol panelinin ne olduğu da önemlidir. Genel itibari hepsi kolay kullanımlıdır ama bazı paneller
site sahipleri için hayatı inanılmaz derecede kolaylaĢtırırlar.
Web Sitesi Yaparken
1. Öncelik içeriktir. ġekil sonra gelir. Ġçerik olduktan sonra Ģekil nasıl olsa çözülür.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
154
2. Sade olun. Abartıdan kaçının. Bir arap Ģairin dediği
gibi bir ağaçta ne kadar çok yaprak varsa o kadar az meyve olur.
3. Gereksiz resim, hareketli gif, animasyon ve film dosyalarından kaçının. Kullanıcılar anlamsız bir
resim için sayfanızın geciken yüklemesini beklemek zorunda değildirler.
4. Kullanıcılar sayfaya ne için geldilerse onu en kısa yoldan bulsunlar. Kimseyi oradan oraya linklerle
süründürmeyin.
5. Sayfanızda meta tag kullanımına özen gösterin ki
arama motorlarındaki aramalarda müstakbel ziyaretçilerin sizden haberi olsun.
6. Renk uyumuna dikkat edin. Erkek Giyim mağazasına Pembe, Genç kızlar için Fan sitesine
Gece mavisi renk uymaz. Renk kontratsıda önemli
bir konudur.
7. Siteniz genel bir Ģablonu takip etsin ve
biçimlendirmeler genel itibarı ile aynı olsun.
Site Tasarımı Adımları
1. Siteyi oluĢturmaya önce kağıt üzerinde baĢlayın.
Tasarım olmadan iĢleme baĢlarsanız o kadar çok baĢa dönersiniz ki siz bile ĢaĢarsınız.
2. Sitenin nasıl görüneceğini anahat olarak belirledikten sonra kullanacağınız teknikleri
belirleyin. Site grafik ağırlıklı mı olacak yoksa FLASH mı kullanılacak, içerik yönetim sistemi
kullanılacak mı.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
155
3. Bu iĢ için uygun donanım ve yazılıma sahip olup
olmadığınızı kontrol edin
4. Yapacağız site tasarımlarını test etmek için
sisteminize birkaç ayrı web tarayıcısı kurun. Benim kiĢisel tercihim Internet Explorer, Firefox ve Opera
ilk anda yeterlidir. (IE için 5.5,6 ve 7 sürümleri arasında dağlar kadar fark olduğunu unutmamakta
fayda var)
5. ĠĢ için gerekeceğini düĢündüğünüz Javascript
dosyalarını elinizin altında bulundurun eğer yoksa bulmak için Open source arĢivlerden tarama yapın.
6. Sitenin ana teması tablo yada CSS olarak kodlayın
7. Sitede kullanılacak resimleri ve yazı stillerini
belirleyin
8. Site kodlarınızı oluĢturun.
9. Sitenizi test edin.
Diğer tarayıcılarda nasıl görünüyor
Stillerde düzeltilmesi gereken yerler varmı
DeğiĢik ekran çözünürlüklerinde nasıl görünüyor
Baskı önizleme yaptığınızda kağıt üstündeki hali
normalmi
Dikkatten kaçan bir nokta varmı
Yazım hataları varmı
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
156
Bir Site Tasarlarken
Çok kolay gibi görünür ancak web tasarımı çok zor bir
konudur. KarĢınızdaki insanın ne istediğini anlamadan ona istediğinizi kabul ettirebileceğiniz bir dönemde de
değiliz. O yüzden öncelikle site sahibinin ne istediğini dinlemek, sitede yer verilecek konuyu anlamak gerekir.
Bu aĢamada site sahibinin zevklerini, site Ģirket içinse
kurumsal renklerini, iĢ ile ilgili birkaç bilgiyi edinmek, aynı iĢi yapan Ģirketlere ait siteleri inceleyip bilgi sahibi
olmak karĢı tarafta iĢinin ehliyle çalıĢıyor olduğu izlenimi uyandırır.
Daha sonra kağıt üzerinde sitenin genel görümü çizilmeli ve site sahibinin bu konudaki fikri alınmalıdır. Bu, birinci
sayfadan sonuncuya kadar, sitenizdeki tüm sayfaların ekran görüntüsünü kağıt üzerinde resmetmek demektir.
(Bu her zaman gerekmez. Çünkü müĢteri genel görünüme karar verip bilgilerin bu temaya uygun
yerleĢtirilmesi yeterlidir diyebilir)
Sitede kullanılacak tekniklerin belirlenmesi de önemlidir.
Flash animasyon olacak mı olmayacak mı gibi. Ayrıca bazı durumlarda bazı hazır içerik yönetim sitemlerinin
kullanımıda düĢünülebilir. Sitede dinamik bir dil
kullanılacaksa hangi dilin kullanılacağı veri duyarlı olacaksa hangi veritabanının kullanılacağının bilinmesi
önemlidir.
Sitenin oluĢturulması için gerekli grafik programları,
HTML editörü, site yönetim programı, kelime-iĢlem programı, geliĢtirme sürecinde kullanılacak lokal bir web
sunucu tasarımcının kullandığı bilgisayarda yüklü
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
157
olmalıdır. Tabii birde tasarımcı bunları çalıĢtıracak uygun
bir bilgisayara sahip olmalıdır.
Tabii burada Ģu da unutulmamalıdır. Web sitesi yapmak
için illa 1000 $ verip Photoshop, 500 $ verip Dreamweaver almaya gerek yoktur. Bunların daha ucuz
alternatifleri olduğu gibi Open source programlarda mevcuttur. Önerim Gimp, Nvu, Open Lazslo, Notepad++,
Pogrammers Editor gibi programların indirilip denenmesidir. Ben Ģu ana kadar Gimp kullandım ve
tıkandığını hatırlamıyorum.
Normal bir web kullanıcısı için bir tarayıcı yeterlidir ama
tasarımcı için değil. Çünkü tasarımcı, yaptığı tasarımın en azından en popüler tarayıcılarda düzgün göründüğünden
emin olmalıdır.
Site tasarımı yapan bir kiĢi internette gezerken gördüğü
güzel tasarım stillerini, menü stillerini, javascriptleri ve
geliĢmiĢ teknikleri bir köĢede tasnifleyerek tutmak gibi bir özlliğe sahip olmalıdır. Bunu söylerken kesinlikle
baĢkalarına ait bir Ģeyin aynen alıp kullanılması değil, nasıl yapıldığının öğrenilmesi kastedilmiĢtir. Tabii bazı
kodlar open source olduğundan aynen kullanmakta bir beis yoktur.
Kağıda çizilen temayı tablo yada CSS olarak oluĢturmakla iĢleme baĢlanır. Ġlgili linkler, grafikler vs
yerleĢtirilir ve site sahibinin genel düĢünceleri alınır. Gerekli ise değiĢiklikler yapılır ve daha sonra diğer
sayfaların kodlanmasına geçilir.
Daha sonra test aĢamasına geçilmeli ve yukarda anılan
tüm hatalar kontrol edilip gerekli düzenleler yapılmalıdır. Özellikle tarayıcı testi çok önemlidir. Çünkü müĢteri siteyi
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
158
tasarımcının bilgisayarında ayrı, kendi bilgisayarında ayrı
Ģekillerde görürse, iĢin kalitesinden Ģüphe eder. Ufak tefek farklar izah edilebilir ancak birbirine giren
katmanlar, ekranda adeta zıplayan menü CSS menüleri (benim baĢıma geldi site 7 sürümünde normaldi ancak IE
6 kullanan biri tam o anda denk gelip sitenin karizmasını bozmuĢtu) izah edilemez.
Sitede kullanılan dosyaların isimlerini, klasörleri vs kontrol edip hepsini aynı notasona getirmekte fayda
vardır. Genel olarak tüm web sitelerinde tüm dosya isimleri küçük harf kullanılırlar. Çünkü hosting iĢleminin
olacağı sistemde Windows mu Linux mu kurulu olmasına göre bu isimlerin durumu önem kazanır.
Bu aĢamada hosting için uygun yer belirlenir ve gerekli FTP ayarları yapılıp site web üzerine kopyalanır. Site son
bir kez kontrol edilip, telim edilir.
Bir Web Sitesinin Tutulmasını Sağlayan Etkenler
Internette tek tıklama uzağımızda miyonlarca ve hatta
milyarlarca site varken neden sadece bazıları çok büyük hit sayılarına ulaĢırken bazıları unutulup gider diye
düĢündünüzmü ? Örneğin bir zamanların gözde arama motoru www.excite.com nerdeyse adı bile unutulmuĢ
durumda, ilk arama motoru www.yahoo.com aĢırı kan kaybına devam edip durmakta.
Yine aynı Ģekilde nerdeyse unutulan Altavista motorunun araĢtırma ekibi lideri, Google‘ın yerinde bir olabilrdik
derken, bir gerçeği ifade etmektedir. Ġfadesine göre
arama motoruna gömülü reklam fikri çok daha
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
159
öncesinde onların gündemine zaten gelmiĢ ancak,
―kullanıcılar bundan hoĢlanmaz‖ diye Ģanslarını denemedikleri için Ģans kapıyı iki kere çalmamıĢ ve
altavista eski teknolojili bir arama motoru olarak kalmaya devam etmiĢ. Bu gün itibariyle söyledikleri ise
―en iyi teknolojiye ahip olmak yetmez, bunu uygun giriĢimlerlede desteklemelisiniz.‖
Bunlar olurken nasıl olupta birkaç yıllık www.google.com inanılmaz karlara, eriĢim rekorlarına sahip olmaktadır.
Öyle ki ABD baĢkan yardımcı ―dünyanın yuvarlar olduğuna artık inandım‖ dedikten sonra kendisine
yöneltilen ―nasıl‖ sorusuna ―Google sayesinde‖ demekte. Internette arama anlamına gelen ―Googling‖ kelimesi
nerdeyse sözlüklere girmek üzere. Peki bunlar nasıl oluyor…
Bu olayı 5 ana baĢlıkta incelemek mümkün
1. Tanıtım
2. Kullanıcı dostu tasarım
3. EriĢilebilirlik
4. Kaliteli içerik
5. Geri Besleme
Bu baĢlıkları biraz açarak inceleyelim
Tanıtım
Günümüzde web ortamına hergün milyonlarca sayfa, binlerce site katılmaktadır. Durum bu iken insanların
sitenizi ziyaret etmesi için haliyle iyi bir sebepleri olmalıdır. Sebep olsa bile en basitinden insanların
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
160
bundan haberi olması için Google robotlarının sayfanıza
uğraması gerekmektedir. Bunu çabuklaĢtırmal ve sürekli kılmak için bütçeniz uygun ise web sitelerine ve arama
motorlarına reklam verebilrsiniz. Google reklam veren siteleri aramalarda en üst sıralarda göstermektedir.
Ayrıca kardeĢ site dediğimiz siteler edinmeli, onlara link vermeli ve onlarında size link vermelerini sağlamalısınız.
Örneğin Google indekslerini oluĢtururken diğer sitelerden sizin sitenize belirli bir sayıda bağlantı erilmemiĢse sizin
sitenizi ciddi anlamda bir referans olarak kabul etmemektedir. Tanıtım bu yüzden önemli bir adımdır.
Kullanıcı Dostu Tasarım
Bir sitede içerikten sonra en önemli Ģey görünümdür.
Görünüm kötü ise içerik iyi bile olsa kullanıcı sitenize bir daha zor gelecektir. Sitede gerektiği kadar resim vs
kullanılmalı, siteniz hızlı yüklenmelidir. Ġçeriği kolay anlaĢılır Ģekilde dizayn etmelisiniz. Bir sayfadan diğerine
geçerken sitenizin tüm sayfa yapısı değiĢiyorsa kullanıcı takipte zorlanmaya baĢlar.
EriĢilebilirlik
Google yada baĢka bir arama motorunun altında ―bu site en iyi x tarayıcı ile çalıĢır‖ diye bir ifade gören birisi
olmuĢmudur acaba. Ben göremedim ve göreceğimide hiç
sanmıyorum. O halde site içeriği ve görünümü nasıl olursa olsun her Ģekilde siteniz ortalama bir görüntü
kalitesi yakalamalıdır. Ziyaretçiler sitenize hangi tarayıcı ile bakarsa baksın içeriğinizi doğru Ģekilde
görüntüleyebilmelidir. Site tasarlanırken sadece tek bir tarayıcıda çalıĢan etiketlerden kaçınılmalıdır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
161
Kaliteli Ġçerik
Örneğin tarih konulu bir siteniz var ve Ankara SavaĢı
hakkında araĢtırma yapan birisi sitenize girdiğinde sadece ―Ankara SavaĢı sonucu Fetret devrine girildi‖
bilgisini buluyorsa içerikle ilgili sorununuz var demektir. Kullanıcılar en çok arama sitelerini kullanırlar ve buradan
sitelere bakmaya baĢlarlar. Kalite içeriğiniz yok ise kimse sitenize link vermez. Yeterince link alamazsanız, google
ve diğer arama motorları sizi alt sıralara atarlar. Kullanıcıyı mümkün mertebe sitenizde tutmanız gerekir.
Örneğin bu sayfanın yanında ―KurtuluĢ SavaĢı, Preveze Deniz SavaĢı‖ gibi linkler olur ise ziyaretçiniz belki bu
linklerede tıklayacaktır.
Geri Besleme
Sitenizin tasarımı ve içeriği size tamamen doyurucu gelebilir ancak kullanıcıların hataları, isteklerini ve
önerilerini size bildirebilmeleri için geri besleme olanağı sunmalısınız. Örneğin Tuncay ġanlı için bir fan sitesi
hazırlıyorsunuz. Ġçerik sizce gayet yeterli ama bir kullanısınız, bir maç sonrası ilgili Ģahsın UEFA‘da haftanın
golcüsü seçildiğini ama bunun sizin içerikte olmadığını fark etti. Kullanıcı bunu size bildirebilmeli ve sizde bunu
en kısa sürede düzeltebilmelisiniz. Böylece hem içerik
güzelleĢir, çoğalır, hemde kullanıcı kendisi ile site arasında bir bağ kurar. Çünkü site sahibi ona değer
vermiĢ ve önerisini hemen yerine getirmiĢtir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
162
Php Programlama Dili
Php Dilinin GeçmiĢi
Rasmus Lerdorf, adlı genç bir mezun iĢ aradığını
belirtmek üzere sitesinde özgeçmiĢini yayınlıyordu. Bu
amaçla site yapmak üzere bir program geliĢtirdi. Yazdığı program çoğunlukla PERL dilinden alınmıĢ yordamları
kapsıyordu. Buna PHP (Personal Home Page Tool) adını verdi.
PHP adlı bu programın (KiĢisel Ana Sayfa) çok tutulması üzerine Rasmus, bu programa, form yoluyla ziyaretçiden
gelen bilgileri iĢlemeyi sağlayan komut setlerinide ekledi ve programın adı PHP/FI (Form Interpreter/Form
Yorumlayıcı) oldu. Kimileri programın bu sürümüne PHP2 dedi; ve bu ad, programın çok değiĢmesine ve
geliĢmesine rağmen uzun süre değiĢmeden kaldı.
Rasmus Lerdorf, 1995 ortalarında, Zeev Suraski, Stig
Bakken, Shane Caraveo ve Jim Winstead ‗inde katıldığı bir grup ile PHP dilini yeniden tasarlayarak, Perl'den
ödünç alma rutinlerle iĢ yapan bir paket yerine, Nesne-
Yönelimli (Object-Oriented Programming) bir programlama dili haline getirdi. PHP dili 3 sürümüne
geldiğinde bu defa geniĢletibilir yani extensible bir dil oldu. Ayrıca sınırlı da olsa nesneye yönelik proglamlama
desteği kazanmıĢtı. Eklenti ve nesneye yönelik destek sayesinde de önü daha da açıldı. Öyleki 18 ay önce
sadece 250.000 civarında web sunucuya yüklü olan PHP, bu süre içinde bu sayıyı 2.500.000 web sunucuya
çıkarmıĢtı.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
163
PHP 4 sürümüne geldiğinde ise çeĢitli geliĢtirmeler
resmen bariyerleri yerle bir etmiĢtir. Bunlar
Zend Engine
Sunucudan bağımsız çalıĢma
Önce derle sonra çalıĢtır mantığı ile hız kazanma
Nesneye yönelik programlama
Multithreading
Zeev ve Andi ZEND adlı Ģirketi kurup PHP dilini kurumsal ölçeğe taĢıdılar. GeliĢtilen Zend Engine ile PHP artık
referans sayma, hafıza yönetimi ve sunucudan bağımsız çalıĢma yeteneği de kazanmıĢtı. Tabi veritabanı
bağlantılarının, dosyaların, hafıza boĢluklarının bu engine ile kontrol edilebilir hale gelmeside cabası. Sunucudan
bağımsız çalıĢma derken PHP dilinin neredeyse bilinen bütün web sunucularla ortak çalıĢabilir hale gelmesi
kastedilmektedir.
Ayrıca derleyici önceki sürümlerdeki ―bir satır oku, yorumla, çalıĢtır, diğer satıra geç‖ mantığını bırakmıĢ,
önce tüm kodu okuyup, ardından derleme ve çalıĢtırma yeteneğine kavuĢmuĢtur. Buda tabiî ki çeĢitli hızlandırma
mekanizmalarınıda beraberinde getirmiĢtir. Tabiî ki bu çabalar sonuçsuz kalmamıĢ PHP bu sürümde kurulu
olduğu sunucu sayısını 9.500.000 ‗a taĢımıĢtır. En çok kullanılan Apache sunucu modülü olma özelliği uzun
zamandır PHP‘dedir.
PHP 5 sürümünde artık dilin olgunlaĢma aĢamasına
gelinmiĢtir. Çünkü önceki PHP sürümleri büyük çaplı projeler için biraz basit kalmakta idi. PHP 5, ile gelen
yenilikler ise
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
164
try/catch
XML
Mysql Improved
Sqlite
Yeni bir SOAP eklentisi
olmuĢtur. PHP, Linux gibi, Açık Sistem (Open source) kurallarına tabidir; isteyen programda istediği değiĢikliği
yapabilir; ancak bu değiĢiklikten para kazanamaz ve yaptığı değiĢiklikleri isteyen herkese açıklamak
zorundadır. Dilin resmî adı "PHP: Hypertext Preprocessor" (Hiper-metin ön-iĢleyici) olarak değiĢtirildi,
ve çeĢitli Web Server'ların PHP dili anlaması için gerekli eklentiler yeniden üretildi.
PHP arkasında ASP yada JSP gibi kurumsal bir destek olmamasına rağmen gerek performans gerek destek
açısından diğer Web yazılım geliĢtirme dilleri ile kolayca
yarıĢabilecek kapasitedir. Hemen her türlü iĢletim sistemiyle çalıĢabilir olması ve yine açık kaynak
geliĢtirilen MYSQL ile birlikte gösterdikleri ikili performans onları bir anda yazılım dünyasının gözdeleri
arasına sokmuĢtur.
Neden PHP
PHP dilinin web ortamında çok tercih ediliyor olmasının
sebepleri Ģunlardır.
Platform ÇeĢitliliği (PHP nerdeyse bütün web server
ve iĢletim sistemleri ile çalıĢbilir)
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
165
Yüksek Performans (PHP + Apache bir çok ortamda
oldukça hızlı çalıĢmaktadır)
Veritabanı Uygulamaları Ġçin Ġdeal ve Birçok VTYS
ile ÇalıĢabilme Yeteneği
Internet Standartlarına Uyum
GeniĢletilmeye Müsait Yapı (PHP komut setine eklenti yapabilme)
GeliĢmiĢ Özellikler (Oturum yönetimi, çerez kullanımı, PaylaĢımlı hafıza yönetimi
Ekonomik (Bedavadan daha ucuz bir Ģey varsa bilemeyiz)
Interaktif Web Sayfaları Hazırlamak Ġçin Yöntemler
Web sayfalarına dinanizm kazandırmanın iki yolu vardır.
Sunucu tarafındaki interaktif uygulamalar ve Kullanıcı tarafındaki interaktif uygulamalar. Kullanıcı tarafındaki
uygulamalara örnek olarak Javascript veya VBscript ile yapılan veri doğrulama iĢlemleri ve Java dilinde yazılmıĢ
appletleri sayabiliriz. Bunun avantajları;
Sunucu tarafına yük bindirmez ve veri doğrulama
gibi kullanıcı tarafında halledilebilecek iĢlemler için sunucuyu yormamıĢ olur
Bant geniĢliğini etkin kullanma Ģöyleki sayfa bu doğrulama iĢlemleri için sunucuya gidip geri
dönerken aynı zamanda internet bağlantısınıda kullanmıĢ olmaktadır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
166
Sunucu tarafında çalıĢan uygulamalarında tabiî ki
kendine göre avantajları vardır…
Web tarayıcılarında % 100 bir standart
olmadığından scritplerin her tarayıcıda çalıĢacağı garanti değildir. Örneğin Vbscript sadece Internet
Explorer ile çalıĢır.
Kullanıcı güvenlik gerekçesiyle script çalıĢtırmayı
tamamen iptal etmiĢ olabilir.
Kullanıcıda yüklü JRE sürümü alt sürüm ise bazı
appletleri çalıĢtıramayabilir.
Bazı iĢlemler mutlaka sunucu tabanlı olmak
zorundadır. Örneğin iĢletim sistemine ait bir komut karĢıda çalıĢtırılmak zorundadır. Yine aynı Ģekilde
veritabanı iĢlemleride sunucuda mantıken çalıĢmak zorundadır.
Sunucuda çalıĢan bir uygulamayı güncellemek
daha kolaydır.
Sunucuda çalıĢmakta bazen bant geniĢliğine
faydalıdır. Örneğin siz sunucuya sadece bir sorgu gönderirsiniz. Sonucu size buna uygun kayıtları
gönderir. Tüm kayıtları gönderip, kullanıcı tarafındaki bir uygulama bu süzme iĢlemini
yapacak olursa çok daha fazla bant geniĢliği kullanılır.
Günümüzde yazılım geliĢtiren kiĢilerin rotası genel olarak
istemci-sunucu modeline doğru gitmektedir. Böylece Ģirketler veri bütünlüğünü kontrol etme konusunda gücü
ellerinde tutmaktalar.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
167
PHP ve ASP KarĢılaĢtırması
ASP hakkındaki en yanlıĢ kanı ASP ‗yi bir programlama
dili sanmaktır. ASP dil değil (Active Server Pages) Aktif sunucu Sayfaları adında bir platformdur. Bu platformda
destekleyen her dille ASP platformuna yönelik kod yazılabilir. En çok kullanılanılan Vbsciript ve günümüzde
ise C# dilidir. ASP maalesef sadece Windows ile çalıĢır (bazı ticari uygulamalar ASP kodlarını baĢka
sistemlerdede çalıĢtırmaktadır). IIS web sunucusu doğal ASP desteği ile gelmektedir. Visual Basic bilen kiĢilerde
kısa sürede ASP kodu yazabilirler. Peki neden ASP ye karĢı PHP derseniz;
1. ASP COM-based architecture ile yapılmıĢtır. ASP
programcıları VBScript kullandıkları zaman aslında bir COM nesnesi çalıĢtırılır. Daha sonra tarayıcı
tarafında bir COM nesnesinin write methodu daha aktif edilir. VTYS ile iletiĢim için ayrı bir COM
nesnesi daha çalıĢtırılır. Tüm COM nesneleri üst üste biner bu da sistemin cevabını geciktirir. PHP
modullerinde ise herĢey PHP için ayrılan hafıza bölgesinde çalıĢtırılır. Farklı COM nesnelerinin
açılması ve COM nesnelerinin arasındaki dönüĢümler engellenmiĢ olur. Tek Process
üzerinden tüm iĢlemler yürütülür. Böylece PHP nin çalıĢma hızı ASP ‗den daha yüksek olur.
2. ASP de kitlenen bir uygulama web server üzerinde negatif etki yapar (ASP son sürümde bu hatayı
gidermiĢtir). PHP nin böyle bir derdi yoktur. Her
site kendi uzay alanında çalıĢır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
168
3. ASP açık olan her dosya için hafızada yer ayırır.
Gerçi ASP 5 bu sörünü çözmüĢtür ama ASP 5‘te NT 4 ile çalıĢmadığından sorunlu olan bir çok sunucu
vardır denebilir. PHP ise sadece gereken dosyaları hafızaya yükler.
4. ASP ile gelen componentler sınırlı ve yetersiz olduğundan 3. parti component desteğine ihtiyaç
vardır. ĠĢ bununla bitmez bu componente göre kod geliĢtirdiğinizde bunun sayfayı yayınladığınız web
sunucuya da kurulması gerekir.
5. ASP için için gerekli yazılımlar lisans maliyeti
getirdiğinden, PHP sitelerini yayınlamak daha ucuza gelmektedir.
6. PHP dilinde daha az komutla daha çok iĢ yapılabilmektedir. Örneğin aĢağıdaki kodlara bir
bakalım. Her ikiside bir cümledeki kelimeleri alt
alta satırlara yazmak için iĢlem yapacaktır.
<%@ Language=VBScript %>
<% Option Explicit %>
<%
Dim strcumle, arrWords, strWord
strSentence = "ASP PHP dilinden çok daha fazla komut
kullanır "
arrWords = Split(strcumle, " ", -1, 1)
For Each strWord in arrWords
Response.Write(strWord)
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
169
Response.Write("<br />")
Next
%>
ġimdi bu programın PHP dilindeki karĢılığına bakalım.
<?php
$sentence = ‗ASP PHP dilinden çok daha fazla komut
kullanır ‗;
$words = explode(' ', $sentence);
foreach ($words as $word) {
echo "$word<br />";
}
?>
PHP ve Cold Fusion KarĢılaĢtırması
Cold fusion çok üst seviye bir dil olup gerçekten iĢinin ehlidir. Programcı olmayanlar bile Cold Fusion ile yazılım
geliĢtirebilirler. Ancak yinede web de sınırlı sayıda yer bulabilmiĢtir. Çünkü Cold Fusion sunucu ve yayınlama
anlamında bırakın PHP dilini ASP sitelerden bile çok çok daha masraflıdır.
PHP Dilinin Kapasitesi
1. PHP Nesneye yönelik programlamayı destekler buna sınıf ve kalıtım özellikleride dahildir.
2. PHP çoklu kalıtımı desteklemez. Bu konuda izlediği
yol java dili gibidir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
170
3. GeliĢmiĢ kontrol blokları ve hata yönetimi desteği
vardır.
4. Operatör ve fonksiyonlar arasında Ezme
(overloading) iĢlemine destek vermez.
5. GeliĢmiĢ bir eklenti sistemi vardır. Eğer C diline
yeterince aĢna iseniz rahatlıkla sizde eklenti yazabilirsiniz.
Bunlar genel olarak PHP 5 ‗ten itibaren gelen özelliklerdir ve bazıların PHP 4 için geçeri değildir.
PHP Nasıl ÇalıĢır
PHP iki Ģekilde çalıĢtırabilir. Ya bir web sunucu üzerinde yada komut satırından komut verilerek. Birinci yöntem
çok popüler olmasına rağmen ikinci yöntem gittikçe
yayılmaktadır. Çünkü bu sayede kullanıcıya özel kod yazılması mükün olmaktadır.
Web sunucuda çalıĢma konusuna gelince, PHP, bir Script dilidir; yani kodları düz yazı dosyaları halinde kaydedilir
ve PHP kodlarının çalıĢtırılması gerektiğinde ise PHP kodlarını yürütme yeteneğine sahip bir program ile
iĢlenerek elde edilen sonuç geri gönderilir. PHP kodlarını çalıĢtırmak için web sunuculara PHP modülü kurulur. Bu
modül varsa, Web server bir php kodu istendiğinde bu PHP modulüne baĢvurur ve PHP modülü ilgili kodu
çalıĢtırıp sonucu tekrar web sunucuya geri gönderir. Web sunucu iĢlenmiĢ olan bu HTML Ģeklindeki kaynağı ise
talep etmiĢ olan tarayıcıya gönderir.
Bu Ģartlar altında kullanıcı hiçbir zaman PHP dosyasının
gerçekte ne içeriğe sahip olduğu göremez. Sadece
çalıĢma sonucu oluĢan HTML çıktısını görür.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
171
Buradan bir sonuç daha çıkıyor ki; PHP kodlarını
çalıĢtırmak için bir web tarayıcımızın olması yeterli değildir. Çünkü Web tarayıcısı sadece HTML için gerekli
olan yürütme yeteneğini barındırmaktadır. O yüzden bir web server kurulu olması ve bu web server üzerine PHP
modülünün yüklenip gerekli ayarların yapılmıĢ olması gerekir. Modül yoksa ne olur derseniz; yazdığınız kodun
orjinalini halka açmıĢ olursunuz hepsi bu.
2 HTML
4 HTML
2 PHP
6 HTML
5 HTML 4 PHP
Yukarda gördüğünüz Ģekildende anlaĢılabileceği gibi PHP sonuç olarak hep sunucu tarafında çalıĢmaktadır.
Dolayısı ile ile PHP ile tarih göstermek isterseniz eğer gördüğünüz tarih sizin bilgisayarın değil web sitenizin
bulunduğu sunucunun tarih bilgisidir. PHP bu anlamda JSP, ASP gibi dillerle aynı iĢleve sahiptir!
3 Sunucu
1 Tarayıcı
3 Sunucu
1 Tarayıcı
3 Sunucu
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
172
HTML için sadece verilerin ekranda nasıl
görüntüleneceğini gösteren biçiçlendirme dilidir demiĢtik. Dolaysıyla HTML ile web sunucusunda bir iĢlem
yaptıramayız örneğin web sunucusu'ndaki bir veritabanı dosyasını açıp, içindeki kayıtları okuyamayız, yada web
serverda bir metin dosyası oluĢturup ziyatretçilerin notlarını vs buraya kayıt edemeyiz. HTML ile Web
ziyaretçimizden bilgi toplayabilirz, bunu sunucuya gönderebiliriz ama hepsi bu. Sonuçta bu verileri iĢlemek
için bize mutlaka bu yeteneğe sahip bir program gerekir.
PHP Dili ve Veritabanı Programları ile ĠliĢkisi
Günümüzde neredeyse tüm programlama dilleri ile en çok veritabanına yönelik programlar yazılmaktadır.
Kısaca programların çoğu hep bir Ģeyleri kayıt altına almak üzere yazılmaktadır. Zaman içinde bu kayıt altına
alınan bilgilerin yönetilmesi ve hızlı iĢlenmesi bir sorun olarak ortaya çıktı ve bu defada ortaya bu verilerin
iĢlenmesi konusunda teknikler içeren DBMS olarak kısaltılmıĢ haliyle Data Base Management System
programları çıktı. Türkçe olarak VTYS yani Veri Tabanı Yönetim Sistemi ifadesi kullanılmaktadır. Veritabanı
programları kendisine gönderilen verileri istenen
ortamlarda tutar, talep edilmiĢ ise bunları aramada kolaylık sağkayacak indeks dosyalarını güncelleĢtirir,
gelen talebe göre aranan Ģartlara uygun kayıtları bulur ve telp eden programa gönderir. VTYS geliĢtiren Ģirketler
ise kendi sistemlerinin kullanımını artırmak için kendi sistemlerinin kullanımında yardımcı olmak üzere çeĢitli
sürücüleri geliĢtirip bunları yazılım dünyasına sunmaktadır. Bu bakımdan günümüzde VTYS ile iliĢki
kurmak isteyen diller sadece bu VTYS ile iletiĢim kuran
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
173
bir sürücü dosyası kullanmak durumundadır. PHP
geliĢtiricileri ise neredeyse bilinen bütün VTYS sistemleri için bu sürücülere eriĢimde kullanmak üzere bağlantı
dosyaları hazırlamıĢlardır. Örneğin MYSQL için gerekli olan LIBMYSQL.DLL dosyası (Mysql tarafından
geliĢtirilmiĢtir.) PHP ile hazır gelmektedir. PHP ise bu LIBMYSQL.DLL dosyasını kendisi için geliĢtirilmiĢ bir
bağlantı kütüphanesi ile yönetir. PHP geliĢtiricileri aĢağı yukarı bütün VTYS sistemleri için sürücüler geliĢtirmiĢtir
(Adabas, dBase, FilePro, Informix, InterBase, mSQL, Oracle, Solid, Sybase, Sqlite, Firebird ve bir çok Unix
veritabanı). PHP ayrıca, ODBC sürücüleri ile de çalıĢabilir; ve ODBC'nin okuduğu bütün veritabanlarından
veri çekebilir. (ODBC'nin Unix-Linux sürümü de vardır.)
PHP dilinin detaylarından önce PHP ile kullanılabilen
veritabanlarından üçünden bahsedelim. PHP'nin varolma
sebeplerinin baĢında, ticarî Unix veya Microsoft Windows iĢletim sistemlerinden ayrı, kar kaygısı olmayan, her
türlü platformda çalıĢabilen Script dili ile bu dille kullanılabilecek yine Açık Sistem ürünü bir VTYS aracına
sahip olmak gelir. Perl, PHP'den çok önce de bu platformda mevcuttu ama PERL VTYS yönetmekten çok
sadece metin dosyalarını okuyup ve sonucu biçimlendirerek rapor haline getirmek amacıyla
tasarlanmıĢtı. Bu bakımdan PERL veritabanına dayalı iĢlemlerde programcıya çok güçlük çıkartıyordu.
GeliĢtirilmeside sıkıntılı bir süreçti. PERL açılım olarak ―Practical Extraction and Report Language‖
kelimelerinden oluĢyor dendiği zaman zaten PERL dinin amacı ve yapmak üzere tasarlandığı Ģey kendiliğinden
ortaya çıkmıĢ olmaktadır. ASP ise sadece Windows
üzerinde çalıĢabilir olması sebebiyle hosting konusunda
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
174
masraflı bir dildi. Üstelik Open source felsefesine uygun
değildi. PHP, tasarımcılarının MySQL ve PostgreSQL teknolojilerini geliĢtiren kurum ve firmalarla yaptığı yakın
iĢbirliği sonucu ikinci sürümünden itibaren veri-yönlendirmeli (Data-Driven) Web uygulaması alanında
önemli bir araç olarak belirdi. PHP ile, Web Server'a sayfanızı Internet ziyaretçisine göndermeden önce bir
takım komutları yürütmesini, bir takım veri dosyalarını açıp içindeki kayıtları okuyup örneğin bir tablo içine
yerleĢtirmesini söyleyebiliriz.
MySQL, PostgreSQL ve SQLite ise, açık Kaynak Ģeklinde
geliĢtirilen Veri Tabanı Yönetim Sistemi – VTYS (Data Base Management System –DBMS) dediğimiz türden
programlardır. En çok bilinen VTYS programları ticari olarak Oracle, MSSQL, Informix, DB2 ve açık kaynak
tarafında ise MYSQL, PostgreSQL, Firebird ve Sqlite‘dır.
MySQL, çok-kanallı (multi-threaded), çok kullanılıcılı çalıĢabilen (multi-user), hızlı ve sağlam (robust) bir
veritabanı yönetim sistemidir. Mysql veri tablolarını iki formatta tutabilmekteydi. InnoDB ve MYisam.
Veritabanları arasında kızıĢan rekabet sonucu pabucu pahalı gören Oracle, Innobase Ģirketini satın alarak bir
anlamda MYsql ‗in elini kolunu bağladı. Çünkü dilediği anda Innobase‘i lisanslı hale geçirip MySql ürünlerini
tartıĢmalı duruma getirebilecekti. MYsql ‗in buna cevabı ise farklı oldu. Onlarda InnoDb yerine yıllar önce
Interbase‘i geliĢtiren Jim Starkey‘ i iĢe alarak, kendi tablo formatlarını entegre etme yoluna gittiler.
PHP geliĢtiricileri ise 5. sürümden itibaren doğal MYSQL desteği yerine, SQLite veritabanını öne çıkarmaya
baĢladılar. SQLlite, basit veritabanı iĢlemleri için olduça
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
175
yeterli bir veritabanı programıdır. Gerçi network
ortamında çoklu kullanım için uygun değildir ama internet programlarının çoğunun buna ihtiyacı yoktur.
PHP Dilinin GeniĢletilebilirliği
PHP dilindeki fonksiyonlar gerekli geniĢletme kütüphanelerinden aranır. Örneğin siz kodunuzda bir
fonksiyon kullandığınızda bunu içeren PHP kütüphanesi,
geniĢletme dosyalarının tutulduğu klasörde bulunamazsa hata mesajı verilir.
PHP dili için geliĢtirilen eklentiler PECL adı verilen "PHP Extension Code Library" kelimelerinden oluĢturulmuĢ bir
kütüphanede dağıtılmaktadır.
Bazı PHP Kütüphaneleri ve iĢlevleri
php_bz2.dll Bzip2 dosyaları ile çalıĢma.
SıkıĢtırma ve açma iĢlemi
php_zip.dll Zip dosyaları ile çalıĢmaç
sıkıĢtırma ve açma iĢlemi
php_curl.dll DeğiĢik tipte protokol kullanan istemci ve sunucular
(ftp,http,https,gopher vs) ile bağlantı kurabilmek için
php_exif.dll Exif bilgileri ile çalıĢma (resim meta verileri)
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
176
php_fdf.dll Form Data Format eklentisi. PDF
dosyalarında formlarla çalıĢma
php_gd2.dll Grafik oluĢturma ve çizme
php_gettext.dll DeğiĢik dillerde çalıĢabilecek
yazılımlar için
php_gmp.dll
php_imap.dll IMAP protokolü ile iletiĢim
kurmak için
php_ldap.dll LDAP (Lightweight Directory
Access Protocol) protokolü ile iletiĢim kurmak için gerekli
fonksiyonlar
php_mbstring.dll MultiByte String iĢleme fonksiyonları
php_mcrypt.dll DES, TripleDES, Blowfish (varsayılan), 3-WAY, SAFER-
SK64, SAFER-SK128, TWOFISH, TEA, RC2 and GOST in CBC,
OFB, CFB, ECB cipher, RC6 ve IDEA algoritmaları ile Ģifreleme
yapmak için gerekli kütüphane
(son iki free algoritma değildir)
php_mhash.dll HASH Ģifreleme fonksiyonları
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
177
php_mime_magic.dll Dosya içeriğine bakıp dosya türü
hakkında tahminde bulunan kütüphane dosyası. (Bu eklenti
yerine artık Fileinfo eklentisi geçmektedir. Bu eklenti geri
dönük uyumluluk için korunmaktadır)
php_ming.dll Flash animasyon dosyaları
üretmek için gerekli fonksiyonlar
php_openssl.dll SSL protolü için
php_snmp.dll SNMP protokolü (Simple Network
Managemet Protocol)
php_soap.dll Web servisleri için
php_sockets.dll Soket bağlantılar için
php_xmlrpc.dll XML ve RPC kütüphanesi. XML-RPC sunucu ve istemcileri
geliĢtirmek için gerekli fonksiyonlar
php_xsl.dll XML dosyalarına çıkıĢ formatı tanımlamak için gerekli
fonksiyonlar
php_dbase.dll Dbase VTYS bağlantısı
php_interbase.dll Interbase VTYS bağlantısı
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
178
php_msql.dll Msql VTYS bağlantısı
php_mssql.dll Mssql VTYS bağlantısı
php_mysql.dll Mysql VTYS bağlantısı
php_mysqli.dll Mysql VTYS bağlantısı (Nesne
eriĢimlidir)
php_oci8.dll Oracle VTYS bağlantısı (Oracle
Call Interface 8)
php_pgsql.dll Postgresql VTYS bağlantısı
php_sqlite.dll Sqlite VTYS bağlantısı
php_sybase_ct.dll Sybase VTYS bağlantısı
php_pdo.dll PHP Data Object bağlantılarının kullanımı için (Database
Abstraction Layer kütüphanesi)
php_pdo_firebird.dll Firebird PDO bağlantısı
php_pdo_mssql.dll Mssql PDO bağlantısı
php_pdo_mysql.dll Mysql PDO bağlantısı
php_pdo_oci.dll Oracle PDO bağlantısı
php_pdo_oci8.dll Oracle PDO bağlantısı
php_pdo_odbc.dll ODBC PDO bağlantısı
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
179
php_pdo_pgsql.dll Postgres PDO bağlantısı
php_pdo_sqlite.dll Sqlite PDO bağlantısı
PEAR (PHP Extension and Application Repository)
PEAR aslında çeĢitli iĢler için yazılmıĢ kodların bir araya getirilerek diğer programcılar tarafındanda kullanılmasını
sağlayan hazır kodlar kütüphanesidir. En çok bilinen PEAR paketi ise PEAR::DB paketidir. PEAR ile
programlama konusu çok derin bir konu olup bu kitapta çoğunlukla PEAR barındırmayan kodlar kullanılacaktır.
Bunun sebebi PEAR‗ın zor veya kötü bir Ģey olması değildir. Burada ilk amaç PHP öğrenmek olduğu için
belirli bir aĢamaya gelinceye kadar klasik kodlama
teknikleri ile devam edilecektir.
PHP - Web Sunucusu – PHP Kurulumu
Web master açısından PHP sunucu tarafından çalıĢan bir
programdır. Dolayısı ile sunucu ile uyumlu olmalıdır 5. sürümü itibariyle, PHP bütün Unix-türevi sistemler
(örneğin Linux, Mac Os, BSD, Solaris) ve Microsoft
Windows sistemleri ile uyumludur. Birlikte çalıĢabileceği Web sunucu programları arasında Apache, IIS, FHTTP,
Omni HTTPd, Xitami ve Windows 95/98 için PWS (Personal Web Server) vardır.
Internet ortamında ortamında web sunuculara PHP iĢleme yeteneğinin eklenmesi haliyle bizim sorunumuz
değildir, (iĢimiz hosting ise o zaman baĢka tabii). Bizim için Hosting firmasının PHP desteği verip vermediğini
bilmek yeter. Fakat çalıĢmalarımızın doğruluğunu,
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
180
hataların kontrolünü yapabilmek için (hatta site
tasarımını gerçek ortamdaki gibi müĢteri test edebilsin diye) kendi bilgisayarımıza bir kiĢisel Web Server kurmak
ve bu programı PHP-uyumlu hale getirmek gerekir.
Normal Ģartlar altında Apache, PHP, MYSQL kurulumu
detaylı bir iĢlemdir. Merak edenler için kitabın sonlarında yinede yer verilecektir. Ama benim önerim bu yöntemi
takip etmeyip, hazır WAMP paketlerinden birini kullanmanız olacaktır.
WAMP Windows+Apache+Mysql+PHP kelimelerinin kısaltılmıĢıdır. WAMP paketleri tüm bu programların
sisteminize otomatik kurulumunu sağlarlar. Böylece ayarlarla uğraĢmadan doğrudan iĢinize bakabilirsiniz.
Linux için tasarlanan bu paketler ise LAMP olarak bilinirler.
XAMPP
En çok tutulan WAMP paketlerinden birisi
www.apachefriends.org adresinden bulabileceğiniz XAMMP paketidir. Linus sürümüde vardır. PHP varsayılan
olarak desteklenmiĢtir. Ayrıca istenirse JSP çalıĢtırmak için TOMCAT eklentiside vardır. Paket bir çok ögeyi
barındırdığı için biraz büyük, download edilmesi daha uzun ve dosya sayısı çok fazlaolduğu için kopyala yapıĢtır
vs iĢlemlerde belirgin bir yavaĢlık sözkonusu olmakta.
APPSERV
Yine aynı Ģekilde APPSERV paketide iyi bir pakettir. Kendine özgü bir kullanıcı kitlesi olup Flash disk üzerinde
çalıĢmasını sağlayan betikleride vardır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
181
Uniform Server
Benim kiĢisel olarak tercih ettiğim WAMP paketi budur.
www.uniformserver.com adresinde yayınlanan bu paket, küçük ve sadece amaca yönelik bir paket. Üstelik bir
flash disk üzerinde tüm tasarımları (MYSQL verileri ve veri ayarları ilede birlikte) taĢıabilme avantajı vermekte.
Bu iĢlemi XAMMP ilede yapmak mümkün ama Uniform açık halde iken sadece 40 mb civarı yer tutarken XAMPP
250 mb civarında yer kaplıyor. Fakat Uniform Server içinede PEAR ve diğer bir çok eklentinin elle kurulması
gerekebiliyor. Uniform varsayılan olarak sadece MYSQL eklentisi hazır halde geliyor ve PEAR kütüphaneleride
dahil değil.
EasyPHP
EasyPHP oldukça tutulan bir WAMP paketidir. www.easyphp.org adresinde ki sitesinde güncel
sürümleri bulunmaktadır.
Bunlar dıĢında Saint WAMP, Php Triad, LWS, WD Studio
vs uzayıp giden bir liste Ģeklinde bir sürü WAMP paketi var.
Benim seçim yapma kritelerim ise
1. TaĢınabilir olmalı
2. Admin Paneli basit olmalı
3. Sık sık güncellenmeli
4. Fazla yer kaplamamalı
5. Ayarları mümkün olduğunca hazır gelmeli ve ilave ayarlar için yormamalı.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
182
Php Öğrenmek Zormu
Dilin üreticilerinden Zeev Suraski, bu yılın baĢında
Ġsrail'de yapılan ilk uluslararası PHP Konferansı'nda "PHP öğrenmek zor mu?" diye soran bir bilgisayar meraklısına
Ģu cevabı vermiĢtir: "Bir haftadan fazla zaman ayırmanız gerekiyorsa, sizin için zor demektir!"
Ġlk PHP Programımız – Merhaba Dünya
Dünyada neredeyse her programlama dili örnelirken ilk
yazılan kod genelde ekrana ―merhaba‖ dünya kelimelerinin yazdırılmasıdır.
<?php
echo ―merhaba dünya‖;
?>
Yukarda gördüğünüz gibi kod oldukça anlaĢılır sadece ve
notasyonu öğrenilmeye müsait.
PHP KOD YAZIM KURALLARI
PHP kodları, oluĢturacağımız HTML sayfalarında HTML
etiketlerinin arasında kendi özel ayracı içinde yazılır:
<html>
<?PHP
echo ("Merhaba Dünya!");
?>
</html>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
183
Php kodlama sintaksı bir çok dilden gelenler için çeĢitli
kolaylıklar içermektedir. Kodlamada akılda bulundurulması gerekenler
1. Php kodları <?PHP .... ?> veya <? .... ?> arasında yazılırlar.
2. Her komut satırından sonra ―;‖ noktalı birgül ile komut sonlandırılır. Ancak istisna durumlar vardır.
3. Php‘de açıklama satırı eklemek için /* ------ */, # veya // tagları kullanılır. Bunlar bulundukları yere
göre kodun belli bir kısmını PHP tarafından gözardı edilmesini sağlarlar.
4. PHP değiĢkenleri $iĢareti ifade edilirler. $adi gibi.
5. DeğiĢken isimlerin boĢluk kullanılamaz. Örneğin
$adi doğru bir değiĢkendir ama ―$adı soyadı― Ģeklinde bir değiĢken kullanılamaz.
6. PHP dilinde diğer dillerden farklı olarak Türkçe
harfler kullanılabilir. Örneğin $adı="ali";echo $adı; ġeklinde yazılan bir komut çalıĢır. Ancak bir çok
diller çlaıĢan birisi olarak bunu tavsiye etmiyorum.
7. DeğiĢken isimleri rakamla baĢlayamaz mutlaka
harfle baĢlamalıdır.
8. DeğiĢkenleri isimlendirirken uygun bir notasyonda
isimler kullanılmalıdır. Ayrıca değiĢken isimleri gereksiz yere uzatılmamalı ancak ancak
anlaĢılmayacak Ģekilde kısada olmamalıdır. Örneğin $sayfasonudegiskenikullanimornegi uygun
bir isim degildir. Keza $a,$b değiĢkenler tüm script boyunca kullanılacaksa uygun isimler değildir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
184
9. PHP dilinin ayrılmıĢ kelimeleri değiĢken adı olarak
kullanılamaz (örneğin Not, if, switch gibi)
10. PHP değiĢken isimlerinde harf duyarlıdır.
Örneğin $adi ve $ADI değiĢkenleri aynı değildir ve iki ayrı değiĢkendir.
11. Metin değerleri ― veya ‗ arasında yazılabilir. Eğer metin içinde çift tırnak kullanılacaksa bu çift
tırnaktan önce \ karakteri (ters slash) yazılmalıdır.
12. Metin değiĢkenlerin içeriğine bir karakter
dizisi gibi eriĢilebilir.
13. ―‖ arasında yazılan değiĢkenlerin içeriği
ekrana basılırken ‗ tırnak kullanılır ise değiĢken isimleri metin gibi ele alınır ve örneğin
$adi=‖Ahmet‖; ile atama bile yapılmıĢ olsa echo ‗$adi‘ ekrana Ahmet değil değiĢkenin adını
yazacaktır.
14. Çift tırnak içindeki özel karakterler iĢlenirken tek tırnak içindekiler metin olarak ele alınır.
15. Kontrol ve döngü bloklarında iĢlenecek komut sayısı birden fazla ise bu komutlar {} içine alınarak
koĢul yada döngüye ait komutların belirtilmesi gerekir. (aksi durumda bir mantık hatası oluĢur)
Örnek değiĢken tanımları
$adi Doğru
$1abc YanlıĢ
$_adi Doğru
$adi soyadi YanlıĢ
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
185
$adi‘soyadi YanlıĢ
PHP bir Script dilidir ve dolayısı ile ; PHP ile yazdığınız "programlar" birer düzyazı dosyasıdır. PHP komutları
aĢağıdaki çiftler arasına yazılabilir demiĢtik.
1. <?PHP .... ?>
2. <? .... ?>
Bunlara PHP komut ayracı denir; birinci türü uzun veya
standart ayraç sayılır; ikincisine ise "kısa ayraç" denir. PHP yorumlayıcısının kısa ayraç kullanmasını
istemiyorsak, PHP.ini dosyasındaki, short_open_tag = On: satırını short_open_tag = Off; yapmak yeter.
Bununla birlikte uzun vadede, PHP programlarınızda HTML yerine XML kullanmak istiyorsanız, Ģimdiden elinizi
uzun ayraca alıĢtırmanız yerinde olur; çünkü XML etiketleri "<?xml" Ģeklinde baĢlar ve "?>" Ģeklinde biter.
Eğer siz <??> ile kod yazacak olursanız XML kodlarınızın
PHP den ayrılması güçleĢecektir. (iĢin aslı XML kodlaması için PHP de ilk satır echo komutu ile yaptırılır)
ASP ile çalıĢan Web programcılarının alıĢtığı stil olan "<%" ve "%>" ASP bloğunu kullanmalarından dolayı
hata almalarını önlemek içinde bir kolaylık düĢünülmüĢtür. PHP.ini dosyasını açarak, asp_tags =
Off; satırını ON yaparak ASP açılıĢ kapanıĢ etiketleriylede PHP kodlamak mümkün olur!
PHP komutlarınızı <SCRIPT> etiketiyle de kullanabilirsiniz.
<HTML>
<SCRIPT LANGUAGE="PHP">
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
186
print ("Merhaba Dünya!");
</SCRIPT>
</HTML>
Ancak bunlar çok kullanılan durumlar değildir. Daha öncede belirtildiği gibi sadece önceden baĢka dilleri
kullananlar için kolaylık olsun diye eklenmiĢlerdir.
NOT: PHP kodları ne Ģekilde yazılırsa yazılsın sunucuda çalıĢırlar. PHP <SCRIPT> etiketi içinde yazılsa dahi.
Javascript veya VBScript gibi scriptler ise kullanıcı tarafında çalıĢırlar. Bu bakımdan 3. kullanım kafa
karĢıklığına sebep olmamalıdır. PHP daima sunucuda çalıĢtırıldığından dolayı ziyaretçiye asla PHP kodları
gösterilmez.
PHP kodlarımız, oluĢturulmasını istediğimiz sayfanın HTML kodları ile ―kod adacık‖ oluĢturmak üzere içiçe
yazılır. Örnek koda bakarsak bunu görebiliriz:
<HTML>
<HEAD>
<TITLE>PHP ile Merhaba</TITLE>
</HEAD>
<BODY>
<CENTER>
<B>
<H1>
<?PHP
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
187
print "Merhaba Dünya!";
?>
</H1>
</B>
</CENTER>
</BODY>
</HTML>
Sayfamızın görüntüsünde hiç bir değiĢiklik olmamakla birlikte, Browser'a giden HTML kodları önemli ölçüde
değiĢmiĢ olacaktır.
Açıklama (Yorum) Satırları
Yazılan kodun üzerinden zaman geçtikçe helede kod blokları uzun olunca kodu bir anda kavramak ve anlamak
zorlaĢır. ĠĢte bunun için kod satırlarının arasına açıklama satırları eklememiz gereklidir.
NOT: En iyi yazılmıĢ kod en çabuk anlaĢılabilen ve
dökumante edilmiĢ koddur.
PHP ayraçları içinde iki türlü yorum bulunabilir: Çok-satırlı yorumlar ve tek satırlı yorumlar. Birinci grubu,
baĢına "/*" ve sonuna "*/‖ iĢaretleri koyarak, ikinci grubu ise sadece baĢına ―//‖ veya # iĢareti koyarak
belirtiriz:
<HTML>
<!- - Bu satır HTML'in yorum satırı
Buraya istediğimiz kadar yorum yazabiliriz..
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
188
Browser bu satırları dikkate almaz - - >
<HEAD>
<TITLE>PHP ile Merhaba</TITLE>
</HEAD>
<BODY>
<CENTER>
<B>
<H1>
<?PHP
/*
Bu satır da PHP'nin çok-satırlı yorum bölümü..
Bunu da PHP yorumcusu asla dikkate almaz
Buraya istediğimiz kadar yorum yazabiliriz.
*/
print "Merhaba Dünya!";
// Bu ise PHP'nin tek satırlı yorum bölümü
// Bu satırları da PHP yorumcusu dikkate almayacaktır.
# Bu ise PHP'nin tek satırlı yorum bölümü
# Bu satırları da PHP yorumcusu dikkate almayacaktır.
?>
</H1>
</B>
</CENTER>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
189
</BODY>
</HTML>
<?PHP
# Bu satır da yorum bölümü..
# Bunu da PHP yorumcusu asla dikkate almaz
# Buraya istediğimiz kadar yorum yazabiliriz.
print "Merhaba Dünya!";
?>
Diyez ile yorum haline getirdiğimiz satırların sonuna baĢka iĢaret koymaya gerek yoktur.
PHP ile Ekrana Çıktı Verme
echo() fonksiyonu-(Ekrana yazdırma)
PHP dilinde ekrana bir Ģey yazdırmanın bir çok yöntemi
vardır. En çok kullanılan yöntem echo fonksiyonudur. ġimdi belkide dünyanın en çok yazılan kodu olan
―merhaba dünya‖ uygulamasını PHP ile yazalım. Çift tırnak ile tek tırnak kullanımı arasında fark vardır. Tek
tırnak yazılırsa ekrana yazılacak metin içinde değiĢken
kullanılamaz. Daha doğrusu değiĢkenlerin değeri yerine adı ekrana yazdırılır.
<?php
echo ―merhaba dünya‖;
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
190
?>
<?php
echo ‗merhaba dünya‘; // bu örnek doğru
echo ―merhaba dünya‖ // bu örnek doğru
echo ―merhaba dünya $adi‖; // bu örnek doğru
echo ‗merhaba dünya $adi‘; // bu örnek kod olarak doğru ama ekrana adı değiĢkenini değil kendisini
// yazacak
?>
Ekrana tek br değiĢken veya metin yazdırılacaksa sadece ―?‖ de kullanmak mümkündür.
print() fonksiyonu – (Ekrana Veri Yazma)
Print fonksiyonuda ekrana echo gibi çıktı vermek
amacıyla yazılmıĢ bir fonksiyondur. Genel kullanımıda aynıdır.
<?php
print ―merhaba dünya‖;
?>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
191
Doğruluğunu test etme imkanı bulamadım ama echo
fonksiyonun genel olarak print fonksiyonundan daha hızlı çalıĢtığını iddia eden makaleler okudum. Gerçektende
echo daha çok kullanım alanına sahip.
Escape Kodlar
Tek veya çift tırnak içine de alsak, PHP, bir değiĢken adını gördüğü zaman onun yerine o değiĢkenin tuttuğu
değeri yazar. PHP bunu, değiĢken adının baĢındaki $ görerek yaparak. $ iĢareti gibi PHP için özel anlamı olan
iĢaretlerin iĢlenmesini önlemek ve bu iĢaretleri düz metin saymasını sağlamak için bu iĢaretlerin önüne ters-bölü
iĢareti koyarız. Buna o karakteri kurtarma veya ESCaping denir. PHP'nin anlamlı iĢaretleri ve bunların
ESCape-yazılıĢı Ģöyledir:
\' Tek tırnak
\" Çift tırnak
\\ Ters-bölü
\$ Dolar iĢareti
\n Yeni Satır (New Line)
\r Satır BaĢı (Return)
\t Sekme (Tab) karakteri
Bu iĢlemi daha iyi anlatmak için Excelden bir örnek yararlı olur. Bazen Excel‘de bir sayının metin olarak ele
alınması istenir. Excel‘i buna zorlamak içinde o değerin baĢına ‗ karakteri konulur. ESCape kodlar iĢte bu iĢlemi
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
192
yaparlar. PHP bu kodları görünce değiĢkeni iĢlemek
yerine metin olarak varsayar.
DeğiĢken Nedir ?
DeğiĢkenler tüm programlama dillerinde karĢımıza
çıkacak bir konudur. Genel olarak tüm dillerde standartlarda aynıdır. Örneğin tüm programlama
dillerinde değiĢken adı rakam ile baĢlayamaz kuralı vardır. Neden değiĢken kullanırız diyecek olursanız cevap
çok basittir; sadece programcının iĢini kolaylaĢtırmak için.
Bilgisayarın RAM hafızasını bir Excel sayfası gibi düĢünebiliriz. Bilindiği gibi orada her satır hücrenin
kesiĢmesine bir hücre denir ve A1 gibi birde hücre adresi
alır. CPU larda buna benzer bir teknikle hafızayı adresleyerek kullanırlar.
Örneğin siz $maas =2000; dediğinizde PHP bilgisayarın RAM hafızasında xxxx:xxxx gibi bir adresi ayırmakta
kendisi için buraya sembolik olarak ―maas‖ adini vermektedir. Aslında xxxx:xxxx değeri sadece bir
ifadedir.
Günümüzde 64 bitlik iĢlemci ile çok daha karıĢık hale
gelmiĢtir. Hele birde binary yani sadece 1 ve 0 lardan oluĢan adresleri düĢünürsek bunların adreslerini ve neyi
temsil ettiğini hatılamak adeta imkansızdır. Dolayısı ile biz ―maas‖ degiskenine bakmak istediğimizde ise
karĢımıza onun temsil ettiği adresteki bilgi gelmektedir. Böylece programı kiĢi adres ezberlemek yada hatırlamak
zorunluluğundan kurtulmaktadır.
DeğiĢkenleri adının önüne $ iĢareti koyarak tanımlarız:
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
193
$ad;
$syd;
$Ay1;
DeğiĢkenler, harf, veya alt çizgi (_) ile baĢlayabilirler; bu karakterleri ve rakamları içerebilirler; ama içinde boĢluk
veya diğer iĢaretler bulunamaz. PHP değiĢkenleri her türlü değeri tutabilirler: bir değiĢkenin adının yazılıĢ Ģekli
onun tutabileceği değerin niteliğini belirlemez. Dolayısıyla, "$adi" değiĢkenin değeri "Tuncay" da olabilir,
"1255" de olabilir. PHP'de genellikle değiĢkenleri değerini atayarak belirleriz:
$adi = "Tuncay";
$soyadi = "ġanlı";
$a123 = 123;
DeğiĢkenler, kullanıldıkları yerde, taĢıdıkları değerin
kullanılmasını sağlarlar. Örneğin $adi değeri ―ALĠ‖
bilgisini içeriyor ise PHP bu değiĢkeni gördüğü yerde değiĢkenin içerdiği ―ALĠ‖ bilgisini kullanacaktır:
print $adi;
komutu, eğer değeri "Tuncay" ise tarayıcı penceresine
"Tuncay" kelimesini yazdırır. PHP'de özel bir değiĢkene değiĢken adı olarak kullanılacak değerleri de atayabiliriz:
$adi = "Tuncay";
$degisken = "adi";
print $$degisken;
Burada Browser penceresine yine "Tuncay" kelimesi
yazılacaktır; çünkü PHP $degisken adlı değiĢkenin "adi"
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
194
adlı değiĢkeni tuttuğunu bilecek ve iki Dolar iĢaretini
görünce, $degisken'in değerini değil, onun tuttuğu değiĢkenin değerini yazacaktır. Bu, size Ģu anda karıĢık
görünebilir. Daha sonra döngüleri gördüğümüzde bu tekniği bir satırlık kod ile yüzlerce değeri yazdırmakta
kullanacağız. Bu teknik Ģöyle de kullanılabilir:
$degisken = "adi";
$$degisken = "Tuncay";
print "$adi";
print $$degisken;
print "${$degisken}";
print "${'adi'}";
Buradaki dört "print" komutu da Browser'a "Tuncay"
kelimesini yazdıracaktır. PHP'de bir değiĢkenin tuttuğu değer, bir baĢka değiĢkene atanabilir. Bu ya duragan, ya
da dinamik olarak yapılır. Durağan yöntemde:
$birinci_degisken = "Nurcan";
$ikinci_degisken = $birinci_degisken;
$birinci_degisken = "Tülay";
print $ikinci_degisken;
Kimi zaman iki değiĢken arasındaki değer alıĢ-veriĢi sürekli olsun istenebilir. PHP, buna, ilk atama sırasında &
iĢareti kullanırsak izin verir. Aslında bu iĢlem bir hiledir. Çünkü yapılan iĢlem iki değiĢkeninde hafızadaki aynı
adresi göstermesi sağlanmaktadır:
$birinci_degisken = "Nurcan";
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
195
$ikinci_degisken = &$birinci_degisken;
$birinci_degisken = "Tülay";
print $ikinci_degisken;
Buradaki "print" komutu ise Browser penceresine "Tülay" kelimesini yazdıracaktır. Çünkü iki değiĢken arasındaki
değer alıĢ-veriĢi birinci değiĢkenin tuttuğu değeri değiĢtirmeden önce halde, ikinci değiĢkene birinci
değiĢkenin değerini dinamik olarak atamıĢ olduk. Atama iĢlemi sırasında & iĢareti kullandığımız için, birinci
değiĢkenin değeri değiĢtiğinde ikinci değiĢkenin de değeri değiĢecektir.
DeğiĢken Türleri
PHP, değiĢkenlere, tiplerine göre farklı miktarda hafıza
alanı ayırır. O yüzden etkin bir programcı için veri tipinin doğru tespiti çok önemlidir. (bu olay Veritabanı
tasarımında çok daha önemlidir). Ayrıca PHP, diğer bütün programlama dilleri gibi belirli veri türleri ile sadece
belirli iĢlemleri yapabilir. Örneğin, ancak iki sayı arasında aritmetik iĢlemler yapılabilir ama iki metin değiĢken
aritmetik olarak toplanamaz; ancak içerdikleri değerler ardarda eklenebilir. Ne var ki, PHP sizin aritmetik
toplama mı, yoksa ardarda ekleme mi yapmak istediğinizi bilmek durumunda değildir. (PHP'ye
'muazzam dil' dedik; içinde yapay zekâ var demedik!) Dolayısyla değerleri 5 ile 6 olan iki değiĢkeni topladığınız
zaman ortaya 11 yerine 56 çıkarsa, kabahati PHP'de değil, değiĢkenlere veri atayan kiĢide (büyük bir ihtimalle
kendinizde) aramalısınız.
PHP açısından yedi tür değer vardır:
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
196
Tamsayı (Integer): 5,124, 9834 gibi (-
2147483647 ile 2147483647 arası sayılar)
Çift (Double): 3,567 gibi
Alfanümerik (String): "Deniz" gibi
Mantıksal (Boolean): doğru (true)/yanlıĢ (false)
gibi
Nesne (Object)
Dizi (Array)
Resources (Kaynak)
Kaynaklar aslında PHP değiĢkeni olmayan Sql sorguları, yada bir dosyadan yğklenen resim gibi kaynaklardır.
DeğiĢkenlerden farklı genellikle olarak iĢleri bitince yok edilmeleri gereklidir. Böylece verimli bir hafıza kullanımı
sağlanır.
<?php
$str = "12";
$int = 20;
print $mystring + $myinteger;
?>
Alfanümerik DeğiĢkenlerin Ġçeriğine Dizi Olarak EriĢme
Alfanümerik değiĢkenlerin PHP‘de özel bir kullanım Ģekli
daha vardır. Bu notasyon Pascal ve C dilindede olan bir kullanım Ģeklidir. Gerçi Pascalda 0. byte uzunluk ifade
eder ama önemli olan kullanım mantığıdır. Bu yöntemler bir alfanümerik değiĢkenin içeriğine harf harf eriĢmek
mümkündür.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
197
<?php
$str1 = "Kelam, Ġbrahim?";
$str1{0} = "S";
$str1{14} = "!";
print $str1;
?>
Yukarda gördüğünüz kullanımda öncelikle bir alfanümerik değiĢken oluĢturuluyor. Daha sonra ise bu değiĢkenin ilk
harfi değiĢtiriliyor ve en sonundada metnin en son karakteri değitirilip ekrana yeni hali yazılıyor.
Diziler (Array)
Diziler aynı tipte birden çok değiĢkeni zincirleme olarak
barındıran değiĢkenlerdir. Buna neden ihtiyaç duyulurki derseniz, örneğin meyveleri iĢleyen değiĢkenlere
ihtiyacımız olsun. Yapmamız gereken $elma, $armut gibi her meyveyi sıra ile tanımlamak. Bu iĢe kodlamada
zorluk ve sıkıntı demektir.
1. Bu meyveleri ekrana yazdıralım diyecek olursak
tek tek elle yazmak zorundayız.
2. Bu meyve isimlerini sıralayalım desek yapacak
hiçbir Ģeyimiz yok
3. Meyve isimlerini bir sırada iĢleyelim dersek elimiz
kolumuz bağlı
Dizilerde ise bu konular sıkıntı olmaktan çıkmaktadır.ġimdi bir örnekle hem meyveleri içeren bir
dizi tanımlayalım hemde bu diziyi ekrana yazdıralım.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
198
<?php
// for each dizi elemanları boyunca tekrarlar Ģüphesiz dizideki sayıyı bulup for ilede bu iĢlemi yapabiliriz
$meyve = array (
1=>"elma",
2=>"armut",
3=>"ayva",
4=>"Ģeftali",
5=>"üzüm",
6=>"nar");
foreach ($meyva as $deger) {echo $deger .
"<br>";}
?>
Yukardaki döngüde koyu harflerle yazılan kısım tüm
meyveleri ekrana yazan koddur. Üstelik tek bir fonksiyonlar bu diziyi artan yada azalan Ģekilde
sıralamamızda mümkün. ġimdilik döngünün nasıl çalıĢtığı konusuna girmeyeceğiz. Bu ilerde iĢleyeceğimiz bir konu.
Ancak ilerde bu konuya tekrar geniĢçe yer verilecektir
Çok Boyutlu Diziler
Diziler çok boyutluda olabilir. Örneğin meyvelerin
renginide tutmak isteseydik 2 boyutlu bir dizi tanımlayabilirdik.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
199
<?php $meyve = array ( array ( adi => "elma", renk => "kırmızı"),
array ( adi => "karpuz", renk => "kırmızı"), array ( adi => "ayva", renk => "sarı"),
array ( adi => "nar", renk => "pembe"), );
print $meyve [0][adi]; // meyve dizisinin ilk elemanının adi bilgisini yaz… ―elma‖
?>
Dizi Tanımlama Kuralları
Diziler tanımlanırken süslü parantez değil, normal
parantez kullanılır
Herbir elemanın değerlerinin sonunda virgül
konulur.
Dizi çok boyutlu ise bunları tırnak içine alarak
yazmak gerekir.
<?php
$a[0] = "abc";
$a[1] = "def";
$a[1] = $f; # tek boyutlu tanımlama
$a[1][0] = $f; # iki boyutlu tanımlama
?>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
200
Nesneler (Objects)
NYP yani Nesneye Yönelik Progamlama programlama
dünyasında çığır açan bir tekniktir. Ġngilizce OOP olarak ifade edilir ve Objet Oriented Programming kelimelerinin
baĢ harflerinden oluĢur. Bu teknik ortaya çıktığında geleneksel programlamaya alıĢkın olanlar önce tereddüt
etsede nesneler kısa sürede programcılar için vazgeçilmez oldular. Tanımlarsak, nesne, kendi
değiĢkenleri ve çalıĢtıracağı komutlardan oluĢan fonksiyonları ile bir bütündür. Nesneyi bir kere
tanımladıktan sonra istediğimiz kadar örneğini oluĢturabiliriz. Bir nesnenin yapacağı iĢten, o nesnenin
metodu diye söz ederiz. Nesneler birbirinin atası olabilir.
Birden fazla nesne bir araya gelerek yeni bir nesne oluĢturabilirler.
Windows iĢletim sistemi tamamen NYP ile yazılmıĢtır. Pencereler birer nesnedir. Pencere nesneleri ise, baĢlık çubuğu, pencelere alanı, durum satırı, sol ve sağ üst
köĢelerdeki düğmelerden oluĢmuĢtur. Gene aynı Ģekilde Windows pencelerinde gördüğünüz bilgi giriĢ kutuları
düğmeler vs her Ģey bir nesnedir.
Nesneler Ġleri programlama konusu olduğundan örnekler sonra iĢlenecektir. Ancak bast bir örnek vermek için ;
<? class nyp{ function yazdir($str){
echo "Merhaba\n";
echo "değiĢken : $str\n"; }
}
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
201
$deneme= new nyp(); $a="rastgele bir metin değeri";
$deneme -> yazdir($a);
?>
bu programı çalıĢtırdığımızda ekrana
Merhaba
Değişken : rastgele bir metin değeri
yazacaktır.
Konu baĢında belirtildiği gibi bu basit bir örnektir. $a ile
$str farklı olması sizleri ĢaĢırtmasın. Ġleriki konularda bu olay daha net ĢekillenmiĢ olacaktır.
Sabit Değerler - Constants
Ġster Web, ister Web-dıĢı amaçlı olsun, bir programın
bazen baĢından sonuna kadar aynı değeri taĢıması istenen bir değere ihtiyacınız olabilir. Tabiî ki bu iĢlem
için bir değiĢken kullanmakta mükündür. Ama yanlıĢlıkla değiĢkene değer atarsanız ölümcül hatalar yapabilrsiniz.
Örneğin liste kodu yazdığımızı düĢünelim; matbu forma baskı yaptıracağız, form 20 satırlık ve yine 20 satırdan
oluĢan bir sürü baĢka formumuzda var. Programın içinde bir değiĢken tutup bu sayı 20 olunca yeni form
takılmasını isteyebiliriz. Ama ilerde formlar 30 satır olursa tüm o 20 sayılarını bulup 30 yapmamız gerekir.
Bu iĢlem için $satirsayisi diye bir değiĢken kullanıp, içeriğini 20 olaak kullanmayı düĢünürsek eğer ilerde
sadece bu sayının 30 yapılması yetecektir. Bu daha akılcı bir iĢlemdir. Ancak buradada bir sorun var. Ya bu
değiĢikliği yanlıĢlıkla kod içinde yaparsak ? Sonuçta bu
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
202
bir deiĢken ve değer atamayada açık durumda. ĠĢte
bunun için satirsayisi diye bir sabit tanımlayıp buna değer atabiliriz. Böylece hem bir değiĢiklikle tüm
satirsayisi değerlerini güncellemiĢ olacağız, hemde kod içinde bu değeri yanlıĢlıkla değiĢtirmenin önüne geçmiĢ
olacağız. Üstelikta yanlıĢlık aynı isimde bir sabit daha oluĢturmaya kalkınca PHP iĢlemi yapmayacaktır.
PHP'de sabit değerler, Script boyunca değiĢmeden kalır. Sabit değerler, değiĢkenlerden farklı Ģekilde oluĢturulur.
Bunun için PHP'nin define() fonksiyonunu kullanırız. Bu fonksiyonun yazım kuralı Ģöyledir:
define ("SABIT_ADI", değeri);
Burada SABIT_ADI yerine, tanımlamak istediğimiz sabit
değere vereceğimiz isim, değeri yerine de sabitin taĢımasını istediğimiz değeri yazarız. Örnek:
<?php $tutar = 125;
define ( "KDV", 18);
$TL_Tutar = $tutar+(($tutar * KDV)/100);
print ($TL_Tutar);
?>
Burada tanımladığımız KDV sabit-değeri, tıpkı bir değiĢken gibi kullanılabilir. Ticari bir kod içinde bu KDV
değeri yüzlerce iĢlemde geçebilir. Bunun değerinin elle kodlanması yerine bu Ģekilde kullanılması bizi hatalardan
koruyacaktır. Diyelimki KDV 18 den 10 ‗a düĢtü. Yapmamız gereken sadece DEFINE satırındaki 18
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
203
değerini 10 yapmak olacaktır. Kodun geri kalanı anında
KDV oranını 10 olarak kullanacaktır.
Sabit değer ile aynı ismi taĢıyan değiĢken oluĢturmak
mümkündür; ancak aynı ismi taĢısa da PHP bir sabit ile bir değiĢkeni (birinin adının önünde $ iĢareti bulunduğu
için) karıĢtırmaz. TanımlanmıĢ olan bir sabiti yeniden oluĢturamayız; ama buna teĢebbüs ettiğimizde PHP hata
vermez. Bir sabit değerin oluĢturulmuĢ olup olmadığını defined() fonksiyonu ile anlayabiliriz:
<?php
$tutar = 125;
if (defined( "KDV" )) {
echo ("Sabit değer daha önce tanımlanmıĢtı.<br>");
}
define ( "KDV", 18);
$TL_Tutar = $tutar+(($tutar * KDV)/100);
print ($TL_Tutar);
?>
PHP'nin kullanılmaya hazır bir kaç sabit değeri vardır. True (doğru) değeri 1 olan, False (yanlıĢ) ise değeri sıfır
sayısı veya boĢ alfanümerik olan iki sabittir. Diğer sabitler ise Ģunlardır:
__FILE__ : O anda çalıĢmakta olan PHP dosyasının adı
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
204
__LINE__ : Bu ifadenin yer aldığı satırın sayısı
PHP_VERSION: PHP'nin sürümü;
PHP_OS: PHP'nin çalıĢtığı iĢletim sistemi;
PHP_VERSION : PHP'nin sürümü (Ġki kelimenin arasında bir alt-çizgi var);
Bunlara ek olarak, E_ERROR, E_WARNING, E_NOTICE ve E_PARSE Ģeklinde hata durumunda hatanın çeĢitli
özelliklerini bildiren sabit değerleri de kullanabiliriz. PHP hakkında çok daha geniĢ bilgiyi phpinfo() fonksiyonunu
çağırarakk alabilirsiniz.
Buradaki değiĢkenler iĢletim sistemine ve web server
programına görede değiĢirler. Ġlerde bunlar detaylıca incelenecektir.
Operatörler
Operatörler kullanıldıkları dile, atama, aritmetik iĢlemler
ve karıĢılatırma gibi yetenekler kazandıran sembollerdir. PHP dilinde en çok kullanılan operatör ―=‖ operatörüdür.
Değer atamak için kullanılır. PHP getirdiği yazım kolaylıklarından biriside hem atama hem iĢlem
yapılabilmesidir. Örneğin:
print ( $Fiyat = 1000 ) ;
ifadesinde olduğu gibi, bir fonksiyonun içinde de hem
atama iĢlemi yapılabilir; hem de iĢlem yürütülebilir. PHP'nin aritmetik, birleĢik-atama (combined assigment),
birleĢtirme, karĢılaĢtırma ve mantıksal sınama operatörleri vardır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
205
Aritmetik Operatörler:
+ Toplama 6+5 = 11
- Çıkartma 6-5 = 1 / Bölme 6/5 = 1.2
* Çarpma 6*5 = 30 % Kalan
(Modulus)
6%5 = 1
Aritmetik iĢlemleri gerçek sayılarla yaptığımız gibi,
tuttuğu değer sayı olan değiĢkenlerle de yapabiliriz.
Daha önce, PHP'de değiĢken tanımlarken ve bunlara
değer atarken sayı olan değiĢkenleri tırnak iĢareti kullanmadan, alfanümerik değiĢkenleri ise tırnak içinde
yazdığımızı hatırlayacaksınız. Bu, geleneksel hale gelmiĢ
olan bir programcılık alıĢkanlığıdır. PHP, tırnak kullanmasanız da bir değiĢkenin sayı olup olmadığını
anlar; daha sonra bu değiĢkenlerle aritmetik iĢlem yapabilir. PHP ayrıca rakamla baĢlayan alfanümerik
değiĢkenleri sayı olarak kullanmaya kalktığınızda, bu değerin baĢındaki bütün rakamları sayı olarak kabul
eder. PHP açısından harf veya iĢaretle baĢlayan alfanümerik değiĢkenlerin sayı olarak değeri sıfırdır.
Örnek:
$a = 6;
$b = "22/A"
print ($a + $b)
sonuç olarak 28'i verecektir; veya
$a = 6;
$b = "a/22"
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
206
print ($a + $b)
sonuç olarak 6 çıkacaktır. Bu küçük örnekler, PHP ile program yazarken hangi değiĢkenin ne sonuç vermesi
gerektiğini dikkatle düĢünmek zorunda olduğunuzu göstermiĢtir sanırım. Bir kiĢinin maaĢı ile baba adını
toplamak istemezsiniz doğal olarak ama bununla birlikte elimizde bir kiĢinin adı ve soyadı ayrı değiĢkenler halinde
ise, bunları birbirine ekleyerek (concatenation) ortaya yeni bir alfanümerik değiĢken çıkartabiliriz:
<?php $ad = "Ġbrahim Halil";
$soyad = "Kutluay";
$adi_soyadi = $ad . " " . $soyad;
print ("<br>");
print ($adi_soyadi);
print ($ad . "'nın soyadı " . $soyad . "'dir.")
?>
Gördüğünüz gibi alfanümerik değiĢkenleri ekleyerek yeni bir değiĢken elde edebilmenin yanında, değiĢkenlerin
değerlerinide birbirlerinin sonuna eklememizde mümkün. Son satırdaki araya konula nokta iĢaretiyle (.) bu iĢlem
yapılmaktadır. Bu iĢlemciyle sadece değiĢkenlerin değerlerini değil sıradan metin değerlerinide birbirine
ekleyebiliriz:
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
207
<?php print ("Ġlim Çinde bile olsa; " . "..." . "arayıp bulunuz..! ")
?>
BirleĢik Atama Operatörleri
Bu kodlama sistemi PHP diline C dilinde alınmıĢ kodlama tekniklerindendir. Normalde bir çok dilde örneğin A
değiĢkeninin değerini 10 artır denildiğinde A=A+10 Ģeklinde kodlanır. ġüphesiz bu kod PHP içindede
geçerlidir. Ancak istenirse aĢağıdaki tabloda görüldüğü gibi birleĢik-atama iĢlemide yapılabilir.
İşlem
ci
Örnek Anlamı
+= $a += 25 $a = $a + 25
-= $a -= 25 $a = $a – 25
/= $a /=25 $a = $a / 25
*= $a *= 25 $a = $a * 25
%= $a %= 25 $a = $a % 25
.= $a .=
"metin"
$a = $a"
metin"
Bu iĢlemi zihnimizde, "A değiĢkeninin mevcut değerine
25 ekle, çıkan sonucu A değiĢkenin yeni değeri yap!" Ģeklinde canlandırabiliriz.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
208
Bir Arttırmak veya Azaltmak için
Değerleri sadece 1 arttırmak veya azaltmak için PHP, bir
kolaylık sağlar:
$sayi++ veya ++$sayi: $sayi‘nin değerini 1
arttırır;
$sayi-- veya --$sayi: $sayi‘nin değerini 1
eksiltir.
++ veya -- iĢaretinin değiĢken adından önce veya sonra
olmasına göre artırma yada eksiltme iĢleminin önceliği değiĢir. ĠĢaretler değiĢkenin adından önce ise PHP önce
değiĢkenin değerini bir arttırır veya eksiltir, sonra bu yeni değeri iĢleme katar; iĢaretler değiĢken adından
sonra ise, PHP değiĢkenin o andaki değerini iĢleme
kadar, sonra değeri bir arttırır veya eksiltir.
Kontrol Blokları ve KarĢılatırma Operatörleri
Kontrol blokları programlama dilleri açısından olmazsa
olmaz ögelerdendir. Çünkü bir programın koĢullara uygun olara değiĢik iĢler yapabilmesi için kod
yazılabilmesini sağlarlar. PHP dilinde kontrol blokları
oluĢturmak için if ve switch kullanılır. Ancak if ve switch için olmazsa olmazĢarn aĢında karĢılaĢtırma operatörleri
gelir. ġimdi bunları görelim.
KarĢılaĢtırma Operatörleri
PHP'nin karĢılaĢtırma yapması için kullandığımız
iĢlemciler iĢlem iĢaretinin sağı ve solundaki değerleri
veya değiĢkenlerin değerlerini iĢaretin belirttiği karĢılaĢtırmayı yaptıktan (öncelik sırasına göre) sonra
ortaya ya doğru (true) ya da yanlıĢ (false) sonucunu
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
209
çıkartırlar. Söz gelimi, değeri 26 olan değiĢkenin 25'ten
büyük olup olmadığını sınarsak, sonuç doğru; 25'ten küçük olup olmadığını sınarsak sonuç yanlıĢ çıkacaktır.
PHP'nin karĢılaĢtırma iĢlemcileri Ģunlardır:
İşlemci Örnek Örnek $a=26 ise:
== eĢitse $a == 25
YanlıĢ/False
!= eĢit değilse $a != 25 Doğru/True
=== aynı ise $a ===
25
YanlıĢ/False
> büyükse $a > 25 Doğuru/True
< küçükse $a < 25 YanlıĢ/False
<= küçükse veya
eĢitse
$a <=
25
YanlıĢ/False
>= büyükse veya
eĢitse
$a >=
25
Doğru/True
PHP'nin karĢılaĢtırma iĢlemcileri hem tam ve ondalık sayı türü değerlerle, hem de alfanümerik değerlerle
kullanılabilir. KarĢılatırma ve kontrol ifadeleri hem zaman bu kadar basit olmaz. Örneğin bir kiĢinin ehliyet
alabilmesi için hem Trafik, hem Motor hemde Ġlkyardım derslerinin tümünden 70 veya üzerinde not alması
gerektiği gibi.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
210
Motor 70 - Trafik 70 – Ġlkyardım 69 = kalır
(yanlıĢ/false)
Motor 79 - Trafik 80 – Ġlkyardım 90 = geçer
(doğru/true)
PHP dilinde iki veya daha fazla koĢulu birden kontrol
edeceksek araya aĢağıdaki tablodaki operatörlerden birisini koymak gerekir.
PHP'de bu karĢılaĢtırmayı iki grubun arasına koyduğumuz iĢaretlerle yaparız. Operatörlerin iĢlem önceliği kuralı
burada geçerlidir.
İşlemci Adı Anlamı Örnek
|| Veya sol veya sağ doğru
Doğru || yanlıĢ =
doğru
Or Veya sol veya sağ
doğru
Doğru ||
yanlıĢ =
doğru
&& Ve sol ve sağ
doğru
Doğru ||
yanlıĢ = yanlıĢ
And Ve sol ve sağ doğru
Doğru || yanlıĢ =
yanlıĢ
Xor ġartlı-
veya
Sadece sol
veya sağ doğru
Doğru ||
yanlıĢ =
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
211
doğru
! Değil sol veya sağ yanlıĢ
Doğru || yanlıĢ =
doğru
Dikkatinizi çektiyse "veya" ve "ve" sınamaları için tabloda
iki operatör bulunmaktadır. Ve için (and ve &&), Veya için (or ve ||). Yukarıda operatörlerin önceliğinden
bahsetmiĢtik. Bu çiftlerin amacı önceliği değiĢtirmektir. Bu konuyu biraz açmamız gerek. PHP‘ de en yüksek
öncelik her zaman ―!‖ operatörünündür. Daha sonra ise parantez içine alınmıĢ ifadeler gelir. Çünkü öncelikle bu
iĢaretin değeri hesaplanmalıdır ki kontrol edilecek değerler ortaya çıksın. Öte yandan mantığa göre ―and‖
operatörü ―or‖ operatöründen önceliklidir. Yani bir cümlede hem ―and‖ hem ―or‖ kullanılmıĢ ise önce ―and‖
kontrol edilerek ifade iĢlenmeye baĢlanır. Bunun
önceliğini değiĢtirmek için ―or‖ yerine ―||‖ kullanılır ise bu defa ―||‖ ifadesi ―and‖ operatöründen önce kontrol
edilecektir.
Burası biraz karıĢık gibi gelsede iĢlemcinin mantığı bu yöndedir. Onun için en uygun Ģey birden fazla koĢul
olduğu zaman hangi koĢul önce iĢlenecekse o koĢulu parantez için almaktır. Parantez açma kapama sırası çok
önemlidir. O bakımdan geliĢmiĢ bir editör iĢinizi kolaylaĢtırabilir. Çünkü günümüz editörleri parantezleri
uygun sırada ayrı renklerde bile gösterebilir.
ĠĢlem Önceliği Sıralaması
1. !
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
212
2. ++ ve --
3. / * %
4. + -
5. < <= => >
6. == === | =
7. &&
8. ||
9. = += -= /= %= .=
10. and
11. xor
12. or
if komutu
Doğadaki her Ģey sebepler – sonuçlar üzerine kuruludur.
Örneğin gök gürlüyorsa - yağmur yağacak, benzin yoksa-araba duracak gibi. Programlarda bunun gibi
koĢullara göre farklı iĢlemler yapmak üzere tasarlanırlar. Örneğin alıĢveriĢ yaptınız, aldığınız Ģey ; ekmek ise KDV
%1, temizlik maddesi ise %18, lüks tüketim ise %25, temel gıda ise %8 olarak hesaplanacaktır. Burada
program mantığıda Ģu olmalıdır.
Kontrole baĢla Eğer alınan ekmek ise KDV %1 hesapla
Eğer ekmek değilse kontrol et
temel gıda ise KDV % 8 hesapla
Eğer temel gıda değilse kontrol et
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
213
PHP programında if deyimi bunu sağlar. Kelime anlamı
eğer olan if deyimi ile programımızı karar almaya zorlar ve bu duruma göre değiĢik kısımların yürütülmesini
sağlarız. If PHP dilinin ayrılmıĢ kelimelerinden (reserved words) birisidir. (Nerdeyse tüm dillerde if reserved word
olup karĢılaĢtırma için kullanılır)
if ( koĢullar ) { koĢullar doğru ise yapılacak iĢlere ait komutlar
} elseif (diğer koĢullar) {
diğer koĢullar doğru ise yapılacak iĢlere ait komutlar }
else { diğer her durumda yapılacak iĢlere ait komutlar
}
PHP, if ifadesinde verilen koĢulu doğru olarak hesaplarsa,
ifadeye ait ilk süslü parantezin içindeki komutları çalıĢtırır; bu Ģartlar doğru değilse, elseif deyimi ile
verebileceğimiz baĢka bir grup koĢulun doğru olup olmadığını sınayabiliriz. Bu koĢullar yerine geliyorsa,
PHP, elseif bölümündeki komutları çalıĢtırır. Eğer tüm koĢullar sağlanmadığı takdirde çalıĢtırılmasını istediğimiz
komutlar varsa onlarıda else bölümünde belirtiriz. if koĢulu doğru değilse, koĢula ait komutları es geçer ve
varsa elseif deyiminin koĢullarını test eder; elseif bölümü yok fakat else bölümü varsa bu bölümdeki komutları
çalıĢtırır. Deyimde else bölümü de yoksa, PHP koĢul sağlanmadığında if komutundan bir sonraki komuta
geçerek programı iĢletmeye devam eder.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
214
<?php $yasi = 10; if ( $yasi == 10 ) {
echo ("yaĢınız 10 çocuksunuz. ‖); }
elseif ($yasi == 18 { echo ("yaĢınız 18. gençsiniz");
} elseif ($yasi == 35 {
echo ("yaĢınız 35 yolun yarısındasınız"); }
else { echo ("Bu if blokunda sadece 10,18 ve 35
değerleri kontrol edilmektedir!"); }
?>
if komutundan sonra elseif yada else ifadesi kullanılacak
diye bir zorunluluk yoktur.
if ( $sifre == "" ) { echo ("Parola girmediniz.
Lütfen parola giriniz. ― }
Yukardaki if komutunda sifre değeri boĢ ise program uyarı verecek boĢ değilse hiç bir Ģey yapmadan bir
sonraki komuta geçerek devam edecektir.
$vize1 = 35;
$final1 = 75;
if ($vize1 >= 60 && $final1 >= 60) {
print ("Geçti!");
}
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
215
else {
print ("Kaldı!");
}
if-endif Kullanımı ve PHP ile HTML Kodunu Ayırma
PHP dilinde if kullanımın baĢka bir Ģekilde if-endif Ģeklindeki kullanımdır. Bu Ģekilde bir kullanımla kod
blokları bibirinden ayrılır. Bu özellikle grup çalıĢmalarında önemlidir. Çünkü bir kiĢi HTML kodu yazarken diğer PHP
üzerinde çalıĢabilir. AĢağıdaki örneği ―ifendif.php‖ adıyla kaydedelim ve kodu deneyelim.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN"> <html>
<head> <title>if endif Form deneme</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>
<? $islem=$_POST[‗islem‘];
$ad=$_POST[‗ad‘]; $soyad=$_POST[‗soyad‘];
if ($islem == 1): ?>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
216
Merhaba <b><? echo ucfirst($ad) . " " . ucfirst($soyad) ?></b>,<br>
Siteye hoĢgeldiniz. </body>
</html> <? exit; ?>
<? endif; ?> <form action="ifendif.php" method="post">
<input type="hidden" name="islem" value="1"> Kendinizi tanıtın lütfen ?
<table> <tr><td>Adınız:</td><td><input type="text"
name="ad"></td></tr> <tr> <td>Soyadınız:</td><td><input type="text"
name="soyad"></td></tr> <tr><td colspan=2><input type="submit"
value="Gönder‖></td></tr>
</table> </form>
</body>
</html>
Yukarda örnekte görüldüğü gibi aynı php sayfası iĢlem
değiĢkeni tanımsız ise bir form görüntülemekte ve bu formun submit kısmında ise kod kendini yeniden
çağırmakta. Ancak form kısmında iĢlem değiĢkeni değer aldığından bu defa karĢılama mesajı görünür. Ancak exit
komutu kullanımına özellikle dikkat edilmelidir. Aksi takdirde form görüntülenecektir. Buna benzer bir
kullanımı if else ile de sağlamak tabiî ki mümkündür.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
217
Endif
If blokunun sonlandığını göstermektedir. Yukarıdaki örnekte kullanımı verilmiĢtir.
switch komutu
If komutunun yazılıĢa dikkat ettiyseniz elseif ve else deyimleri kullanıldığı zaman programın ardı ardına birden
çok kontrole girmesi gerekir. Bu tip iĢlemleri
hızlandırmak için PHP‘de birde switch kontrol bloku kullanımı getirilmiĢtir. Switch blokundan çıkıĢ için break
(kır) komutu kullanılır. Örnek kodu bir inceleyelim;
<?php
$Name = "Ahmet"; if ($Name == "Ali") {
print "Adınız Ali \n"; } else {
if ($Name == "Veli") { print "Adınız Veli \n"; } else {
if ($Name == "Ahmet") { print "Adınız Ahmet \n";
} else { if ($Name == "Mehmet") {
print "Adınız Mehmet \n"; } else { print "Adınızı bilmiyorum!\n";
} }
} } ?>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
218
Gördüğünüz gibi gerekirse isim değerini tespit için tüm
kontroller yapılmak zorundadır. ĠĢte bunu önlemek için Switch kullanılırsa hem kodumuz daha okunur hale gelir
hemde kontroller hızlanır.
switch ( değiĢken ) {
case KOġUL-1 ; KoĢul-1 doğru ise yapılacak
iĢlemler
break;
case KOġUL-2 ; KoĢul-2 doğru ise yapılacak iĢlemler
break;
case KOġUL-3 ; KoĢul-3 doğru ise yapılacak
iĢlemler
break;
case KOġUL-4 ; KoĢul-4 doğru ise yapılacak iĢlemler
break;
......................
......................
default:
diğer durumların tümünde yapılacak iĢlemler
}
break komutunu kullanmak zorunlu değildir. Ancak break kullanılmazsa koĢullardan birisi sağlanmıĢ ve iĢletilmiĢ
bile olsa PHP diğer koĢullarıda kontrol etmeye devam edecek daha da garibi varsa default blokunuda
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
219
çalıĢtıracaktır. Bu sadece zaman israfı demek
olduğundan break komutunun kullanılması programımıza hız kazandıracaktır.
ġimdi ilk örneğimizi yeniden yazalım;
$Name = 'Ahmet; switch($Name) {
case "Ali": print "Adınız Ali \n"; break; case "Veli": print "Adınız Veli \n"; break;
case "Ahmet": print "Adınız Ahmet \n"; break; case "Mehmet": print "Adınız Mehmet \n"; break;
default: print "Adınızı bilmiyorum!\n"; }
switch ( $KDV ) {
case 1 ; echo ("ekmek <br>") ; break;
case 8 ; echo ("Temel gıda <br>") ; break;
case 18 ;echo ("genel ürünler <br>") ; break;
case 25; echo ("lüks tüketim <br>") ;break;
default: echo ("böyle bir KDV oranı tanımlanmamıĢtır <br>") ;
}
PHP bu kodu yürütürken KDV adlı değiĢkenin değerini kontrol edecektir. Değeri 1 ise ilk koĢul gerçekleĢecek ve
kodumuz ekrana ―ekmek‖ yazacak ve break ifadesini gördüğü için switch blokundan komple çıkarak swicth
blokundan sonraki ilk komutla yoluna devam edecektir.
Break komutu olmasaydır. 8,18, ve 25 olma durumlarıda
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
220
gereksiz yere kontrol edilecek, daha sonrada hiç alakası
yokken default blokunu çalıĢtırıp ekrana ekrana birde ―böyle bir KDV oranı tanımlanmamıĢtır‖ yazıp öylece
çıkacaktı. Bu bakımdan switch kullanılırken uygun yerlerde bra komutlarının kullanılması gereklidir
diyebiliriz.
Tek KoĢula Göre Ġki Sonuç - Üçlü Operatör (Ternary Operatör)
Bir değiĢkenin değerini sadece tek bir koĢul için kontrol etmek için switch blokunu uzun uzadıya kodlamak
gerekmez. Bu iĢlemi soru ve iki nokta üstüste iĢaretleri (? ... :) olarak yazılan operatör ile yapabiliriz. Örneğin,
sayfadaki ziyaretçi parolasını girdiyse bir hoĢ geldin
mesajı girmediyse bir uyarı görüntülemek istiyoruz.
$ikaz = ($sifre == "" ) ? "Parolanızı giriniz lütfen" : "Sayfamıza hoĢgeldiniz " ;
echo ($ikaz);
Burada ikaz değiĢkeninin içeriği sifre değiĢkenine bağlı olarak atanacaktır. ġifre boĢ ise ilk kısım, değilse
teĢekkür mesajı atanacaktır. Zaten bu operatöre Ternary denmesinin sebebi üç parametre birden almasıdır. KoĢul,
doğru ise sonuç, yanlıĢ ise sonuç değerleri.
<?php $yasstr = ($yas < 18) ? 'çocuk‟ :
'yetiĢkin‟;
?>
Döngü Kavramı
Döngüler bir kod yada kod blokunun belirli Ģartlara göre
tekrar edilmesini sağlayan program parçalarıdır. ġöyle
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
221
düĢünelim. 1 den 100 ‗ e kadar sayıların toplamını
bulmak istiyoruz. Döngüler olmasa sırasıyla sayıları yazıp toplayacaktık. Oysa döngüler ile bu iĢlemi çok daha
basit yapabiliriz. PHP dilinde iki tip döngü vardır. KoĢulun durumuna göre tekrar eden While ve belirli sayıda tekrar
eden FOR döngüleri.
For Döngüsü
Bir kod satırını yada blokunu belirli sayıda tekrar eder.
<?php
for ($i = 1; $i < 100; $i = $i + 1) {
print "Sayı $i\n";
}
?>
Yukardaki örnekte 1 ile 100 arasındaki sayılar ekrana yazdırılmaktadır. Dikat edilecek nokta ise koĢuldur. Bu
döngüle yazdırılan son sayı 99 dur.
<?php
// or dongusu iĢlemleri billi bir sayıda tekrarlar
// sayacı kendi artırıp eksilttiğinden sonsuz döngü riski
yoktur
/*for ( döngü değiĢkeni; koĢul ; artıĢ basamağı ) {
KoĢul doğru ise yapılacak iĢlere iliĢkin komutlar
} */
for ($sayac = 1; $sayac <= 7 ; $sayac++ ) {
// 1 den baĢlayarak 7 olana dek artır
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
222
print ("<font size= $sayac >");
print ("<b><p>Milli takım gittikçe
büyüyor!</b></p>");
print ("</font>");
}
?>
Yukardaki döngüde yazının büyüklüğü döngü ile birlite
artacaktır ve 7 olunca döngü sona erecektir. For döngüsü sayıyı kendi artırdığından normal Ģartlar altında While
döngülerinde sonsuz döngü riskini barındırmaz. Ancak kullanıcı adeta sabotaj yapar gibidöngünün içinde iken
döngü sabitine çıkıĢ değerinden küçük bir değer atarsa döngü çıkıĢ değerine hiç gelemez ve sonsuz döngüye
girer. AĢağıdaki örneği deneyecek kadar gözünüz kara ise en azından önce çalıĢmalarınızı kaydedin.
<?php
for ($sayac = 1; $sayac <= 7 ; $sayac++ ) {
// 1 den baĢlayarak 7 olana dek artır
print ("<font size= $sayac >");
print ("<b>Milli takım gittikçe büyüyor!</b><br>");
print ("</font>");
// $sayac=3; // bu satır açıklama satırı
olmasaydı sonsuz döngüye girecekti.
}
?>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
223
While Do Döngüsü
While döngüsü for döngüsünden farklı olarak önce bir
koĢulu kontrol edecek koĢul doğru ise döngü komutlarını çalıĢtıracaktır. Örneğin ;
<?php
$sayac = 1;
while ( $sayac <= 7 ) {
print ("<font size= $sayac >");
print ("<b>Milli takım gittikçe
büyüyor!</b><br>");
print ("</font>");
$sayac ++; // bu iĢlem yapılmazsa program
sonsuz döngüye girer.
} ?>
Yukardaki gibi döngüler kodlanırken dikkat edilmesi
gereken noktalar vardır. Bunlardan en önemlisi ise koĢul bir sayaç ise artırma iĢlemin unutulmamasıdır. Örneğin
yukarda döngüde sayaç değiĢkenini artırmayı unutmuĢ olsaydık, sayaç asla 7 olamayacak ve program sonsuz
döngüye girecekti. Döngü içinde yanlıĢlıkla sayaca koĢuldan büyük değer atasaydık, program döngüden o
anda çıkacaktı.
Do While Döngüsü
Do While döngüsü While döngüsünün tersi mantıkla çalıĢır. Önce döngü blokunu çalıĢtırır daha sonra ise Ģartı
kontrol eder.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
224
<?php
$sayac = 1;
do {
print ("<font size= $sayac >");
print ("<b>Milli takım gittikçe
büyüyor!</b><br>");
print ("</font>");
$sayac ++; // bu iĢlem olmazsa kodumuz sonsuz döngüye girer
}
while ( $sayac <= 7 ) ;
?>
Yukardaki döngüyü incelediğinizde Ģunu göreceksiniz. Sayaç değiĢkenine ilk atanan değer 100 olsa bile döngü
1 defa çalıĢıp daha sonra duracaktır. Do While
döngüsünün çalıĢma prensibi budur. Do while döngüsünde While satırının sonunda noktalı virgül
olduğuna ―;‖ dikkat etmelisiniz. Aksi taktirde derleme hatası alırsınız.
While ve Do While döngüleri özellikle dosyalarla ve veritabanı tabloları ile iĢlem yaparken faydalıdır. Örneğin, ―oku, iĢle, dosya sonuna gelince dur‖ yada
―dosya sonu değilse, oku, iĢle‖ Ģeklinde kullanılırlar ve metin dosyalarının yada veritabanı tablolarının baĢından
sonuna iĢlem yapılacağı durumlarda iĢe yararlar.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
225
For .. Each Döngüsü
Bir dizi yada küme değiĢkeninin sahip olduğu indisler
boyunca döngü kurulmasını sağlar. Örneğin ;
<?php
// for each dizi elemanları boyunca tekrarlar aslında dizideki sayıyı bulup for ilede bu iĢlemi yapabiliriz
$adlar = array (
1=>"Ali",
2=>"Ömer",
3=>"Mehmet",
4=>"ihsan",
5=>"Ahmet",
6=>"Ġbrahim");
foreach ($adlar as $deger)
{echo $deger . "<br>";}
?>
Burada döngü dizinin elemanlarını sırasıyla ekrana yazacaktır. Eğer isteseydik count() fonksiyonu ile dizinin
eleman sayısını bulup bu sayı kadar çalıĢacak for döngüsü de kurabilirdik
<?php
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
226
// for each dizi elemanları boyunca tekrarlar Ģüphesiz dizideki sayıyı bulup for ilede bu iĢelmi yapabiliriz
$adlar = array (
1=>"Ali",
2=>"Ömer",
3=>"Mehmet",
4=>"ihsan",
5=>"Ahmet",
6=>"Ġbrahim");
for ($i=1;$i <=count($adlar);++$i)
{echo $adlar[$i] . "<br>";}
?>
Döngüyü Kırmak için Break Komutu
Bazen durumun gerektirdiği üzere döngünün çalıĢmasını kırmak gerekir. Bu durumlarda break komutu
kullanılmalıdır. Break komutunu daha önce switch blokundada incelemiĢtik. Buradaki iĢlevi ise döngünün
artık tekrarlanmadan kırılmasıdır. Döngü kırılınca, program döngünün bir sonraki satırından devam eder.
<?php
for ($sayac = 1; $sayac <= 100 ; $sayac++ ) { // 1 den baĢlayarak 7 olana dek artır
print ("<font size= $sayac >");
print ("<b><p>Fenerbahçe gittikçe
büyüyor!</b></p>");
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
227
print ("</font>");
if ($sayac== 7){echo "sayac Ģu an 7 bu dongu
burada kırılacak"; break;}
// burada sayı 7 olunca dongu kırılacak kısaca
sayac asla 8 olamayacak
}
?>
Yukardaki döngüde döngü sayacına göre yazı büyüklüğü verilmektedir. Ancak bu HTML de maksimum 7
olduğundan 7 olduğundan döngü kırılması sağlanmıĢtır. Aslında döngüyü sadece 7 ye kadar da kurabilirdik ama
burada break komutunun iĢlevini görmek için bu Ģekilde ayarlandı.
Yine aynı Ģekilde bir döngü boyunca kullanıcıdan bilgi sorulduğunu düĢünün örneğin 200 defa. Kullanıcı sıkıldığı
anda belirli bir sayı girip döngüyü kırabilmelidir.
Döngüyü Devam Ettirme : Continue
Bazı durumlarda döngüyü kırmak yerine bir sonraki duruma geçmek gerekir. Örneğin Ģöyle bir problem
düĢünün. Sırayla notları alacağız ve notlar 100‘ den büyükse iĢlem yapmadan bir sonraki iĢleme geçeceğiz.
<?php
for ($sayi=1; $sayi <= ogrenci sayısı; $sayi++ ) {
if ( $puan >100 ) continue; // 100 den buyuk
not olmaz. Bir sonraki notu soracak
print ("$sayi,$puan");
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
228
print ("<br>");
}
?>
Döngü Ġçinde Döngü Kullanımı
Kodlamaya dikkat edilirse döngüler birbiri içinde kullanılabilir. Dikkat edilmesi gereken konu gereksiz
iĢlemlerin döngü içine sokulmamasıdır. Ayrıca bu
döngüleri çinde Break komutunun kullanımda biraz daha detaylıdır. Break burada kullanılırsa sadece en yakındaki
göngüyü kırar.
for ($i = 1; $i < 3; $i = $i + 1) { for ($j = 1; $j < 4; $j = $j + 1) {
for ($k = 1; $k < 3; $k = $k + 1) { print "I: $i, J: $j, K: $k\n";
} }
}
Ekran görüntüsü Ģöyle olacaktır.
I:1,J:1,K:1 I:1,J:1,K:2
I:1,J:2,K:1
I:1,J:2,K:2 I:2,J:1,K:1
I:2,J:1,K:2 I:2,J:2,K:1
I:2,J:2,K:2
Yukardaki örneğe break komutunu eklersek;
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
229
for ($i = 1; $i < 3; $i = $i + 1) { for ($j = 1; $j < 4; $j = $j + 1) {
for ($k = 1; $k < 3; $k = $k + 1) { print "I: $i, J: $j, K: $k\n";
break; }
}
}
Ekran çıktısı Ģöyle olacaktır:
I:1,J:1,K:1 I:1,J:2,K:1
I:2,J:1,K:1 I:2,J:2,K:1
Döngü ve Kontrol Bloklarında PHP ve HTML Ġç içe Kullanım
PHP dili bizlere ekrana çıktı verme imkanı tanımıĢtır ancak bunu gereksiz yere kullanmak sadece balyozla
sinek avlamaya benzer. Örneği incelediğimizde durum daha iyi anlaĢılacaktır;
<?php if ($a == $b) { print "Devam edip giden kod satırları ";
print "Devam edip giden kod satırları "; print "Devam edip giden kod satırları ";
...[devam]... print "Devam edip giden kod satırları ";
print "Devam edip giden kod satırları "; print "Devam edip giden kod satırları ";
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
230
}
?>
Burada yaptığımız hata Ģu; madem PHP ve HTML iç içe yazılabiliyor o halde koĢul sağlandığından çalıĢan print
komutları yerine koĢul sağlandığından PHP blokundan çıkıp HTML diline geçip ekrana yazıları öyle yazdırsak
nasıl olur ?
<?php
if ($a == $b) {
?>
Devam edip giden kod satırları
Devam edip giden kod satırları
Devam edip giden kod satırları
[….devam…..]
Devam edip giden kod satırları
Devam edip giden kod satırları
Devam edip giden kod satırları
<?php
}
?>
ġimdi hem kodumuz aynı iĢi yapıyor hem kod daha okunur halde üstelikte PHP gereksiz yere ekrana Ģunu
yazdırağım diye uğraĢmıyor.
BaĢka Bir Dosyayı Ġthal Etme
PHP dilinde kod ithalini sağlayan dört fonsiyon vardır. Bu fonksiyonlarla baĢka dosyalarda bulunan kodları o an
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
231
çalıĢan dosyaya ekleyebiliriz. Bu fonksiyonlara bir
bakalım;
include() fonsiyonu
Adı verilen dosyayı kodun içine orada imiĢ gibi ekler ve
çalıĢtırır. Dosya yoksa sadece bir uyarı verir ve kodun geri kalanını çalıĢtırmaya devam eder. Include()
fonskyionu geriye bir değer dönderebilir.
require() fonksiyonu
require fonksiyonu iĢlev olarak include() ile temelde aynıdır yani adı verilen dosyayı kodun içine orada imiĢ
gibi ekler ve çalıĢtırır. Include() ile olan farkı ise adı verilen bu dosyanın bulunanaması durumunda görülür.
Require dosyayı bulamazsa programı ―öldürür‖. Require (kelime anlamı gerekli demektir) dosyanın olmasını ―ġart
KoĢar‖ dosya yoksa kod çalıĢtırılmaz ta ki dosya yerine konulana kadar. Require () geriye değer döndürmez.
include_Once ve require_Once
Bir liste oluĢturur ve dahil edilen dosyaların adını bu listede tutarak her dosyanın sadece bir kere dahil
edilmesine izin verirler. AĢağıda ki örneği inceleyelim
<?php
print 'Birinci dosya foo\n';
include 'iki.php';
print 'Birinci dosya bitti\n';
?>
Buda ikinci dosyanın kodu:
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
232
<?php
print 'Kontrol ikinci dosyada \n';
?>
<?php
print 'Birinci dosya foo\n';
require 'iki.php';
print 'Birinci dosya bitti\n';
?>
<?php
print 'Birinci dosya foo\n';
include_once 'iki.php';
print 'Birinci dosya bitti\n';
?>
<?php
print 'Birinci dosya foo\n';
require_once 'iki.php';
print 'Birinci dosya bitti\n';
?>
Inclue ve Require kullanırken bu komutların iĢletim sistemine göre değiĢik davrandıklarını unutmamak
gerekir. Çünkü Unix türevi iĢletim sistemleri (Linux, Bsd,Sun solaris) Büyük-küçük harf ayrımı olan
sitemlerdir. Windows gibi davranmazlar. Örneğin
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
233
<?php
include 'dosya.php';
include 'Dosya.php';
include 'DoSya.php';
include 'dosYa.php';
?>
Yukardaki kod Windows iĢletim sisteminde adı geçen 4 dosyayıda aynı dosya olarak ele alır çünkü harf ayrımı
yoktur. Oysa Linux bir server üstünde ise bu 4 dosyada ayrı dosyalar olarak aranacak ve bulunamazsa hata
verielcektir. Bu bakımdan altın kural dosya isimlerini her zaman küçük harf olarak kullanmaktır.
Bazen include için parametre olarak döngü değerleride
kullanılabilir. Örneğin aĢağıdaki dosyada 1 den 99‘ a kadar bir döngü ile dosyalar include () ile eklenecektir.
<?php
for ( $i = 1 ; $i <= 99 ; ++$i) {
include ("beniekle" . $i . ".x");
?>
include() ve türevlerindeki güvenlik açığı
include kullanırken dosya uzantılarına dikkat etmek gerekir. Örneğin include edilecek dosya adını adres
satırından parametre olarak geçirdiğimizi farzedelim. Dosya uzantısı da ―txt‖ olarak verilmiĢ olsun. Bu
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
234
durumda örneğin ―ekle.php?dosyaadi=beniekle.txt‖
değeri ile iĢlem yaptığımızı farzedelim. Dikkatli bir kullanıcı adres satırına o dosya adını yazacak olursa txt
dosyanın içeriğini görür. Helede bu dosayada parola vs
bilgiler varsa tehlike çok daha büyük olabilir.
include() ile Kodun Yeniden Kullanımı
Mysql ile ilgili fonksionlar daha sonra görülecektir ancak
bu arada sadece mantığın anlaĢılması açısında bir örnek vermekte gerek var. Bir okul programı düĢünelim.
Öğretmenler kaydedilir, listelenir, silinir. Keza öğrenciler, dersler, okul bilgileri, notlar, devamsızlıklar içinde aynı
iĢlemler yaplıacaktır. Bu iĢlemler için veritabanına eriĢip
iĢlem yapılacak yüzlerce ayrı programcık gereklidir. Bu kod parçalarının her birinde en az bir defa mecburen
Mysql‘e bağlanmak, daha sonra veritabanını seçmek için gerekli kodlarda yazılmalıdır. Ġnclude olmadan tek çare
bu kodları gerekli her yerde tek tek yazmaktır. include() kullanılır ise bu kod bir kere yazılır ve her yerde çağrılır.
ġimdi Ģunu diyebilirsiniz bu sonuçta iĢletilen kod satırını düĢürmez. Bu konuda haklısınız evet include sonuçta
kodu orda imiĢ gibi alıp ilgili yere ekler. Ancak düĢünkü Ģifre değiĢti bu durumda ne olacak ? include kullanan kiĢi
sadece ilgili dosyayı açıp değiĢtirecek ve tüm değiĢikliği bitirecek, kodu here yere giren kiĢi ise tüm kodları
dolaĢıp değiĢiklikleri elle yapacak daha sonra acaba unutulan bir yer varmı diye birde kontrol edecektir. Oysa
include ile sadece bir yerde bağlantı yeniden kuruluyor
ise iĢlem bitmiĢ demektir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
235
HEREDOC Nedir
Heredoc PHP içinde çok uzun metinleri zahmetsizce
yazmaya yarayan bir yetenektir. Heredoc ile uzun metinler oluĢturulabilir, kendi metin sonu etiketimizi
oluĢturabiliriz. ġu kodu inceleyelim;
<?php $metin = <<<son
Burada biraz PHP içinde metin örneği var. Bu alanda tamamen özgürüz
bu alanda ―çift tırnak‖ yada ‗tek tırnak2 kullanmaktada özgürüz
Artı $degiskenler gibi kullanımda cabası
Bu değiĢkenler iĢlem sırasında içerdikleri değeri alacaklardır,
son kelimesini istediğiniz yere yazabilirsiniz. ġu anda sonladırma etiketi o
ancak aĢağıdaki gibi değil: son;
?>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
236
Fonksiyon Kavramı ve Kategorilere Göre PHP Fonksiyonları
Fonksiyonlar bir kod blokunu otomatik olarak yazmak üzere tasarlanmıĢ program parçacıklardır. Bir dilin
fonksiyon sayısının fazla olması yanında bunların iyi organize edilmiĢ olmasıda önemlidir. Programlama
dillerinde normalde fonksiyonlar derleyici içine kodlanmıĢ olurdu.
Ġlk olarak PASCAL dili ile bir yenilik geldi. Dilin sadece sintaks yapısını tanımlayıp fonksiyonları harici
kütüphanelerden kullanmak. Böylece dillerin komut setlerini geniletme olanağı getirilmiĢ oldu. Örneğin dilin
kendisinde olmayan bir fonksiyonu kendiniz yazıp bunu
PHP nin içinde hep varmıĢ gibi kullanabiliriz.
Çağrılan bir fonksiyon ya kendisinden beklenen iĢi yapar,
ya da kendisini çağıran iĢleme veya fonksiyona bir değer sunar. Buna fonksiyondan dönen değer denir. Örneğin
bir dosyanın var olup olmadını test eden bir fonksiyon yazdığımızı düĢünelim, dönen sonuç TRUE ise dosyanın
zaten var olduğunu gösterecek Ģekilde kodlayabiliriz. False ise dosya yok anlamına gelecektir. (iĢin aslı bu
fonksiyonu yazmamıza gerek yoktur çünkü PHP dilinde bu iĢi yapan hazır bir fonksiyon zaten vardır).
Fonksiyonları çeĢitli baĢlıklarda ele alacağız.
DeğiĢkenlerle iĢlem yapan fonksiyonlar
Program kodunu durduruma fonksiyonları
Tarih Zaman bilgisiyle iĢlem yapan fonksiyonlar
Matematiksel fonksiyonlar
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
237
Metin ĠĢleme fonksiyonları
Veri ġifreleme fonksiyonları
Düzenli Ġfade (Regular expressions) fonksiyonları
Uzantı yönetimi
Kendi fonksiyonlarımızı yazmak
Kendisini çağıran, değiĢken, ve geri çağırımlı fonksiyonlar
DeğiĢkenlerle ĠĢlem Yapan Fonksiyonlar
PHP dilinde değiĢkenler istenildiği anda tanımlanabilmektedir. Öte yanda PHP dilinin büyük küçük
harf ayrımı yapmasada değiĢken tanımlanırken dikkatli olunmasını gerektirir. Yine aynı Ģekilde eğer çok büyük
dizilerle çalıĢıyorsak bu dizilerin iĢi bitince hafızadan
atılması gerekir ki web sunucu hafıza boĢ yere dolup hızı düĢmesin.
isset() fonksiyonu (değiĢkene değer atanmıĢ mı kontrol etmek)
isset() fonksiyonu, PHP'nin bir değiĢkenin içinde değer bulunup bulunmadığını kontrol etmesini sağlar. Eğer geri
dönen değer true ise bu değiĢkene bir değer atanmıĢ demektir.
<?php
if (isset($sayi)) {
print( $sayi );
}
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
238
else {
print (―sayi degiskeni bir değer içermiyor‖);
}
?>
unset() fonksiyonu (değiĢkeni hafızadan atmak-yok etmek)
unset() fonksiyonu varolan bir değiĢkeni yok eder.
Böylece bu değiĢkenin kullandığı alan boĢ hafıza miktarına eklenir. Ġyi bir programlamada unset() ile
değiĢkenler yok edilmelidir. Çünkü bu web sunucuya büyük rahatlık getirecektir.
<?php
if (isset($sayi)) {
echo ( $sayi );
}
else {
unset($sayi);
}
?>
empty() (DeğiĢken boĢmu)
Bu fonksiyon isset() fonksiyonunun tersidir. AĢağıdaki Ģartlar oluĢursa true değer dönderir aksi tatirde ise false
sonuç üretmektedir.
Bir değiĢkene henüz değer atanmamıĢsa
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
239
Değeri sıfır ise
DeğiĢken ―‖ yani boĢ alfanümerik (null string) ise
empty() fonksiyonu true sonuç üretmektedir.
<?
$sayi = 10;
echo empty($sayi); // 0 azacak sayı boĢ değil 10
$isim = ""; // 1 yazacak isim boĢ
echo empty($isim);
?>
is_string(), is_integer(), is_double() fonksiyonları ile tip tespiti
Parametreleri olan değiĢkenin tipine göre true yada false sonuç dönderirler. is_string string tipi, is_integer()
tamsayılar ve is_double fonksiyonuda ondalıklı sayılar
için true değer üretir.
<?php
$a = 3.14;
//$a = ―Ali‖; // burası Ģimdilik yorum satırı
//$a = 14; // burası Ģimdilik yorum satırı
if (is_double($a)) {
print ("A ondalıklı sayıdır<br>");
}
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
240
if (is_string ($a)) {
print ("A String'dir<br>");
}
if (is_integer($a)) {
print ("A tamsayıdır<br>");
}
?>
Bu kod, tarayıcı penceresine değiĢkeni tipine göre ilgili print ile tanımlanan metni yazdıracaktır. Bu program
parçası Browser penceresine sadece empty() fonksiyonun doğru sonuç verdiği birinci echo() deyiminde
1 yazdıracaktır.
is_array() ve is_object fonksiyonları ise sırasıyla değiĢkenin tipi dizi yada nesne ise true değer üretirler.
Burada bu konu hakkında detaya girilmeyecektir.
Bu fonksiyonları tümü ilerde göreceğimiz Kullanıcı
Verilerini Doğrulama konusunda iĢe yarayacaktır.
Örneğin kullanıcıya maaĢını soran bir kutucuğa kullanıcı ―bin ytl‖ yazarsa, doru yazması konusunda uyarılarda
bulunmak üzere yapaılacak kontrollerde bu
fonksiyonlardan yararlanılacaktır.
print_r () fonksiyonu
Bu fonksiyon parametre olarak aldığı değiĢken ve içeriği hakkında bilgi verir. Bu değiĢken bir dizi ise dizinin
elemanlarıda buna dahildir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
241
<?php
$abc=456;
print_r($abc);
?>
Bu fonksiyon diziler konusunda daha detaylı
örneklenecektir.
DeğiĢken Tiplerini DönüĢtürme ve DeğiĢken Tipini Öğrenme
PHP dili ile bir değiĢkenin değerini referans alarak baĢka
tipte yeni bir değiĢken tanımlamak mümkündür. Bir değiĢkenin doğrudan doğruya kendisinin tipini değiĢtirme
iĢlemi ise settype fonksiyonu yapılır. Settype sonraki konularda incelenecektir. AĢağıdaki kod ile type-casting
iĢlemi yapılarak yeni bir değiĢken tanımlanmıĢtır.
<?php
$ad = "Ġbrahim";
$sayi = (integer)$ad;
echo $sayi;
?>
Önce bir string değiĢken tanımlanmıĢ daha sonra ise bu
değiĢken referans alınarak sayi adında tamsayı bir değiĢken dönüĢümü yapılmıĢtır. Burada dönüĢüm
ifadeleri olarak
DeğiĢkenin tipinin mantıksal olması için BOOL
DeğiĢkenin tipinin alfanümerik olması için STRING
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
242
DeğiĢkenin tipinin tamsayı olması için INTEGER
DeğiĢkenin tipinin ondalıklı sayı olması için FLOAT ifadeleri kullanılabilir.
Metin değiĢkenleri çevirirken çok dikkat etmek gereklidir.
Metin ifadeler sayıya çevirilirken baĢında sayı varsa bunlar alınır, geri kalanlar yoksayılır. Eğer değiĢken sayı
ile baĢlamıyor ise çevrim sonucu 0 kabul edilir. Örneğin yukardaki örnek kod 0 değerini verecektir.
gettype() fonksiyonu (DeğiĢken tipini alma)
Bir değiĢkenin değerinin türü hakkında bilgi almak için bu
fonksiyon kullanılabilir.
<?php
$sayi1 = 101;
print("Birinci değiĢkenin adı: \$sayi1<br>");
print("Değeri : "); print "$sayi1<br>";
print("Türü : "); print gettype( $sayi1 ) ;
//tamsayi/integer
print "<br>"; print "<br>";
$str1k = "Tuncay";
print "Ġkinci değiĢkenin adı: \$str1<br>";
print "Değeri : "; print "$str1<br>";
print("Türü : "); print gettype( $str1 ) ;
//alfanümerik/string
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
243
print "<br>"; print "<br>";
$pi = 3,14;
print "Üçüncü değiĢkenin adı: \$pi<br>";
print "Değeri : "; print "$pi<br>";
print("Türü : "); print gettype( $pi ) ;
//çift,ondalık sayı/double
print "<br>"; print "<br>";
$logical = true;
print "Üçüncü değiĢkenin adı: \$logical<br>";
print "Değeri : "; print "$logical<br>";
print("Türü : "); print gettype( $logical ) ; //mantıksal/boolean
print "<br>"; print "<br>";
?>
PHP için mantıksal olarak doğru anlamına gelen True Değeri 1 olarak varsayılmaktadır. PHP'de bir fonksiyon,
elde ettiği değer doğru ise sonuç olarak 1 değerini verir.
settype() fonksiyonu (değiĢekene bir tip atama)
Bu fonksiyon bir değiĢkenin kendisinin tipini değiĢtirmeye imkan verir. Ancak dönüĢüm iĢlemi istemeyen
sonuçlarda üretebilir. Bu bakımdan değiĢkenlerin değerlerine dikkat etmek gerekir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
244
<?php
$pi = 3.14;
print("DeğiĢkenin değeri : "); print "$pi<br>";
print("Türü : "); print gettype( $pi ) ; //çift,ondalık/double
print "<br>"; print "<br>";
print "değiĢtirme iĢlemi:<br>";
settype( $pi, string ); //alfanümerik/string
print "Değeri : "; print "$pi<br>";
print "<br>"; print "<br>";
?>
Bu programı çalıĢtırdığımızda, ilk atadığımız değerin ondalık bir sayıdır. Bu değerin türünü alfanümerik/string
olarak değiĢtirdiğimizde içeriğim korunduğunu
görüyoruz. Fakat tamsayıya döndürme iĢlemi yapılsaydı PHP değerin tamsayı bölümünü alıp, ondalıklı kısmını
atacaktır. Daha sonra bu tamsayı değiken yeniden ondalıklı sayıya çevrilese bile bu ondalık kısmı ilk
değeriyle elde etmek mümkün değildir. Mantıksala dönüĢüm yapılır ise içeriği 0 olmayan tüm değerler True
olarak geri döner. 0 olanlar içinse False değerini verir.
Ondalık sayılar tamsayıya çevrilirken ondalık kısmı
atılır (3.14 –>3)
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
245
Tamsayılar ondalık sayıya çevrilirken .00 ondalık
eki getirilir. (3->3.00)
Bir ondalıklı sayı tamsayıya çevrildikten sonra
tekrar ondalıklı sayıya çevrilse bile ilk ondalıklı kısım geri getirilemez
Boolean tipe çevrilen ve 0 ve null dıĢında bir değer içeren tüm değerler true olarak dönerler.
<?
$dene=‖selam‖;
$bul=true;
$son=2000;
echo gettype($dene);//tip öğrenme iĢlemi, ekrana string
yazacaktır
settype($bul,string);//tip değiĢtirme iĢlemi, tipi stringe
cevirir
echo gettype($bul);//ekrana string yazacaktır
$tampon=(integer) $dene;//tip kopyalama iĢlemi tipi
integer‘e çevirir.
echo $dene;//ekrana 0 yazacaktır.
?>
Dizilerle ĠĢlem Yapan Fonksiyonlar
Php dilinde dizilerle iĢlem yapmak üzere geliĢtirilmiĢ bir
çok fonksion hazır gelmektedir. Bu fonksiyonlarla dizileri birleĢtirmek, sıralamak veya bazı elemanlarını silmek
mümkündür.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
246
array_merge() fonksiyonu- (Dizileri birleĢtirme)
Ġki veya daha fazla dizinin bütün elemanlarını
birleĢtirerek, ortaya yeni bir dizi çıkartır. array_merge() iĢleminde en çok dikkat edilmesi gereken nokta
birleĢtirilen dizilerin değiĢmeden korunmuĢ olmasıdır. Örnek:
<?
$dizi1 = array ("A" , "B" , "C" , "D");
$dizi2 = array ("E" , "F" , "G" , "H");
$dizison = array_merge ( $dizi1, $dizi2);
// döngü içinde yeni diziyi yazdıralım
foreach ( $dizison as $eleman2 )
{
print (" $eleman2 <br>");
}
?>
Ġkinci dizinin bütün elemanları, birinci dizinin
elemanlarının arkasına eklenmiĢtir. array_merge() iĢlemi, çok-boyutlu iliĢkili dizilere de uygulanabilir; PHP
iki dizideki uyumlu-uyumsuz, yani birinde olan diğerinde olmayan bütün anahtar+değer çiftlerini yeni dizide de
oluĢtur.
array_push() fonksiyonu–(Dizilere değiĢken ekleme)
Bir diziye yeni değiĢkenler eklemek için, array_push() fonksiyonuna eklemenin yapılacağı dizinin adını ve yeni
değerleri yazarız. Örnek:
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
247
<?
$dizi1 = array ("A" , "B" , "C" , "D");
$dizison = array_push($dizi1, "E", "F", "G");
// döngü içinde yeni diziyi yazdıralım
foreach ( $dizi1 as $eleman2 )
{
print (" $eleman2 <br>");
}
?>
array_shift() fonksiyonu–(Dizinin ilk elemanını silme)
Dizi tipine sahip bir değiĢkenin ilk elemanını tümüyle
silmek için array_shift() fonksiyonu kullanılır. Bu fonksiyona sadece birinci elemanı silinecek dizinin adını
vermek yeterlidir.
$silinen_deger = array_shift ($diziadi);
array_slice() fonksiyonu – (Diziden kopyalama)
Bir dizi-değiĢkenin bütün elemanları yerine belirli bir bloğunu kullanmak gerekirse bunu array_slice()
fonksiyonu ile almak mümkündür. Bu fonksiyona kaynak dizinin adı, kopyalamanın baĢladığı yer ve kaç adet
değiĢken alınacağı argüman olarak verilir.
<?
$dizi = array ( "A" , "B" , "C" , "D", "E" , "F" , "G" , "H");
$kopya = array_slice ($dizi , 2, 4);
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
248
?>
Burada, PHP'ye $kopya adlı yeni oluĢturulacak dizi tipli değiĢkene, $dizi adlı dizinin 2‘nci değerinden itibaren (2
dahil) 4 değeri alıp yerleĢtirmesi bildirilmektedir. Orijinal dizi aynen korunmaktadır. Elemanlar yeni yeni
oluĢturulan diziye kopyalanmaktadır
sort() ve rsort() fonksiyonları-(Dizileri sıralama)
Bir dizinin içindeki değerleri sıralamak için sort() fonksiyonu kullanılır. Bu fonksiyon küçükten büyüğe
sıralama yapar. Bunu tersine çevirmek içinse rsort() fonksiyonu (reverse yada revert) kullanılır.
Sıralama iĢleminde dikkat edilecek konu bu fonksiyonların Türkçe uyumlu sıralama yapmamasıdır.
Ayrıca sıralanacak diziler birden fazla boyutlu ise bu
fonksiyonlar doğru sonuç vermez. Bunların yerine asort() ve ksort () kullanılır.
asort() ve ksort() fonksiyonları-(ĠliĢkili dizileri sıralama)
Bu dizilerin normal dizilerden farkı değerlerinin birde adı
olmasıdır. Değerlerin adına anahtar (key- ksort fonksiyonun adındaki k harfi buradan gelmektedir)
denir. Bu tip bir diziyi elemanların değerlerine göre sıralamak için asort(), değerlerin anahtar adlarına göre
sıralanması isteirse ksort() kullanılır.
<?
$dizi=array(a1=>"Ali", a2=>"AyĢe" , a3=>"BüĢra" ,
a4=>"Betül");
asort ($dizi);
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
249
$dizi2=array(a1=>"Ali", a2=>"AyĢe" , a3=>"BüĢra" ,a4=>"Betül");
ksort ($dizi2);
?>
Program Durdurma Fonksiyonları
exit() fonksiyonu (kodun çalıĢmasını durdurmak)
Bir PHP fonksiyonunu istediğimiz anda durdurabiliriz. Ancak genelde bu iĢlem belirli koĢulların sağlanması
durumunda yapılır. Kodun bir kontrolün sonucuna göre kendisinden beklenen iĢi yapamaması halinde oracıkta
durdurulmasını exit() fonksiyonu sağlar. Bu fonksiyona ekranda görüntülenmesini istediğimiz bir metni
parametre olarak verebiliriz. Eğer bu ifade bir metinse ekrana basılır.
die() fonksiyonu (kodun çalıĢmasını durdurmak)
Bu fonksiyon teknik anlamda exit fonksiyonu için bir alias
olduğundan iĢlevleri aynıdır. "Öl!" anlamına gelen bu fonksiyona ekranda görüntülenmesini istediğimiz bir
metni parametre olarak verebiliriz. Eğer bu ifade bir metinse ekrana basılır.
eval() fonksiyonu (kodun çalıĢmasını durdurmak)
Bu fonksiyonda ilk ikisine benzer. Ancak aldığı parametre PHP kodu ise bu php kodunu çalıĢtırır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
250
Bu fonksiyonlar genel itibarı ile önemli durumlarda
kurulacaktır. Örneğin bir MYSQL veritabanına bağlantı kurulmadığında buradaki bir tablodaki kayıtları
listeleyemeyiz. Bu durumda die(‗Mysql bağlantısı kurulamadı‘) fonksiyonun tabiî ki kullanacağız ancak
Ģimdilik kafa karıĢıklığı olmasın diye basit kullanım örneği görmek daha mantıklı olacaktır. Örneğin aĢağıdaki kod
bir dosyayı açmaya çalıĢıyor ancak dosya açılında bir sorun varsa kod deyim yerindeyse intihar ediyor. Dosya
açma fonksiyonu ilerde görülecektir. Ancak önemli olan die() fonksiyonunun kullanım Ģeklidir.
<?php
$dosyaadi = fopen( "benimdosyam.txt" , 'a' ) or die ("Dosya açılırken bir sorun oluĢtu!") ;
?
Tarih ve Zamanla ĠĢlem Yapma
PHP dili tarih zaman bilgilerini Unix EPOCH formatında
kullanır. Bu formata göre 1.1.1970 den beri geçen her saniye için bir rakamsal karĢılık vardır. Buna Unix
Timestamp‘te denilir. Bunun avantajları ve dezavantajları vardır.
Avantajları
Tarih formatını merak etmeye gerek yoktur.
Örneğin 01.12.1970 yada 19701201 yada Aralık 12 1970 yazılması durumunu merak etmeye gerek
yoktur.
Tarih zamanlarla milisaniye bazında iĢlem
yapabiliriz.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
251
Bir gün 24*60*60 saniye olduğundan 86400
sayısına eĢittir. Yani yarının tarihi için time ile gelen sayıya bu sayıyı eklemek yeterlidir.
Dezavantajı
BaĢlangıcı 1970 tir.
PHP, ile tarih zaman verilerinin iĢlenmesi gayet kolaydır.
Gelen bilgi tarayıcının olduğu değil web sunucunun tarih zaman bilgisidir.
time() fonksiyonu (Ģu anki zaman bilgisini alma)
Time fonksiyonu parametre almaz ve epoch formatında
Ģu anki zaman bilgisini saniye olarak verir. Bu bilgiyi
ister olduğu gibi ekrana basabiliriz, istersek bir değiĢkene alıp iĢlemlere tabi tutabiliriz.
<?php
print time();
$zaman = time();
print $zaman;
?>
Yukardaki kodu çalıĢtığında ekrana
11843764951184376495 gibi bir sayı basacaktır. Bu sayı çalıĢtığı bilgisayarın zamanına göre değiĢecektir.
microtime() fonksiyonu (Ģu anki zaman bilgisini hassas birimle alma)
Microtime Time fonksiyonu true parametresi alırsa zaman bilgisini milisaniye cinsinden verir. Bu
fonksiyonun dönüĢ değerinin ondalıklı sayı olduğuna dikkat edilmelidir. Bu bilgiyi ister olduğu gibi ekrana
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
252
basabiliriz, istersek bir değiĢkene alıp iĢlemlere tabi
tutabiliriz.
<?php
print microtime(true);
?>
strtotime() fonksiyonu (Metni zaman bilgisine çevirme)
Strtotime fonksiyonu parametre olarak verilen metni
zaman bilgisine çevirir… Örneklerde Ġngilizce kullandıldı
çünkü PHP ayarlarının Türkçe destekleyip desteklemediği konusunda bilgimiz olmadığını varsayıyorum. Ġlerde
bununla baĢ etmeyide göreceğiz.
<?php
print strtotime("12th January 1979")
.”<br>”;
print strtotime("01 January 2007 17:30")
.”<br>”;
print strtotime("2007/12/22") .”<br>”;
?>
date () fonksiyonu (tarih zaman bilgisini metne çevirme)
Yukarda gördüğümüz gbi epoch kullanıĢlı bir formattır
ancak son kullanıcı için bu çok bir anlam ifade etme. Çünkü kullanıcı her Ģeyi alıĢtığı gibi isteyecektir. Tarihide
tarih gib görmek ister milisaniye cinsinden bir sayı değil. Bu fonksiyon iki parametre alır ve ikinci parametre
zorunlu değildir. Birinci parametre tarihi çevirmekte kullanacağımız format, ikincisi çevrilmesini istediğimiz
değerdir. Birinci parametre için PHP dilinde tanımlı 31 mümkün değer vardır. Bunlardan istediğimizi seçebiliriz.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
253
Bunların listesi aĢağıdadır ancak bu değerlerin büyük
küçük harf ayrımı yaptığına çok dikkat edilmelidir.
A 12 saatlik Anglo-Sakson
sistemlerinde öğleden önce ("am") veya öğleden sonra
("pm") iĢaretinin verilmesini sağlar.
am-pm
A a ile aynıdır ancak sonucu
büyük harfle yazdırılmasını sağlar.
AM-PM
d Ġki haneli gün sayısı, tek haneli günlerin önüne sıfır
konur
"01" - "31"
D Üç haneli gün adı kısatması "Sal"
F Uzun ay adı "Temmuz"
h 12 saatlik sistemde saat
(tek haneli sayıların önüne sıfır konulur)
01 - 12
H 24 saatlik sistemde saat (tek haneli sayıların önüne
sıfır konulur)
00 – 23
g 12 saatlik sistemde tek haneli saatlerin önüne sıfır
konmadan saat
1 – 12
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
254
G 24 saatlik sistemde tek
haneli saatlerin önüne sıfır konmadan saat
0 – 23
i Dakika 00 – 59
j Tek haneli sayıların önüne sıfır konmadan gün sayısı
1 – 31
l Uzun gün adı (küçük L harfi)
Cuma
L Artık yıl olup olmadığına
iliĢkin Boolean (doğru/yanlıĢ) değiĢken.
Artık yıl ise 1, değilse 0.
1,0
m Tek hanelilerin önüne sıfır
konarak ay sıra numarası
01 – 12
n Tek hanelilerin önüne sıfır konmadan ay sıra numarası
1 – 12
M KısaltılmıĢ ay adı Ock
s Saniye 00 – 59
S Ġngilizce ('ncı anlamına) 2
karakter ek (Türkçe‘dei 2. deki nokta gibi)
th, nd
t Belirtilen ayın gün sayısı 28 – 31
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
255
w Haftanın gün sayısı. Ġlk
günün Pazar yada Pazartesi olması yerel ayarlardan
alınır
0-6
Y Yıl bilgisi dört haneli 2007
y Ġki haneli yıl 07
z Yılın gün sayısı (Artık yıllarıda düĢünerek)
0 - 365
B Swatch internet zamanı 0-999
C ISO 8601 tarih zaman bölge ayarı
2007-06-18T09:26:55+01:00
I Yaz saati uygulaması varmı 1 var 0 yok
O GMT diliminden farkı 200
R RFC-822 biçiminde tarih Sat, 12 Jan 1979
17:30 +0000
T Sunucu için bölge alanı GMT,CET,EST
U Unix zaman pulu 1056150335
W ISO-8601 formatında
haftanın numarası
1-52
Z Bölge ayarı ofseti saniye
cinsinden
-43200 to 43200
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
256
<?php
print date("H:i") . "<br>";
print "dünün tarihi " . date("l", time() - 86400) .
"<br>";
print "Bu yıl" . date("Y") . "<br>";
print date("jS / F Y") . "<br>";
print "Doğum günüm " . date("l", strtotime("01 Apr
1974")) . "<br>";
print (date ("l, d F Y g:i:s")) . "<br>";
?>
Ġlk örnek en çok bilinen formattır. 24 saatlik saat biçimi.
mktime() fonksiyonu (sayılardan tarihi oluĢturma)
mktime ( [saat [, dakika [, saniye [,ay [, gün [, yıl [,
yazsaati]]]]]]]) formatında kullanılan bu fonksiyon kendisine verilen parametrelerden tarih zaman bilgisini
oluĢturur.
<?php
$zamanpulu = mktime(22, 30, 0, 6, 20, 2007, -1);
?>
Örneğin bir banka için kod yazdığımızı varsayalım. MüĢteri 3 ay vadeli bir hesap açtırmayı talep ederse 90
gün sonrasının tarihini bulmak gerekecektir. Bunu elle saymak yerine Mktime ile kendimiz hesaplayabiliriz.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
257
<?php
mktime(0,0,0,date("m"),date("d")+90, date("Y")) ;
?>
checkdate() fonksiyonu-Tarih geçerli mi
PHP dili, devrik yılları fark etmek ve yanlıĢ tarihleri düzeltmek için otomatik denetleme mekanizmasına
sahiptir. checkdate() fonksiyonu, bilginin geçerli bir tarih olup olmadığını, girilen ay, gün ve yıl cinsinden denetler.
if (checkdate (2, 29, 2008) >0)
{
echo ("Tarih geçerli");
}
else
{
echo ("Tarih GEÇERSĠZ");
}
programcığı 2-29-2008 tarihinin doğruluğunu kontrol eder.
setlocale() fonksiyonu (bölgesel ayarlar)
PHP sunucuda gerekli bölgesel ayarlar yapılmıĢ ise
sunucunun değil arzu ettiğimiz bölgenin tarih zaman bilgisini verebilir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
258
<?php
setlocale (LC_TIME, "tr_TR");
print (strftime ("Bugün günlerden: %A "));
?>
Bu kod çalıĢtırıldığında gün adı, Monday,Sunday gibi
Ġngilizce olarak geliyorsa, sunucuda Türkçe için bölgesel ayar desteği yok demektir! Bu durumda aĢaıdaki örnek
kod her türlü koĢulda iĢe yarayacaktır.
Tarih Bilgilerini Türkçe Yazdırmak
<? //tarihyaz.php $gun[0] = "Pazar";
$gun[1] = "Pazartesi"; $gun[2] = "Salı";
$gun[3] = "ÇarĢamba";
$gun[4] = "PerĢembe"; $gun[5] = "Cuma";
$gun[6] = "Cumartesi"; $ay[1] = "Ocak";
$ay[2] = "ġubat"; $ay[3] = "Mart";
$ay[4] = "Nisan"; $ay[5] = "Mayıs";
$ay[6] = "Haziran"; $ay[7] = "Temmuz";
$ay[8] = "Ağustos"; $ay[9] == "Eylül";
$ay[10] = "Ekim"; $ay[11] = "Kasım";
echo date("m")." ".$ay[date("n")]." "
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
259
.date("Y")."<br>".$gun[date("w")];
?>
getdate() fonksiyonu (tarih zaman bilgisini alma)
PHP dilinde zaman ve tarih belirleme iĢleminde en çok getdate() fonksiyonu kullanılır. getdate() fonksiyonu
tarih ve saat bilgisini alır ve belirteceğiniz bir isimdeki dizi-değiĢkende saklar. Dizi değiĢkeninde sırasıyla Ģu
bilgiler yer alır:
10 saniye
45 dakika
5 saat
10 ayın gün sayısı (1-31)
1 haftanın gün sayısı (1-7)
1 ayın sayısı (1-12)
2007 yıl
10 yılın kaçıncı günü
Wednesday günün adı
January ayın adı
1183046641 Unix sistemlerinde Epoch biçiminde zaman bilgisi
$simdi = getdate()
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
260
Matematiksel ĠĢlemlerde Kullanılan Fonksiyonlar Ve ĠĢlevleri
ceil() fonksiyonu (yukarı yuvarlama)
Parametre olarak verilen sayıyı en yakın tamsayıya yuvarlar.
floor() fonksiyonu (aĢağı yuvarlama)
Parametre olarak verilen sayıyı en yakın ve kendisinden
küçük tamsayıya yuvarlar. Bu iĢlem aslında type-casting ile aynıdır ancak type casting daha hızlıdır. Kısaca ceil()
sayının ondalık kısmını atar.
round () fonksiyonu (matematiksel yuvarlama)
round() fonksiyonu verilen parametredeki değiĢkeni
matematiksel kurallara göre yuvarlar. Sayının ondalık kısmı 5 veya üstü ise yukarı, 0 ile 5 arasında ise aĢağı
yuvarlama yapılır. round() iki parametre alır. Birinci parametre iĢlem yapılacak değiĢken, ikincisi ise
yuvarlanacak ondalık hane sayısını gösterir.
Örnek kod;
<?php
$deger = 4.8;
$ceille = ceil($deger); //5
$floorla = floor($deger); //4
$a = round(4.9); // 5
$b = round(4.5); // 5
$c = round(4.4999); // 4
$d = round(4.123456, 3); // 4.123
$e = round(4.12345, 4); // 4.1235
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
261
$f = round(250 / 40); // 6
?>
Örnek kodu en son satırına dikkat edersek eğer yuvarlama fonksiyonlarının dikkatli kullanılması
gerektiğini görürür. ġimdi düĢünelim nakletmemiz gereken 250 tane koyunumuz var ve bunları vagonla
nakledeceğiz. Her vagon maksimum 40 koyun alıyor. ġimdi kaç vagon gerektiğini bulmak için round()
kullandığımızda en son satırdaki kod bize 6.25 sayısını yuvarlayıp, 6 değerini verecek. 6 vagonda bize en fazla
240 koyun nakletme Ģansı verecek. Peki kalan 10 koyun ne olacak ? Oysa round() yerine ceil() kullanmıĢ olsaydık
bu bize 6 değil 7 sayısını verecekti. Kısaca yuvarlama fonksiyonlarının her biri kendi açısından kullanıĢlıdır ve
yerinde kullanılmalıdır.
rand() fonksiyonu (rastgele sayı üretme)
Bu fonksiyon verilen iki paremetre arasında rastgele bir sayı üretir.
mt_rand() fonksiyonu (rastgele sayı üretme)
Bu fonksiyonda verilen iki paremetre arasında rastgele
bir sayı üretir. Aralarındaki fark ise rand gerçekten temel anlamda kodlanmıĢ bir fonksiyondur ve ürettiği değerler
tahmine daha yakındır. mt_rand() ise Mersenne twister kelimelerinden gelir ve özel bir randomize algoritması
kullanıldığını belirtir. Buradaki üretilen sayı rand fonksiyonuna göre ―daha rastgele‖ tabiri caizse daha
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
262
kuvvetli sallanmıĢ bir sayıdır. Tabii bu fonksiyon hız
olarak biraz daha düĢük iĢlem yapmaktadır.
<?php
$rastgele = rand();
$randsiniri = rand(1,10);
$mtrandsiniri = mt_rand(1,100);
?>
ġimdi rand() fonksiyonu ile ziyaretçilerimizi rastgele
Ģekillerde selamlayacak bir kod yazalım.
<?php
switch(rand(1,6)) {
case 1: $slm = 'Hello!'; break;
case 2: $slm = 'Bonjour!'; break;
case 3: $slm = 'Merhaba!'; break;
case 4: $slm = 'Ne haber!'; break;
case 5: $slm = 'Ġyi günler!'; break;
case 6: $slm = 'Nasıl gidiyor!'; break;
}
print $slm;
?>
srand() ve mt_srand() fonksiyonları (ilk sayıyı vererek rastgele sayı üretmek)
Bu fonksiyonlar verilen parametreye göre ilk sayıyı
üretirler, bu saydan ikinciyi, ikincidende üçüncüyü üretirler. Kısaca aslında aynı referanslar verilecek olursa
elde edilecek sonuçta aynı olacaktır. Tabii buna ne kadar rastgele iĢlem denir o da ayrı bir konu.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
263
<?php
mt_srand(123456);
echo mt_rand(1, 100), "\n";
echo mt_rand(1, 100), "\n";
echo mt_rand(1, 100), "\n";
?>
getrandmax() ve mt_getrandmax() fonksiyonları (Üretilebilecek en yüksek sayı)
Bu iki fonksiyon ile rand ve mt_rand fonksiyonlarından geriye dönebilecek ne yüksek sayı bulunur.
abs() fonksiyonu (mutlak değer)
Verilen sayının mutlak değerini dönderir. Mutlak değer
sayının sıfıra uzaklığıdır. Örneğin mutlak -50 değeri
mutlak 40‘dan büyüktür çünkü sıfır değerinden daha uzaktadır.
sqrt() fonksiyonu (karekök alma)
Bir sayının karekök değerini verir. Bu fonksiyon oldukça
yavaĢ çalıĢtığından döngü içinde vs kullanırken dikkatli olunmalıdır.
pow() fonksiyonu (üs alma)
Bu fonksiyon iki parametre alır. Birincisi hesaplanacak
değer, ikincisi ise üs sayısıdır. Pow(10,2) demek 10‘ un 2. üssünü hesapla demektir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
264
hypot() fonksiyonu (hipotenüs hesaplama)
Bu fonsiyon iki parametre alır ve bu iki sayının kareleri toplamının karekökünü alır. Matematikteki Pisagor
teoreminin çözümüdür.
<?php
abs(50); //50
abs(-12); //12
abs(50.1); //50.1
abs(-12.5); // 12.5
print sqrt(25); // 5
print sqrt(26); // 5.0990195135928
print pow(10,2); // 100
print pow(10,3); // 1000
print pow(10,4); // 10000
print pow(-10, 4); // 10000
print hypot(3, 4); // 5
?>
log() fonksiyonu (logaritma)
e tabanına göre logaritma alır.
log10() fonksiyonu (logaritma)
10 tabanına göre logaritma alır.
base_convert() fonksyionu (sayının tabanını değiĢtirme)
Bir sayıyı istenilen sayı tabanından istenilen sayı
tabanına çevirmek için kullanılır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
265
$sayı=base_convert(AA,16,8);// 16‟lık AA
sayısını 8‟lik sayıya çevirir
bindec() fonksiyonu (desimal düzene çevirme)
Binary (2 lik düzen) düzendeki bir sayıyı decimal (10 luk
düzen) düzene çevirir.
$sayi=bindec(101010);
decbin() fonksiyonu (Onluk düzenden ikilik düzene çevirme)
10‘luk sistemdeki bir sayıyı 2‘lik sayıya çevirir
$sayi=decbin(25);
dechex() fonksiyonu (16 lık düzene çevirme)
2‘lik sayıyı 16‘lık sayıya çevirir
$sayi=dechex(101011);
decoct() fonksiyonu (8 lik düzene çevirme)
2‘lik sayıyı 8‘lik sayıya çevirir
$sayi=decoct(1010);
hexdec() fonksiyonu (Hex düzeninden ikilik düzene çevirme)
16‘lık sayıyı 2‘liğe çevirir
$sayi=hexdec(ff00);
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
266
octdec() fonksiyonu (8’lik düzenden 2’lik düzene çevirme)
8‘lik sayının 2‘lik karĢılığını verir.
echo octdec(45453);
max() fonksiyonu (en büyük değeri bulma)
Belirtilen değerlerden en büyüğünü bulur.
echo max(25,8);//25
min() fonksiyonu (en küçük değeri bulma)
Belirtilen değerlerden en küçüğünü bulur.
echo min (25,8);//8
Trigonometrik fonksiyonlar
sin() fonksiyonu (sinüs)
Sinüs değerini dönderir.
cos() fonksiyonu (kosinüs)
Kosinüs değerini dönderir.
tan() fonksiyonu (tanjant)
Tanjant değerini dönderir.
asin() fonksiyonu (arcsinüs)
ArcSinüs değerini dönderir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
267
cos() fonksiyonu (arckosinüs)
Kosinüs değerini dönderir.
atan() fonksiyonu (arctanjant)
Arctanjant değerini dönderir.
Yukardaki ilk üç fonsiyon verilen parametrenin radian değerlerini hesaplar kalan diğer üçü ise bu radyan
değerini parametre olarak alıp değeri hesaplarlar. Radyan değeri sayının PI sayısı (3.14) ile çarpımının
180‘e bölümüdür.
deg2rad() fonksiyonu (açıyı radyana dönüĢtürme)
Verilen değerin radyanını hesaplar.
rad2deg() fonksiyonu (açıyı radyana dönüĢtürme)
Verilen radyan değerini üretecek açıyı elde etmeyi
sağlar.
<?php
$sinus1 = sin(10);
$sinus2 = sin(deg2rad(80));
$cosinus1 = cos(89);
$cosinus2 = cos(deg2rad(9));
$sinus1 = sin(deg2rad(80));
$asinus1 = rad2deg(asin($sin1));
?>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
268
Metin ĠĢleme Fonksiyonları
Programlama dillerinin en önemli parçalarından biride metinler üzerinde iĢlem yapan fonksiyonlardır. PHP dili
bu konuda oldukça geniĢ bir kütüphaneye sahiptir. ġimdi bazı fonksiyonları sırayla görelim.
substr() fonksiyonu (Metnin bir parçasını alma)
substr verilen parametrelere göre metni istenen
karakterden itibaren, istenen sayıda karakterden oluĢan bir parçasını sonuç olarak verir. En az iki parametre
gerekir. Ancak en genel kullanımı üç parametreli halidir.
Substr(değişkenadı, başlangıç, kaç karakter
alınacak)
Sayılardan birisi verilmez ise verilen sayıdan itibaren
metnin sonuna kadar her Ģey alınır.
BaĢlangıç sayısı negatif ise baĢlangıç sondan itibaren hesaplanır.
Alınacak sayı negatif ise sondaki uzunluk byte değerleri hariç her Ģeyi kopyala denilmiĢ olur. (BaĢlangıç sayısı
gözeltimektedir)
<?php
$string = "Ġbrahim Halil Kutluay!"
$a = substr($string, 5);
//im Halil Kutluay!
$b = substr($string, 5, 5);
//im Ha
$c = substr($string, 0, -1); //
Ġbrahim Halil Kutluay!
$d = substr($string, -5); //
luay!
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
269
$e = substr($string, -5, 4); //
luay
$f = substr($string, -5, -4); //
l
?>
str_replace() ve str_ireplace() fonksiyonları (Metin içinde
bul-değiĢtir yapma)
Bazen metnin içindeki bir parçayı aratıp bunu yeni bir değiĢtirmek isteyebiliriz. PHP dilinde bu iĢlem için iki
fonksiyon vardır. Str_replace ve str_ireplace. Str_replace fonksiyonu üç parametre alır ve kullanımı ise
str_replace("Aranan", "yerine konulacak olan",
$Kaynak metin,sayı) şeklindedir.
<?php
$eski = "Ġbrahim Halil Kutluay";
$yeni = str_replace("Ġbrahim", "Ġ.", $eski);
print $yeni;
?>
Yukardaki örnekteki kod metin içinde geçen ―Ġbrahim‖ kelimelerini bulacak ve ―Ġ.‖ olarak değiĢtirecektir. ġimdi
aynı örneği değiĢtirip müstakbel problemimizi tanıyalım.
<?php
$eski = "Ġbrahim Halil Kutluay";
$yeni = str_replace("ibrahim", "Ġ.", $eski);
print $yeni;
?>
Bir önceki ifade ile ilk bakıĢta hiçbir fark yok ancak bu örnekteki str_replace fonksiyonu kendisinden beklenen
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
270
iĢi yapmayacaktır. Çünkü ―Ġbrahim‖ ile ―ibrahim‖
alfabetik olarak eĢit olsada normal ASCII düzeninde eĢit değildir. Sonuçta metinde aranan ifade ―Ġbrahim‖ değilde
―ibrahim" olduğundan str_replace bu metni bulamayacaktır. Bu durumu önlemek içinse str_ireplace()
kullanılır. Str_ireplace fonksiyonu harflerdeki büyük küçük harf ayrımlarına dikkat etmez.
Son parametre olan sayı değiĢkeni verilmiĢ ise metin içinde en fazla o kadar sayıda bul değiĢtir yapılır.
Örneğin metin içinde geçen 10 ―Ġbrahim‖ varsa ve bu parametre 5 ise str_replace bu ifadelerin sadece 5 ini
değiĢtirir.
chr() fonksiyonu (ASCII kodun karakter karĢılığı)
ASCII kod düzeneğinde harfler ve rakamlar birer kod ile
numaralandırılmıĢtır. Örneğin A 65, a 97 koduna sahiptir. Chr fonksiyonu bir sayının ASCII karĢılığını verir. Örneğin
chr(65) bize A harfini verecektir.
ord() fonksiyonu (Karakterin ASCII kodunu bulma)
bir önceki chr () fonksiyonun tam tersine ise ord() fonksiyonu bir karakterin ASCII kod numarasını verir.
Örneğin ord(―A‖) bize 65 değerini verecektir.
strlen() fonksiyonu (Metnin uzunluğunu bulma)
strlen() fonksiyonu tek parametre alır bu bu parametrde verilen değiĢkenin karakter sayısını döndürür. Bu
fonksiyondan dönen değer tam sayı olduğundanr; aritmetik iĢlemlerde kullanılabilir. Örneğin, ziyaretçinin
bir form alanına yazdığı yazının uzunluğunun bizim
istediğimiz sınıra uygun olup olmadığını test edebiliriz:
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
271
<?php
print strlen("ali") . "\n"; // 3
if (strlen($adi) > 25
{ // girilen değer 25 karakterden uzun ise
echo ("Ġsim en fazla 25 harf olabilir!);
}
?>
count_chars() fonksiyonu (Metin içinde karakterlerin tekrar etme sayısını bulma)
count_chars() fonksiyonu metin içindeki karakterlerin
kaçar defa tekrar edildiklerini verir. Ġkinci parametresi verilirse parametre 1 ise kelimeleri bir dizinin elemanları
olarak, parametre 2 ise kelimeleri ve bu kelimelerin metin içindeki baĢlangıç pozisyonlarını bir dizi halinde
verir.
str_word_count() fonksiyonu (Metin içindeki kelime sayısını bulma)
str_word_count() fonksiyonu metin içindeki tekil kelime
sayısını bulur. Ġkinci parametresi verilirse parametre 1
ise tekrar sayısı 0 dan büyükler, parametre 2 ise tekrar sayısı 0 olanlar listelenir.
<?php
$st = "Ġbrahim Halil Kutluay PHP ve HTML
Programlama.";
$a = count_chars($st, 1);
$b = str_word_count($st, 1);
$c = str_word_count($st, 2);
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
272
$d = str_word_count($st);
echo " <br>a değeri <br>";print_r($a);
echo " <br>b değeri <br>";print_r($b);
echo " <br>c değeri <br>";print_r($c);
echo "<br>Metinde $d kelime var \n";
?>
Sonuç çıktısı Ģöyle olacaktır.
a değeri
Array ( [32] => 6 [46] => 1 [72] => 3 [75] => 1 [76] => 1 [77] => 1 [80] => 3 [84] => 1 [97] => 6 [98]
=> 1 [101] => 1 [103] => 1 [104] => 1 [105] => 2 [108] => 4 [109] => 3 [111] => 1 [114] => 3 [116]
=> 1 [117] => 2 [118] => 1 [121] => 1 [221] => 1 ) b değeri
Array ( [0] => Ġbrahim [1] => Halil [2] => Kutluay [3]
=> PHP [4] => ve [5] => HTML [6] => Programlama ) c değeri
Array ( [0] => Ġbrahim [8] => Halil [14] => Kutluay [22] => PHP [26] => ve [29] => HTML [34] =>
Programlama ) Metinde 7 kelime var
strpos() ve stripos() fonksiyonları (Metnin bulunduğu pozisyon)
Bu fonksiyonlarla bir metin içinde bir ifadenin olup olmadığını, varsa da hangi pozisyondan itibaren
baĢladığını bulabiliriz. Strpos() ve stripos() arasındaki fark ise stripos() fonksiyoun nüyük küçük harf ayrımı
yapmamasıdır. Bu fonksiyonlar 0 indexlidir. Yani sonuç 7
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
273
ise aranan metin aslında 8. karakterden baĢlıyor
demektir.
<?php
$str = "Ġbrahim Halil Kutluay strpos()
kullanımı";
print strpos($string, "a") . "\n";
?>
Bu örnekte dönen sayı 3 olmasına rağmen görüldüğü gibi
A karakteri aslında 4. karaterdir.
strstr () ve stristr () fonksiyonları (Metnin ilk bulunduğu yer)
Bu fonksiyonlarla bir metin içinde bir ifadenin ilk
bulunduğu yerden itibaren metnin sonuna kadar olan tüm kısmını alabiliriz. Stristr() ise kontrol iĢlemini büyük
küçük harf ayırmadan yapar
<?php
$str =
"http://www.ibrahimkutluay.net/phpdersleri.php";
$yeni = strstr($str, "www"); //
www.ibrahimkutluay.net/phpdersleri.php
?>
trim(), rtrim(), ltrim() fonksiyonları (Metinden belli bir
karakteri çıkartma)
Normal Ģartlar atında bu fonksiyonlar metin içindeki
white-space dediğimiz boĢluk, sekme (tab) ve yeni satır karakterlerini çıkarır. Ancak ikinci parametresi verilirse
bu parametre içindeki karakterleri metinden atar. Bu
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
274
fonkyionlar ne çok metin içindeki veya önünde-arkasında
bulunan gereksiz boĢlukları traĢlamak için kullanılır.
<?php
$a = trim(" kutluay "); //
“kutluay”
$b = trim(" kutluay ", " ku"); //
“tlay”
$c = ltrim(" kutluay "); //
“kutluay “
?>
wordwrap() fonksiyonu (Metni satırlara ayırma)
HTML kendisi zaten satırları otomatik olarak ekranda yer
kalmayınca aĢağı kaydırmaktadır. Ancak bazı durumlarda bu iĢlemi kendimiz yapmak isteyebiliriz. Örneği 90
karakterlik bir adres bilgisini üç satıra bölmek
isteyebiliriz… wordwrap() fonksiyonu bu iĢi yapar. Hiçbir parametre verilmez ise metni 75 er karakterlik satırlara
böler. Ama ikinci 3. parametreler ile hem satırdaki karakter sayısını hemde satır sonu karakterini belirtmek
mümkündür.
$text = wordwrap($text, 20, "<BR />");
explode() fonksiyonu (Metni bölümlere ayırma)
explode fonksiyonu bir metni verilen bir karaktere göre bölümlere ayırır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
275
implode()fonksiyonu (Metni bölümlere ayırma)
implode fonksiyonu ise explode ile bölümlere ayrılan metni gene eski haline getirir.
<?php
$str1=”PHP, kolay, bir dildir!”;
$bolunmus=explode(“,“,$str1);//virgüller esas
alınarak metin parçalara ayrılır.
$str1=implode(“,”,$bolunmus);
//her bölümün arasına virgül gelecek Ģekilde
metin eski haline getirilir
?>
strtoupper() fonksiyonu (büyük harfe çevirme)
Verilen parametredeki metni tamamen büyük harfe
çevirir. Ancak bu fonksiyon Türkçe karakterleri tanımaz. Örneğin
Ali->ALI, alı ->ALı, aĢlama-> AĢLAMA olarak geri döner.
strtolower () fonksiyonu (küçük harfe çevirme)
Verilen parametredeki metni tamamen küçük harfe çevirir. Ancak bu fonksiyon Türkçe karakterleri tanımaz.
ucfirst () fonksiyonu (ilk harfi büyük harfe çevirme)
Verilen parametredeki metni ilk harfini büyük harfe
çevirir. Ancak bu fonksiyon Türkçe karakterleri tanımaz.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
276
ucwords () fonksiyonu (kelimelerin ilk harfini büyük harfe çevirme)
Verilen parametredeki metni tüm kelimelerindeki ilk
harfleri büyük harf yapar. Ancak bu fonksiyon Türkçe karakterleri tanımaz.
<?php
$str = "ibrahim halil kutluay";
$a = strtoupper($str);
$b = strtolower($str);
$c = ucfirst($str);
$d = ucwords($str);
$e = ucwords(strtolower($str));
?>
number_format() fonksiyonu (Rakamları ekrana biçimlendirerek yazdırmak)
Ekrana rakam yazdırma önemli bir konudur. Örneğin bir maaĢ listesi yazdırırken altalta gelmemiĢ küsuratları
farklı sayılarda rakamlar kullanılırsa kodun ve yazılımn kalitesinden Ģüphe edilir. O yüzden özellikle ondalıklı
sayılar ekrana yazdırılırken, en uygun Ģey ondalık hane sayısının fu fonksiyonla sınırlandırılmasıdır. Ayrıca uzun
sayılarında üçer basamak halinde bölünerek yazdırılmasıda okunurluğunu artırır. number_format
parametresiz kullanılır ise sayıyı üçerli basamaklar ve ondalık haneyi aĢağı ada yukarı yuvarlayarak keser.
AĢağıdaki ilk örekte bu görünmektedir. Ġkinci paramtre
olan ondalık hane sayısı verilirse sayının ondalık hanesine buna uygun hade yuvarlar.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
277
<?php
$sayi = 12345.6789;
$a = number_format($sayi);
//12,346
$b = number_format($sayi, 2);
//12,345.67
$c = number_format($sayi, 3);
//12,345.679
$d = number_format($sayi, 4, ',', '.');
//12.345,6789
echo $a . "<br>" . $b . "<br>" . $c .
"<br>" . $d . "<br>" ;
?>
strcmp () fonksiyonu (iki metni karĢılaĢtırma)
Bu fonksiyon ile iki metni karĢılaĢtırma iĢlemine tabi tutmak mümkündür. AĢağıdaki örnekte fonksiyonun
çaıĢma mantığı görülebilir. Birinci metin ikinciden ASCII olarak önce geliyorsa -1, iki metin aynı ise 0 ve ilk metin
ASCII olarak büyük ise 1 değerini geri dönderir.
<?php
$str1 = "ali";
$str2 = "veli";
$sonuc = strcmp($str1, $str2);
switch ($sonuc) {
case -1: print "ali veliden öncedir ";
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
278
break;
case 0: print "ali ve veli aynıdır ";
break;
case 1: print "ali veliden sonra gelir
"; break;
}
?>
Örneğe bakıldığında Ģüphesiz gözle bile karĢılaĢtırma
yapıp bu fonksiyona ne gerek var demek mümkündür
ancak bu fonksiyonun böyle açıkça yazılan metinler için değil değiĢkenlerle kullanılıdığını unutmamak gerekir.
Son olarak operatörler kısmında gördüğümüz ―===‖ operatörünü hatırlarsak yukardaki örnekte switch
içindeki ikinci satırında aynı iĢlemi yaptığını görebiliriz. Bir PHP efansesi derki ―===‖ operatörü bu fonksyiondan
hızlıdır. Bu belki binlerce iĢlem ardı ardına yapılırsa küçük bir fark için doğru olabilir. Ama asıl sorun Ģudur;
strcmp iki metin aynı ise 0 değeri dönderirken, ―===‖ mantıksal true olarak 1 değeri dönderecektir.
strcasecmp () fonksiyonu (iki metni karĢılaĢtırma)
Kullanımı strcmp ile aynıdır ancak büyük küçük harf
ayrımı konusunda ayrılırlar.
str_pad () fonksiyonu (metnin etrafını boĢlukla (yada karakterle) destekleme)
str_pad metin iĢlerken yararlı bir fonksiyondur. En az iki parametre ile çalıĢır. Ġlk ikisi zorunlu diğerler seçimliktir.
str_pad ( metin, destek uzunluğu [, destek metni [, destek tipi]])
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
279
Sadece iki parametre ile kullanılırsa metnin önüne ve
arkasına verilen sayıda boĢluk karakteri ekler. Ama eklenecek karakter üçüncü parametre ile verilmiĢse
ekleme içleminde bu karakter kullanılır. Döndüncü parametre ile ise ekleme iĢleminin sadece sağa , sadece
sola yada her iki ana yaptırılacağı belirtilir.
<?php
$str = "Merhaba!";
$str1 = str_pad($str, 10);
// " Merhaba! "
$str2 = str_pad($str, 10, 'c');
// "ccccccccccMerhaba!cccccccccc"
$a = str_pad($str, 10, '-', STR_PAD_LEFT);
// "----------Merhaba!"
$b = str_pad($str, 10, '-', STR_PAD_RIGHT);
// "Merhaba!----------"
$c = str_pad($str, 10, '-', STR_PAD_BOTH);
// "----------Merhaba!----------"
?>
printf() ve sprintf() fonksiyonu (biçimlendirerek çıktı verme)
Bu fonksiyonlar C++ dünyasından trasfer edilen özelliklerdendir. Normalde çok sık kullanılır özellikler
olmasalarda, çok sık biçimlendirme yapılan durumlarda daha kısa kod ürettikleri için tercih edilebilirler.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
280
Bu fonksiyonları bir değiĢkenin içeriğini yazdırırken
biçimlendirmekte kullanırız. Printf sonucu tarayıcıya yazdırırken, sprintf ise sonucu değer olarak dönderir. Bu
fonksiyonlarla birlikte kullanılan biçimlendirme parametreleri ise:
b DeğiĢken tamsayı olarak iĢlem görür ve ikili
sayı olarak döner.
c DeğiĢken tamsayı olarak iĢlem görür ve
ASCII değerinin karĢılığı olan karakter olarak döner.
d DeğiĢken tamsayı olarak iĢlem görür ve ondalık sayı olarak döner.
f DeğiĢken kesirli sayı olarak iĢlem görür ve kesirli sayı olarak döner.
o DeğiĢken tamsayı olarak iĢlem görür ve
sekiz-tabanlı (octal) sayı olarak döner.
s DeğiĢken alfanümerik olarak iĢlem görür ve
alfanümerik olarak döner.
x DeğiĢken tamsayı olarak iĢlem görür ve 16
tabanlı (hexadecimal) sayı olarak döner. (Harfler, küçük harf olur).
X DeğiĢken tamsayı olarak iĢlem görür ve 16 tabanlı (hexadecimal) sayı olarak döner.
(Harfler, büyük harf olur).
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
281
% Yüzde iĢareti. Yanında biçim parametresi
gerekmez.
Her iki fonksiyonun da kullanılıĢ biçimi aynıdır:
printf( "biçim" , $degisken1, $degisken2, ... "metin" );
sprintf( "biçim" , $degisken1, $degisken2, ... "metin" );
Burada "biçim" yerine yukarıdaki biçim parametlerinden istediğimizi yazarız. Biçim parametrelerini ayırt etmek
için, önüne yüzde iĢareti konulması gereklidir.
Yukardaki tabloya bakarak bu fonksiyon zor yada
kullanıĢsız görülebilir ancak fonksiyonun iĢlevlerine ve yapabildiklerine bakınca yanıldığınızı anlayacaksınız.
<?php
$hayvan = "kaplan, aslan, yılan";
printf("Etrafta %s - var. Kim korkmazki!",
$hayvan); echo "<br>";
$sayi = 150;
printf("150 binary olarak: %b", $sayi); echo
"<br>";
printf("150 hex olarak: %x", $sayi); echo
"<br>";
printf("150 metin olarak: %s", $sayi); echo
"<br>";
printf("%% ise yüzde iĢareti yazdırır");
echo "<br>";
$sayi2= 123.456;
$bicimli= number_format($sayi2, 2) . "\n";
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
282
print "Biçimli sayı $bicimli\n";
echo "<br>";
printf("Biçimli sayi %.2f\n", $sayi2);
echo "<br>";
?>
1. printf değiĢken ve metinleri ayırmakta daha
baĢarılıdır.
2. Çoklu dil kullanılan kod yazarken çok kullanıĢlıdır.
3. Ancak echo fonksiyonunun hız olarak avantajıda
göz ardı edilmemelidir.
Yukarıdaki tür belirten biçimlendirme parametlerine ek
olarak diğer özellikler Ģöyle sıralanır:
Doldurma karakteri: tek tırnak ve onu izleyen bir
karakterden oluĢur.
Hizalama: Eksi iĢaretinin varalığı yazının sola, yokluğu
ise sağa hizalanma anlamına gelir.
Minimum-Maksimum uzunluk: Sayı-nokta-sayı
(örneğin 20.20 gibi) yazılır; birinci sayı maksimum, ikinci sayı minimum uzunluğu belirtir.
Bu üç özelliğe bir örnek verelim.Bir değiĢkenin değerinin sonuna yanyana yeteri kadar nokta konarak
uzunluğunun 40 karaktere çıkartılmasını Ģu deyimle sağlarız:
<?
$vecize = " Olmaya devlet cihanda bir nefes sıhhat gibi " ;
printf( "%'.-60.60s" , $degisken);
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
283
?>
Burada "%'.-60.60s" Ģeklindeki biçim komutu, metni yazıp sonunuda uzunluk 60 karakter olanada dek
noktalarla dolduracaktır.
Üçüncü biçim komutu olan "%s" ise üçüncü değiĢkenin
sadece metin muamelesi görmesini sağlıyor. Biçim komutlarının arasında boĢluk bulunmaması, ait oldukları
değiĢken değerlerinin de aralarına boĢluk konmamasına sebep olur. Üçüncü değiĢkenin etkisini, kağıt üzerinde
göremeyiz; ancak bu tarayıcı penceresinde bundan sonra gelecek satırların bir satır aĢağı kaymasını sağlayacaktır.
Dördüncü biçim özelliği, ondalık sayıların virgülden (veya noktadan) sonraki ondalık bölümünün kaç hane olacağını
belirler. Bunu da bir örnekle görelim:
<?php
$fiyat = " 500 " ;
printf( "Tutar (ABD) $%.3f" , $fiyat);
?>
Bu kod tarayıcı penceresine çıktı olarak ―Tutar (ABD) $500.000‖ yazdıracaktır.
parse_str() fonksiyonu (get ile alınan değiĢkenleri parçalayarak bir diziye atma)
HTML formları incelerken GET metodunda bilgilerin adres satırından query string adlı bir değiĢkene aktarıldığını
görmüĢtük. Örneğin ―sayfa.php?a=abc&b=def‖ digi. parse_str() fonksiyonu bu metni parçalarına ayırır.
Parametresiz kullanımı mümkündür ancak en uygunu bir
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
284
diziyle kullamaktır. Bu fonksiyon oluĢturdu değiĢkenleri
global olarak tanımlamaktadır.
<?php
$array = array();
if (isset($array['a'])) {
print "a= {$array['a']}<BR />";
} else {
print "a tanımsızdır <BR />";
}
parse_str("a=abc&abc=def", $array);
if (isset($array['a'])) {
print "a= {$array['a']}<BR />";
} else {
print "a tanımsızdır <BR />";
}
?>
Veri ġifreleme Fonksiyonları
cyript() fonksiyonu (Metni verilen bir anahtara göre Ģifreleme)
cyript parametre oan metinleri, verilen anahtara göre Ģifreli kodlar haline çevirir.
<?
$user=”ibrahim”;
echo cyript($user,”deneme”); //$user
Ģifrelenir ve deneme anahtarı bu iĢleme esas
alınır
?>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
285
sha1() fonksiyonu (Metni hash algoritması ile Ģifreleme)
sha1() fonksiyonu Secure HASH Algorithm kelmelerinden gelmektedir. HASH algoritması tek yönlü bir Ģifreleme
algoritmasıdır. Metni HASH‘leyerek 40 bytelık bir değer verir. sha1 verilen her parametre için 40 byte
uzunluğundan bir değer geri dönderecektir. Verdiğiniz parametre 3 harfte olsa, 1000 harfte olsa dönen sonuç
gene 40 byte olacaktır. Böylece güvenli Ģifreleme yapar.
ġimdi denilebilir ki madem sha1 tek yönlüdür ve sha1 ile
Ģifrelen metnin orjinalini yeniden elde etmenin bir yolu yoktur;o halde bu sha1 ne iĢe yarar ki ? Burada çok
derine girmeye gerek yok ama Ģöyle düĢünelim. Kullanıcı Ģifreleri mevcut ve bunlar kod içinde parola = ―benim
parolam‖ gibi kodlanmıĢ durumda. Bu durumda koda
eriĢen herkes parolayı görecektir. Parola veritabanında olsa bile yetkisi olan kullanıcıların eriĢim Ģansı vardır.
Örneğin admin kullanıcı sistem bazında ki herkesin Genel Müdürün bile parolasını görebilmektedir. ġimdi parolaları
açıkta tutmamak için sha1 fonksiyonu bize ne gibi bir imkan verir ona bakalım. ġifre bilgisi ―parola‖ olduğu
takdirde sha1 bunu kendi algoristması ile Ģifreleyecek bir sonuç elde edecektir. Bu tamamen ―garbage‖ yani çöp
tabir edilebilecek hiçbir iĢe yaramayacak anlamsız bir bilgidir. Aynı HASH sonucunu üretmenin tek yoluda aynı
parolayı girebilmektedir.
İşte mükemmel koruma ;
Adminler parola bilgisinin orjinalini PHP ile bile elde edemeyecekler
Ancak kullanıcı parola ile erişim sağlayabilecek
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
286
Adminler görevleri gereği parolayı sıfırlama imkanına
sahip olsalarda bu kullanıcıdan habersiz olamayacak
<?php
print sha1("ibrahim") . "<br>";
print sha1("Ġbrahim") . "<br>";
print sha1("Ġbrahim Halil Kutluay ve SHA ile sifreleme");
?>
Ekrana dönen sonuçlar ise
04bbd3d882dc8b95efba41c3814ca1f1e417aa8f
86cc77f526bb554ccf073dc691e218228e3f23ee 8065019f642faa3d88a9c2f162e68a79bffd6ba7
ifadeleri ve bana ilk halleri ile pek alakalı gibi görünmüyorlar. Özellikle birinci ve ikinci arasındaki tek
bir harf değiĢikliğne rağmen sha1 sonucu oluĢan farka
dikkat etmek gerek.
md5() fonksiyonu (Metni MD5 algoritması ile Ģifrelem)
md5() fonksiyonu Message Digest kelimelerinin kısaltılmasından oluĢturulmuĢtur. Buda sha1 gibi tek
yönlü bir algoritmadır. Farkları ise sha1 40 byte değer döndermesine karĢın md5 32 byte uzunlukta bir değer
geri dönderir. Sonuçta sha1 daha uzun olduğundan aynı sonucu elde etmeye yarayacak metni bulmak çok düĢük
bir ihtimaldir ve denilebilrki sha1 daha güvenlidir. Ancak md5 buna karĢın hız gibi bir avantaj sunar. Bu daha az
güvenli olmak farazi bir kelimedir. Hesap yapalım ve
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
287
bunu görelim; 32 bye demek 128 bitlik Ģifreleme
demektir. Peki bu algoritme bu durumda kaç değer üretebilir. 2128 kadar yani
3.4028236692093846346337460743177e+38 farklı değer geriye dönebilir. ġahsen ben sayıyı okurken bile
zorlanıyorum.
<?php $md5sifre = md5("parolam"); print $md5sifre;
?>
Düzenli Ġfadeler (REGEXPS)
Metin iĢleme fonksiyonlarını kısaca iĢlemiĢ olduk. Peki
daha fazla kontrol ve güç istersek ne olacak. Bu durumda devreye Regexps girecektir. Regular expression
denen olayı anlatmak için eski günlerden bir önek vermek yeterli olacaktır. Eski DOS zamanlarını
hatırlayanlar olabilir. Joker karakterler vardır. Örneğin del a.pdf dosyası sadece bu komutu silerken del *.pdf
dosyası tüm PDF uzantılı dosyaları silerdi. Regexp iĢte bu mantığın programcılığa yansımasıdır. Örneğin
kullanıcıdan bir mail adresi alındığında zararlı
karakterlerin temizlenmesini istenebilir. Bu durumda bu karakterler tek tek temizlenirse belkide 9-10 satır
karakter silme kodu olacaktır. Oysa Regexp ile aynı iĢlemi yapmak tek satırlık bir iĢtir.
Regexpler genelde üç amaçla kullanılırlar
Bul – değiĢtir iĢlemleri
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
288
Metin içinde baĢka bir metin arama veya var olup
olmadığını test etmek
Metinden bir parçayı almak
PHP dili iki tp Regexp destekler. POSIX geniĢletilmiĢ
sürüm ve Perl Uyumlu Regexp sürüm. Bunlar Posix extended ve Perl Compatible Regular Expressions
kelimelerinden gelmektedir. Perl uyumlu Regexp PCRE olarak bilinir ve buna ait fonksiyonlar hem daha güçlü
hem daha hızlıdırlar. Bu yüzde konularda PCRE fonksiyonları takip edilecektir.
Aklınızda bulunsun
1. Regexpler / iĢareti ile baĢlar
2. Regexpler aksi belirtilmediği sürece büyük küçük harf ayrımı yaparlar
3. /i büyük küçük harf ayrımını iptal eder
Temel Seviye Regexpler
Regexp Metin Sonuç
/ali/ ali eĢit
ali/ ali hatalı ifade / ile baĢlaması
gereklidir
/ali/ ALI eĢit değil. Büyük küçük harf
ayrımı var
/ali/i ALI eĢit çünkü büyük küçük harf
ayrımı iptal edilmiĢ
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
289
BaĢlangıç Düzeyi Regexpler
Regexpler [] içinde tanımlı küme kullanımıdana izin
verirler. Buradan itibaren Regexp konusu dallanıp budaklanmaya baĢlayacaktır. Örneğin [Aa] Ģeklinde bir
set tanımlayabilir ve bununla "A" veya "a‖ harflerinin aynı kabul edilmesini sağlayabilrsiniz. Aynı Ģekilde abul
edilebilir karakter setleri oluĢturmanızda mümkündür. [A-Z] tüm büyük harflerin, [A-Za-z] tüm küçük harflerin
kullanımını sağlar. [a-z0-9] ise tüm küçük harfler ve rakamların kabul edilebilir olmasını sağlar. Bu tanımların
inde kullanılacak ^ karakteri (karet) kontrol bloklarındaki ! iĢareti gibi tersi anlamına gelir. Yani [^A-Z] seti büyük
harf olmayan her Ģeyi kabul ederken [^A-Za-z0-9] seti
sadece sembolleri kabul eder yani büyük harfler, küçük harfler ve rakamlar kabul edilmez.
Regexp String Sonuç
/[Aa]bc/ Abc EĢit
/[^Aa]bc/ Abc EĢit değil. Regexp F ve F yi kabul
etmiyor. Bbc,cbc vs eĢit olurdu.
/[A-Z][0-9]/ Z6 EĢit
/[A-D]bc/ Ebc EĢit değil ilk harf en son D olabilir. Sonraki harfler kabul edilmemiĢ
/[A-C]bc/ Bbc EĢit
/[a-z]abc[0-9][0-9]/ AbcAA EĢit değil
/[a-z]abc[0-9][0-9]/ abc99 EĢit
/[a-z]abc[0-9][0-9]/ Abc99 EĢit Değil. Büyük
küçük harf sorunu var
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
290
/[a-z]abc[0-9][0-9]/i Abc99 EĢit. /i kullanılmıĢ
/[^a-z]abc/ Abc EĢit. Set ilk harf için küçük
harf dıĢında her Ģeyi kabul ediyor
/[^a-z]abc/i Abc EĢit değil. ―A‖ uygun gibi
gelebilir ama /i kullanıldığından buda ―a‖ iĢlemi görür
Üst Düzey Regexp Ġfadeleri
Regexp ifadeleri içinde +, *, ?, { }, $, ve ^ karakterleri özel bir anlam ifade etmek üzere kullanılırlar. Ġlk dört
karakter eĢitlik sayısını etkilerken, son ikisi poziyonu etkiler.
? iĢareti {0,1} anlamına gelir. Kendisinden önce yer alan ifadenin en az sıfır en çok bir kere tekrar
edilmesi gerektiğini (olmayabileceğini ama olursa
en fazla bir kere olabileceğini) belirtir.
* iĢareti {0, } anlamına gelir. Kendisinden önce
yer alan ifadenin sıfır veya daha fazla kere tekrar edilmesi gerektiğini (tümüyle opsiyonel olduğunu)
belirtir.
+ iĢareti {1, } anlamına gelir. Kendisinden önce
yer alan ifadenin en az bir veya daha çok kere tekrar edilmesi gerektiğini (bulunmasının zorunlu
olduğunu) belirtir
^ ifadenin baĢta olmasını kontrol eder
$ ifadenin sonda olmasını kontrol eder
{} arasına yazılan kadar sayısı Ģart koĢar
Bu kısa-yolları kullanım örneklerine bakalım:
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
291
^[a-zA-Z0-9_]+ġ En az bir harf veya
rakam yada altçizgi içeren herhangi bir kelime
^[0-9]+ġ Tüm sıfırdan büyük tamsayılar
^\-?[0-9]+ġ Tüm tamsayılar
^\-?[0-9]*\.[0-9*$]+ġ Tüm ondalıkı sayılar
Regexp Metin Sonuç
/[A-Z]{3}/ AbC EĢit değil. Üç büyük
harf gerekli
/[A-Z]{3}/i AbC EĢit. Yukardaki
ile aynı ama /i den dolayı eĢit
/[0-9]{3}-[0-9]{4}/ 236-3800 EĢit 3 rakam,
bir tire(-) ve 4 rakam daha (telefon numarası gibi)
/[0-9]{3}-[0-9]{2}-[0-9]{2}/ 236-38-00 EĢit 3
rakam, bir tire(-) 2 rakam ve yine – ve 2 rakam daha
/[a-z]+[0-9]?[a-z]{1}/ ab1 EĢit değil
ifade en son arakter küçük harf olmalı Ģartını koĢuyor
/[A-Z]{1,}99/ 99 EĢit değil ifade en az bir büyük harfle baĢlamalı
/[A-Z]{1,5}99/ PAPATYA99 EĢit değil en çok ilk 5 karakter büyük harf olabilir
/[A-Z]{1,7}[0-9]{2}/i papatya99 EĢit ilk 7 harf
büyük harf olmalı ancak /i ile büyük harf Ģartı geçersiz
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
292
En Üst Seviye (Guru ) Düzeyi Regexp Ġfadeleri
Tüm bu ifadelerin en sonunda yer alan özel karakterler
çok üst düzey regexp ifadeleri yazılabilir.
. \n hariç her Ģey kabul edilir. k.t = kot kat
ancak <> kart
^.5$ deyimi yeni satırla baĢlamayan ve 5
ile biten herhangi iki karakterli değeri bulacaktır.
\s BoĢluk karakterini bulur
\S Nümerik alfanümerik her Ģeyi kabul eder.
Yatay ve düĢey sekme, kağıt-çıkart, yeni satır, satırbaĢı ve boĢluk dıĢındaki herhangi
bir karakteri bulur.
\b b kelime baĢı ve sonu için iĢlem yapar. /at\b/ = yat kat ancak <> katarakt.
\B B kelime içinde geçen ifadeler (baĢta ve snda olmayan) için iĢlem yapar. Önceki
örnekten hareketle /at\B/ = katarakt veya yatarak ancak <> yat kat
[\b] Geri (Backspace) karakterini bulur.
\cX X yerine yazacağımız kontrol karakterini
bulur. Örneğin, \cA, Ctrl+A'yı, \cZ ise Ctrl+Z'yi bulur.
\d 0'dan 9'ya kadar bir rakamı bulur: IE\d, her
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
293
ikisi de herhangi bir rakamla biten "IE5" ve
"IE4" değerlerini ikisini de bulur,
\D Herhangi bir ondalık iĢaretini bulur.
\f Form-feed (kağıt çıkart) karakterini bulur.
\n Newline (yeni satır) karakterini bulur.
\r Return (satırbaĢı) karakterini bulur.
\t Yatay sekme (Tab) karakterini bulur.
\v DüĢey sekme karakterini bulur.
\w Herhangi bir harf, rakam veya alt-çizgiyi
bulur.
\W Harf, rakam ve alt-çizgi dıĢındaki karakteri
bulur.
\xHex Verilen 16 tabanlı (Hexadecimal) sayıya
uygun Escape karakterini bulur. Örneğin, \n25, % iĢaretini bulur.
[[:alpha:]] Herhangi bir harf
[[:digit:]] Herhangi bir rakam
[[:alnum:]] Herhangi bir harf veya rakam
[[:space:]] Herhangi bir boĢ karakter
[[:upper:]] Herhangi bir büyük harf
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
294
[[:lower:]] Herhangi bir küçük harf
[[:punc:]] Herhangi bir noktalama iĢareti
[[:xdigit:]] Herhangi bir Hexadecimal karakter. [0-9a-
fA-F]
| Veya (\.com|\.com\.tr : ―.com‖ veya
―com.tr‖ değerlerinin bulunmasını sağlar
preg_match() fonksiyonu (metinler eĢitmi)
Bu fonksiyon ile iki metin eĢitmi kontrol edilir. Bir desen ve karĢılaĢtırma metnini parametre olarak alır
<?php
if (preg_match("/php/", "php")) {
print "eĢit!\n";
}
if (preg_match("/php/", "PHP")) {
print "EĢit!\n";
}
if (preg_match("/php/i", "php")) {
print "eĢit!\n";
}
?>
Yukardaki örnekte 1 ve 3 eĢitliği sağlarken 2 büyük
küçük harf ayrımından dolayı eĢitliği sağlamaz. Bunlar temel düzeydi Ģimdi baĢlangıç düzeyine giriĢ yapalım.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
295
preg_match_all() fonksiyonu
Bu fonksiyonda preg_match() gibi çalıĢır. Ancak preg_match() ilk bulduğu metinde iĢlemi bitiriken bu
fonksiyon metnin tümü için iĢlem yapar.
<?php
$a = "yat Kat sat yatarak mat!";
preg_match("/[A-Za-z]at\b/i", $a, $dizi);
?>
Gördüğümüz örnekte fonksiyon ilk eĢitleme örneğinde iĢini yaptğını varsayacaktır.
<?php
$a = "yat Kat sat yatarak mat!";
preg_match_all("/[A-Za-z]at\b/i", $a,
$dizi);
?>
ise tüm eĢitlikleri diziye alacaktır. Eğer isterseniz kodun sonuna var_dump(dizi) fonksiyonun ekleyip sonucunu
görebilrsiniz. Var_dump özellikle dizilerle kullanılan ve içeriğini ekrana basan bir fonksiyondur.
ereg() fonksiyonu (dizilim arama)
Arattığımız karakter sıraanıĢı varsa true yoksa false dağer üretir. Kullanımı ise
deger = ereg("eĢleĢtirilecek_karakter_sırası,$kaynak , $yeni_değiĢken);
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
296
eregi() fonksiyonu (dizilim arama)
ÇalıĢması yukardaki fonksiyon gibidir ancak büyük küçük harf ayrımı yapmaz.
ġimdi bir örnekler email adresinin doğrulamasını yapalım. Ġçinde en az bir @ iĢareti ile en az bir adet
nokta içip içermediğine bakmamız yeterli olacaktır. Böyle bir sınama için gerekli kod Ģöyle olabilir:
<?php
if (eregi("^.+@.+\\..+$", $adr, $email)) {
}
else {
$hata = "Email adresi hatalıdır!<br>";
echo $hata;
include("hatamesaji.php");
exit;
}
?>
ereg_replace() fonksiyonu (dizilim arama ve değiĢtirme)
Dizilim aratma iĢlevinin yanında bazen bulunan bu değerleri baĢkası ile değiĢtirmek isteyebiliriz. Bu iĢ içinse
ereg_replace fonksiyonu kullanılır. Kullanımı ereg_replace("dizilim" , yeni_metin , $kaynak);
Ģeklindedir.
ġimdi bu fonksiyonu kullnarak zararlı karakter giriĢine
engel olan bir örnek görelim. Genelde email adresi girilen
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
297
alanlarda zararlı karakter giriĢine müsati alan olabilir.
Bunların en baĢındada ―<‖ ve ‖>‖ karakterleri gelir. Gerçi bunların arasında bir sürü karakter bulunabilir ancak
baĢında bu karakterler olmadan scriptler çalıĢmayacağından bu bir seviyeye kadar güvenlik
sağlar. Örneğin ziyaretçi defteri uygulaması gibi bir formdan adi, adr ve msg isimli üç değer almıĢ olalım.
<?
$adi = ereg_replace("<","",$adi);
$adi = ereg_replace(">","",$adi);
$adr = ereg_replace("<","",$adr);
$adr = ereg_replace(">","",$adr);
$msg = ereg_replace("<","",$msg);
$msg = ereg_replace(">","",$msg);
?>
split() fonksiyonu (metni parçalara ayırma)
Verilen dizilimi ayraç olarak kullanıp bir değeri parçalara ayırır ve bu ayrılan parçaları birer dizi elemanı olarak
verir. Kullanımı
$yenidizi = split("eĢleĢtirilecek_değerler" ,
$kaynakdeğiĢken, maksimum dönen değer sayısı);
Dönen değer sayısı fonksiyonun döndereceği maksimum
değer sayısını belirtir. Geri dönen dizi en fazla bu sayıda elemana sahip olabilir. Bu parametre verilmez dizinin
eleman sayısı gerektiği kadar otomatik olarak belirlenir. ġimdi split kullanarak bir cümleyi kelimelere ayıralım.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
298
Örnek kodumuz boĢluk karakterlerini arayacak ve
bulduğu yerde kelimeleri saptayacaktır. En sonunda ise for..each döngüsü ile bu kelimeleri sırayla ekrana
yazdırıyoruz.
<?php
$str = "Ġbrahim Halil Kutluay PHP ve Mysql Kullanım
rehberi.";
$ara = " ";
$sonuc = split($ara, $str);
foreach ($sonuc as $deger) {
print "$deger <br>";
}
?>
sql _regcase() fonksiyonu (düzenli ifade üretme)
Ġçeriğinde büyük harf-küçük harf ayrımı olan bir değeri büyük harf-küçük harf ayrımı olmayan Düzenli ifade
haline çevirir. Örnek:
<?php
$str = "Kutluay";
echo(sql_regcase($str);
?>
Bu program, Browser penceresine Ģu metni yazdırır:
[Kk][Uu[Tt][Ll][Uu][Aa] [Yy]
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
299
Kullanıcı Tanımlı Fonksiyonlar GeliĢtirmek
Basit Bir Fonksiyon Yazalım - myecho
Daha önce gördüğümüz gibi ekrana bir Ģeyler yazdırmak
için echo fonksionunu kullanıyoruz. ġimdi Örneği
inceleyelim
<?php
$a=1; $b=2; $c=3; $d=4; $e=5;
echo $a . ―<br>‖;
echo $b . ―<br>‖;
echo $c . ―<br>‖;
echo $d . ―<br>‖;
echo $e . ―<br>‖;
?>
Kodu incelediğimizde her değiĢkenden sonra <br> etiketi
ile alt satıra geçmeyi sağladığını görürüz. ġimdi istiyoruzki ki echo komutu her seferinde bu <br>
etiketini otomatik eklesin bizde bu konuda rahat edelim.
Php dilinde fonksiyonlar function bildirimi ile yazılar.
Fonksiyona iĢlemesi için bir takım değerler aktarılacaksa
bu değer isimleri fonksiyon adının yanına parantez içinde yazılır. Birden fazla değer alıyorsa aralarına virgül
konulur. Dğer aktarılmayacaksa içi boĢ iki parantez konulmak zorundadır. Fonksiyon hesap yapıp bi değer
döndürecekse bu RETURN ile belirtilir.
function fonksiyonun_adı (parametre1, parametre2, ...
parametreN) {
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
300
fonksiyonun yapacağı iĢe iliĢkin komutlar
}
ġimdi basitçe yazdığımız ilk örneğimizi inceleyelim
<?php
function myecho($degisken) {
echo $degisken;
echo "<br>";
}
$a=1; $b=2; $c=3; $d=4; $e=5;
myecho($a);
myecho($b);
myecho($c);
myecho($d);
myecho($e);
?>
ġüphesiz sadece <br> etiketi için fonksiyon yazmak çok mantıklı değil ama aklınıza gelebilecek her konuda
fonksiyon yazmak ve bunu PHP nin içinde hep varmıĢ gibi kullanmak mümkün.
ġimdi biraz daha geliĢtirelim;
<?php
function echobr ($metin) {
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
301
print ("$metin<br>\n");
}
function echoh1 ($metin) {
print ("<h1>$metin</h1>\n");
}
function echoh2 ($metin) {
print ("<h2>$metin</h2>\n");
}
function echoh3 ($metin) {
print ("<h3>$metin</h3>\n");
}
function echop ($metin) {
print ("<p>$metin</p>\n");
}
echoh1 ("Bu H1 BaĢlık");
echobr ("Bu satira Br etiketi kendiliğinden ekleniyor.");
echop ("Bu satıra paragrafetiketi fonksiyon tarafından
eklenmektedir..");
?>
ġimdi yukardaki fonksiyonlar kullanılarak, kod yazılırsa
etiket açıkmı, kapalımı dikkat edilmesine yada kodlama hatalarını düĢğnmeye gerek kalmayacaktır.
ġimdi çarpım tablosu örneği yapalım ;
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
302
<?php $sayi1 = 3;
$sayi2 = 4; function toplama ($sayi1, $sayi2) {
$bakiye = $sayi1 + $sayi2; return $bakiye;
} function cikartma ($sayi1, $sayi2) {
$bakiye = $sayi1 - $sayi2; return $bakiye;
} function carpma ($sayi1, $sayi2) {
$bakiye = $sayi1 * $sayi2; return $bakiye;
} function bolme ($sayi1, $sayi2) {
$bakiye = $sayi1 / $sayi2;
return $bakiye; }
echo toplama($sayi1, $sayi2); echo("<br>");
print cikartma($sayi1, $sayi2); echo("<br>"); print carpma($sayi1, $sayi2); echo("<br>");
print bolme($sayi1, $sayi2); echo("<br>");
?>
GLOBAL ve STATĠK DEĞĠġKENLER
Bütün üst düzey dillerde global ve lokal değiĢken kavramı vardır. PHP dilinde bunlar global ve static olarak
belirtilirler. Kod içinde tanımladığımız değiĢkenler ile bir fonksiyonun içinde tanımladığımız değiĢkenler birbiri ile
aynı kapsama alanında değildir. Bir fonksiyon içinde
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
303
tanımlı bir değiĢkene o fonksiyon içinde yazılan kodlar ile
eriĢilebilir. Fonksiyonda kendisi dıĢında tanımlı değiĢkenlere eriĢemez, değerlerini bilemez ve bunlarla
iĢlem yapamaz. (Yeni $_POST ve $_GET bunun dıĢındadır). Fonksiyon içinde tanmlı değiĢkenlerin
hesaplanan değerlerinin saklanması isteniyorsa bu değiĢkenler static olarak tanımlanmalıdır.
Örneğimize bakalım ;
<?php
$adi = "Ġbrahim Halil Kutluay!";
function yazdir () {
print ("<h1>Adınız: $adi </h1>");
}
yazdir();
?>
Yukardaki örnek ilk myecho örneğimizdeki gibi masum
bir fonksiyon. Ancak bu kodu çalıĢtırırsak ekrana sadece ―Adınız:‖ yazılacak ancak $adi değiĢkeninin içeriği
yazılmayacaktır. Çünkü yazdir fonksiyonu $adi değiĢkenine eriĢemez. EriĢmesi isteniyorsa global
tanımlayıcısı kullanılır.
<?php
$adi = "Ġbrahim Halil Kutluay!";
function yazdir () {
global $metin; // global değere ulaşım
yetkisi alınıyor
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
304
print ("<h1>Adınız: $adi </h1>");
}
yazdir();
?>
ġimdi static örneğini inceleyelim;
<?php
function saybakalim () {
static $rakam = 0;
$rakam++;
print ("<h3>ġu anki sayi: $rakam </h3>");
}
echo ("<h2>1.:</h2>"); saydir();
echo ("<h2>2.:</h2>"); saydir();
echo ("<h2>3.:</h2>"); saydir();
echo ("<h2>4.:</h2>"); saydir();
?>
Eğer rakam değiĢkeni static olmasaydı fonksiyon her
çalıĢmasında rakam değiĢkenini tekrar sıfırdan baĢlatacaktı. Ancak static olarak tanımlanınca değiĢkenin
o anki değeri unutulmamaktadır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
305
Dizi Fonksiyonları
array() fonksiyonu (değerleri diziye çevirme)
En az bir ve üst sınırı belirsiz olmak üere parametre alır ve bu değerleri bir dizi olarak dönderir.
count() fonksiyonu (dizinin eleman sayısını bulma)
Parametre aldığı dizi değiĢkenin eleman sayısını verir.
print_r () fonksiyonu (değiĢken içeriğini yazdırma)
Bu fonksiyon parametre olarak aldığı değiĢken ve içeriği hakkında bilgi verir. Bu değiĢken bir dizi ise dizinin
elemanlarıda buna dahildir. Ġkici bir parametre olarak ―true‖ verilirse sonucu yazmak yerine bir değer olarak bir
değiĢkene aktarmak mümkün olur.
var_dump () fonksiyonu (değiĢken içeriğini yazdırma)
print_r () ile aĢağı yukarı aynı iĢleve sahiptir. Ancak
var_dump() farklı olarak
DeğiĢkenlerin boyutunuda verir
Nesnelerdeki yayınlanmıĢ bilgileri yazdırmaz
Sonucu bir değiĢkene yönlendiremez ve ilgili
parametreyide kabul etmez.
ġimdi örneklerle bu fonksiyonları inceleyelim;
<?php
$benimdizi = array("elma", "armut",
"çilek");
$boyut = count($benimdizi);
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
306
print_r($benimdizi);
?>
Yukardaki örnekte tanımlanan dizi değiĢken üç meyve
adınıda içeren bir container durumuna gelmektedir. $boyut değiĢkeni ise count() ile dizinin eleman sayısını
alacaktır. print_r() fonksiyonu ise ekrana dizi içeriğini yazacaktır.
Array
(
[0] => elma
[1] => armut
[2] => çilek
)
<?php
$benimdizi = array("elma", "armut",
"çilek");
$boyut = count($benimdizi);
print_r($benimdizi);
$cikti = print_r($benimdizi); // iĢlem çıktı
sı bu değiĢkene atılacak
print($cikti);
?>
<?php
$benimdizi = array("elma", "armut",
"çilek");
$boyut = count($benimdizi);
var_dump($benimdizi);
?>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
307
Dizileri Sıra ile ĠĢlemek
Dizileri çeĢitli töntemlerle iĢleyebiliriz. Örneğin for
döngüsünde dizinin baĢından sonuna kadar iĢlem yapabiliriz. Yada for each döngüsü ile dizi elemanları
boyunca iĢlem yapabiliriz. PHP de ayrıca bu iĢ geliĢtirilmiĢ ikide fonksiyon vardır.
list() fonksiyonu
Parametre olarak aldığı dizinin elemanlarını değiĢkenlere çevirir,
each() fonksiyonu
Parametre olarak aldığı dizinin o anki ―array corsor‖
konumundaki anahtar alan ve bunun değerini dönderir.
<?php
while (list($degisken, $deger) =
each($array)) {
print "$degisken = $deger\n";
}
?>
For.. Each ile dizileri iĢlemek
Bu konu daha önce döngüler konusunda kısaca
geçilmiĢti. Burada bir örnek vermekle yetinelim.
foreach ($dizi as $anahtar => $deger) {
print "$anahtar = $deger\n";
}
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
308
For ile dizileri iĢlemek
Bu konu daha önce döngüler konusunda kısaca
geçilmiĢti. Burada bir örnek vermekle yetinelim.
<?php
for ($i = 0; $i < count($dizi); ++$i) {
print $dizi [$i];
}
?>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
309
PHP ve Formlar
PHP dilinin en büyük var oluĢ amacı formlar yoluyla
kullanıcıdan alınan bilgilerin iĢlenmesidir. Daha önce HTML ile hazırladığımız formlarda bazı bilgiler edinmiĢtik.
Bunları kısaca tekrarlamakta fayda var;
1. Formdan bilgiler Get yada Post metodu ile
gönderilir
2. Get ile gönderilen bilgiler ―querystring‖ adlı özel bir değiĢkene, Post ile gönderilenler ―stdin‖
değiĢkenine saklanarak gönderilir.
3. Get metodunda gönderilecek bilgiler adres
satırında görününürler. Satırın sonuna ―?‖ iĢareti eklenerek ―değiĢken=değer‖ ve değiken aralarına
―&‖ kodlanarak bilgi iletilir.
4. ―Query string‖ in uzunluğu belli bir sayıyı
geçemediğinden büyük formlarda kullanılması sakıncalıdır
5. Parola vs sorulan ekranlardada get kullanılması sakıncalıdır.
6. POST metodunda ise kullanıcı bilgileri gönderdikten sonra tarayıcının ―geri‖ düğmesine tıklarsa ―bu
sayfa gönderilmiĢ veriler içermektedir‖ benzeri bir
mesaj görüntüler. Bu da kafa karıĢtırıcı olabilir.
Süper Globaller (Superglobals)
PHP dilinde form verilerini iĢlemek istiyorsak önce süper
globalleri tanımalıyız. Süper global adını almalarının sebebi ise kodumuzun her yerinden ulaĢılabilir
olmalarıdır. Formlardan alınan bilgiler metoda göre farklı
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
310
dizilere alınır. GET ile alınan bilgiler $_GET, POST ile
alınanlar ise $_POST değiĢkenlerine alınır. Bunları bir döngü içinde sırayla iĢlemek yada dizi içeriklerine teker
teker eriĢmek mümkündür.
$GLOBALS Tüm global değiĢkenleri (diğer süper globallerde dahil) eriĢilebileceği bir
dizidir. Kullanımı çok gerekmedikçe tavsiye edilmez.
$_POST Post ile gönderilen değerlerin tutulduğu
dizi ($HTTP_GET_VARS) yerine bu dizi kullanılmalı)
$_GET Get ile gönderilen değerlerin tutulduğu dizi ($HTTP_POST_VARS) yerine bu
dizi kullanılmalı)
$_COOKIE http çerezleri ile gönderilen tüm değiĢkenleri içerir.
($HTTP_COOKIE_VARS) yerine artık bu dizi kullanılmalıdır.
$_REQUEST Yukardaki üç değikenin birleĢtirilmiĢ hali olarak düĢünülebilir. Kullanımı
$GLOBALS‘ e göre daha güvenli olsada
hala güvenli kaynaklı olmayan bilgileri içerebilmesi nedeniyle dikkatli
olunmalıdır.
$_FILES Upload edilen tüm dosyaların tutulduğu
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
311
dizidir. ($HTTP_POST_FILES) yerine
artık bu dizi kullanılmalıdır.
$_SESSION Oturum için kaydedilen tüm değiĢkenleri
içerir. ($HTTP_SESSION_VARS) yerine artık bu dizi kullanılmalıdır.
$_SERVER Kullanılan web sunucunun bize
varsayılan olarak sunduğu değiĢkenleri içerir. ($HTTP_SERVER_VARS) yerine
artık bu dizi kullanılmalıdır.
$_ENV Kullanılan web sunucudaki iĢletim
sistemi tarafından ayarlanmıĢ tüm
sistem değiĢkenlerini içerir. ($HTTP_ENV_VARS) yerine artık bu dizi
kullanılmalıdır.
Gördüğünüz tablodaki birçok değiken eski değiĢkenlerinin yetenekleri artırılmıĢ ve isimleri kısaltılmıĢ halidir. Eskileri dururken neden yenisini
kullanalımki diyecek olursanız üç sebep sayılabilir.
1. Yeni isimler kısa olduğundan kodlama açısından daha
pratik 2. Yeni süper globaller gerçekten kodun her yerinden
eriĢelebilmektedirler. Oysa eski değiĢkenler adları global olsalarda örneğin fonksiyonların içinde iken özellikle talep
edilemeden eriĢelemiyorlardı
3. Kodunuzun geleceği için
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
312
Eski değiĢkenler Ģimdilik kullanım için bırakılmıĢ olsada
Ģimdiden yeni sisteme ayak uydurmanızda fayda vardır. (Zaten kodlanırken isimleri uzun olduğu için yazmasıda
sıkıntı vermekte.) Örneğin değiĢkenlere global eriĢimin güvenlik açığına yol açtığı saptanınca bu iki dizi getirilmiĢ
ama php ayar dosyasında bir ayarla iki kullanımda mümkün kılınmıĢtı. Oysa bugünlerde çıkacak olan PHP 6
da artık bu ayarda olmayacak ve süper dilizlerin kullanımı Ģart olacak. PHP 7 sürümünde ise belkide
HTTP_GET_VARS ve HTTP_POST_VARS değiĢkenleride olmayacak. O yüzden yukardada belirtildiği gibi Ģimdiden
uyumlu kod yazmakta yarar var.
Form Dizaynında Altın Kurallar
1. Form okunuĢu basit, doldurması sıkıcı olmamalıdır
2. Kullanıcı bilgileri neden girmesi gerektiğini kavrayabilmelidir. Örneğin kimlik bilgileri ekranında
―tuttuğunuz takım nedir‖ gibi bir soru olmamalıdır.
3. Formlarda girilen bilgileri doğrulanmalıdır. Aksi
takdirde güvenlik açıkları ve özellikle ―sql injection‖ yöntemiyle hackerlera yakalanabiliriz.
4. Formlardaki etiketler aynı yöne yaslanmalıdır
5. Formlarda istenen bilgilerin sıralaması genel düzene uymalıdır. Örneğin kimlik bilgileri
ekranında önce doğum yeri sonra baba adı sonra adı sorulursa form tuhaf bir hal alır. Ancak bunlar
akla mantığa uygun bir sırada olsa kullanıcı için daha hoĢ ve antıklı bir görünümü oluĢur.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
313
6. Kullanıcıyı hata yapmaktan koruyan bir yapı
gözetilmelidir. Örneğin öğrencilerin sınıf bilgisini alacağımız bir alan düĢünelim. Bu düzyazı olarak
tutulursa, kullanıcı bu alana ―6.a‖, ―6.A‖, ―6-a‖,‖6-A‖, ―6/A‖ girebilir. Bunların hepsi kullanıcı için
gçerli verilerdir ama kullanıcı gerçekten ―6-A‖ sınıfının listesini isterse ne olacak. Oysa daha ilk
baĢta form dizayn edilirken alanı düz metin yerine combobox ile tasarlanmıĢ olsaydı. Kullanıcı sınıf
değerini listeden seçtiği için mecburen aynı değeri girmek zorunda kalacaktı.
Formlardan Bilgi Alma
Formlardan bilgi aktarımı yaparken iki tipte program
kodlayabiliriz. Birinci tipte bir çağıran, birde çağrılan dosya vardır ve biz bu ikisini ayrı ayrı kodlarız. Ġkinci
tipte ise kaynak kod tek bir dosyadan oluĢur ancak dosya kodlamasında bir if..else yapısı ile hem form, hemde bu
formu verileri iĢleyen kısmı kodlanır. Böylece kod üzerindeki kontrolümüz artar ve gereksiz dosya çağırma
zamanlarından kurtlmuĢ oluruz. Ġkili dosya yöntemini görelim.
Form Verilerini ĠĢleme (Ġki dosya ile)
AĢağıdaki örnek get metodunu kullanmaktadır. Amacımız
ise kullanıcının forma girdiği bilgileri ikinci dosyada okuyup ekrana göstermek. Örnek ―Gönder‖ düğmesine
tıklayınca ACTION olayına yazılmıĢ ―hedef‖ dosyasını çağıracaktır. Bilgiler ―hedef‖ dosyasına adres satırına
eklenen bilgilerle oluĢtrulan ―query_string‖ ile
aktarılacaktır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
314
<HTML>
<HEAD>
<TITLE>Form</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="hedef.php" METHOD="GET">
Adınız, Soyadınız: <INPUT TYPE="TEXT" NAME="adsoyad"><br>
E-email: <INPUT TYPE=TEXT" NAME="email"><br>
<INPUT TYPE="SUBMIT" VALUE="Gönder"> <INPUT
TYPE="RESET" VALUE="Sıfırla">
</FORM>
</BODY>
</HTML>
ġimdi hedef.php dosyasını inceleyelim.
<?php
print ("Merhaba <b>$adsoyad</b>\n\n");
print ("<p>E-mail: <b>$email </b></p>\n\n");
?>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
315
Kodu çalıĢtırdığımızda aslında tüm bilgiler iletilmesine
rağmen ekrana sadece ―Merhaba Email‖ satırları gelmekte ama isimleri gelmemektedir.
Eğer sizinin çalıĢtırdığınız örnekte girdiğiniz bilgiler
görünüyor ise sisteminizde güvenlik açığı var demektir.
Burada yapabileceğimiz iki Ģey var ;
Ya tembellik eder PHP.ini dosyasında register_globals
ayarını ―on‖ yapar ve sistemde güvenlik açığına sebep oluruz, yada kodlama Ģeklimizi geleceğe hazır hale getirir
ve bu ayarı gerektirmeyecek Ģekilde kod yazarız. Anladığınız gibi örnek kod eski Ģekilde kodlanmıĢ bir
örnektir. Peki ne yapalımda bu kodu çalıĢır hale getirelim?
Olayın sebebi, form değiĢkenlerinin güvenlik kuralları gereğince kullanılan metoda göre gerekli olan diziden
alınmasıdır. ġimdi hedef dosyanın yeni haline bakalım ve
nasıl çalıĢır hale getireceğimizi görelim.
<?php
$adsoyad =$_GET[adsoyad];
$email =$_GET[email];
print ("Merhaba <b>$adsoyad</b>\n\n");
print ("<p>E-mail: <b>$email </b></p>\n\n");
?>
Gördüğünüz gibi iki satır kod ekledik belki ama kodumuz Ģimdi çok daha güvenli ve hosting Ģirketinin ayarı neydi
diye düĢünmek zorunda değiliz.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
316
Kendi Ģahsıma ait 7-7 tane parasını verip aldığım Türkçe PHP kitabı var. Bunların bir çoğu konuları çok yalın almıĢ,
gene bir çoğundada örnekler eski tipte kodlanmıĢ. Kitap PHP 5 kitabı ve PHP 4 sürümünden beri bu güvenlik
sorunu sebebi ile yeni sitemle kod yazılması gerektiğini neredeyse sağır sultan duymuĢ durumda ama bizim
yazarlar bundan hariç galiba. Çünkü PHP 5 ‗i anlatan kitabımda ―örnek çalıĢmıyorsa register_globals=on yapın
deniliyor. Diyelimki yazara uyup bunu yaptınız; peki kodu hosting Ģirketine attığınızda ne olacak. Gene
çalıĢmayacak. Hosting Ģirketide sırf sizin için sistemini hackerlara açmayacağına göre siz en iyisi yazara değil
aklın gereğine uyun ve doğrusu neyse onu öğrenin.
Form Verilerini ĠĢleme POST Metodu
Yukardaki örnekte methodu GET yerine POST yapmıĢ
olsaydık hedef dosyada aĢağıda değiĢiklikleri yapmamız gerekirdi.
<?php
$adsoyad =$_POST[adsoyad];
$email =$_POST[email];
print ("Merhaba <b>$adsoyad</b>\n\n");
print ("<p>E-mail: <b>$email </b></p>\n\n");
?>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
317
Form Verilerini ĠĢleme (Tek dosya ile)
Bu sefer yazacağımız kod içinde Ģöyle bir mantık
güdeceğiz. Önce $_GET değiĢkenin değerini kontrol edip boĢ olup olmadığına bakacağız. Eğer boĢ ise program ilk
defa çalıĢtığını anlayacak ve kod içinde form kısmını iĢleyip ve ekrana formu gösterip bilgi giriĢi yapılmasını
isteyecektir. Eğer bu değiĢken boĢ değilse demektir ki
program daha önce çalıĢmıĢ ve gönder tuĢuna basılmıĢ ve bu yüzden _GET dizisi içinde iĢlenmek üzere bilgi var.
Bu seferde kodun else bloku çalıĢacak ve bilgileri iĢleyecektir. Formdan girilen bilgileri gene aynı dosyaya
göndermek için PHP_SELF ön tanımlı değiĢkenini kullanacağız. Bu değiĢken bize o an çalıĢan dosyanın
adını vermektetir.
<html>
<head>
<title>Tek dosya ile bilgi alma ve isleme</title>
<META Http-Equiv="Pragma" Content="no-cache">
<meta http-equiv="content-type" content="text/html;
charset=iso-8859-9" />
<meta name="description" content="CSV" />
<meta name="keywords" content="Csv" />
</head>
<body>
<?
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
318
// yukardaki kısımlar html icin gerekli olanlardı.
// Program Ģu mantıkla çalıĢıyor. Önce $_GET değiĢkenin
değerini kontrol ediyor. eğer bu değiĢken boĢ değilse
// gelen bilgi var demektir. bilgileri iĢleyen else kısmına
gidiyor. Aksi takdir yani gelen bilgi yoksa
// ekrana formu gösterip bilgi giriĢi sağlıyor. Gönder
düğmesi ise PHP_SELF sayesinde bilgileri dosyaynın kendisine gönderir.
// Gönderim anında GET dolu olduğundan bu defa bilgiler gösteriliyor
if (!$_GET):
{?>
<table border=1>
<Form Action="<?$PHP_SELF?>" Method="GET">
<tr><td colspan=2 align=center style="font-
color:red;"> Bilgi Alma</td></tr>
<tr><td> Adı</td> <td><input type="TEXT" name="adsoyad"></td></tr>
<tr><td> Email</td> <td><input type="TEXT" name="email"></td></tr>
<tr><td> <input type="SUBMIT" value ="Gönder"></td></tr>
</table>
</form>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
319
<?}
else :
$adsoyad=$_GET['adsoyad'];
$email=$_GET['email'];
echo "Merhaba $adsoyad <br> Email $email";
endif;
?>
</body>
</html>
Eğer form konusunu biraz biliyorsanız ve yukardaki kodu incelediyseniz PHP_SELF yerine sadece dosya adını
yazabileceğimizide görmüĢ olmanız gerekirdi. Örneğin dosya adı ―a.php‖ olsaydı action=‖a.php‖ komutuda aynı
iĢlemi yaptırırdı. Peki PHP_SELF ‗ i kullanmanın faydası
ne olacak denirse dosya adı değiĢikliğinden etkilenmemek ve kopyala-yapıĢtır iĢlemlerinde birde
sonradan dosya adı değiĢtirmemek olarak açıklanabilir.
Yukardaki örnekte ki kullanım mantık ve kodlama açısından doğru sıradır. Bu sırayı aynı Ģekilde
if (empty($_GET)) kontrolü ilede yapabilirdik.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
320
Form Verilerini ĠĢleme POST Metodu
Yukardaki örneği POST metodunu kullanacak Ģekilde
yazarsak kod Ģu hale gelecektir.
<html>
<head>
<title>Tek dosya ile bilgi alma ve isleme</title>
<META Http-Equiv="Pragma" Content="no-cache">
<meta http-equiv="content-type" content="text/html;
charset=iso-8859-9" />
<meta name="description" content="CSV" />
<meta name="keywords" content="Csv" />
</head>
<body>
<?
// yukardaki kısımlar html icin gerekli olanlardı.
// Program Ģu mantıkla çalıĢıyor. Önce $_POST
değiĢkenin değerini kontrol ediyor. eğer bu değiĢken boĢ değilse
// gelen bilgi var demektir. bilgileri iĢleyen else kısmına gidiyor. Aksi takdir yani gelen bilgi yoksa
// ekrana formu gösterip bilgi giriĢi sağlıyor. Gönder düğmesi ise PHP_SELF sayesinde bilgileri dosyaynın
kendisine gönderir.
// Gönderim anında POST dolu olduğundan bu defa
bilgiler gösteriliyor
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
321
if (!$_POST):
{?>
<table border=1>
<Form Action="<?$PHP_SELF?>" Method="POST">
<tr><td colspan=2 align=center style="font-
color:red;"> Bilgi Alma</td></tr>
<tr><td> Adı</td> <td><input type="TEXT"
name="adsoyad"></td></tr>
<tr><td> Email</td> <td><input type="TEXT"
name="email"></td></tr>
<tr><td> <input type="SUBMIT" value
="Gönder"></td></tr>
</table>
</form>
<?}
else :
$adsoyad=$_POST['adsoyad'];
$email=$_POST['email'];
echo "Merhaba $adsoyad <br> Email $email";
endif;
?>
</body>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
322
</html>
Hesap Makinesi Programı
Artimetik operatörleri, switch blokunu ve formları
gördüğümüze göre basit bir hesap makinesi için gereken her Ģey elimizin altında demektir.
<html>
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1254">
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-9">
<body>
<?php
if($_POST)
{
$islem = $_POST['islem'];
$sayi1 = $_POST['ilksayi'];
$sayi2 = $_POST['ikincisayi'];
switch($islem)
{
case "-":
$sonuc = $sayi1-$sayi2;
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
323
break;
case "/":
$sonuc = $sayi1/$sayi2;
break;
case "*":
$sonuc = $sayi1*$sayi2;
break;
case "+":
$sonuc = $sayi1+$sayi2;
break;
default:
echo 'Hata oluĢtu.';
}
}
?>
<form action=="<?$PHP_SELF?>" method="post">
<input type="text" name="ilksayi" size="1">
<select name="islem">
<option value="*">x</option>
<option value="/">/</option>
<option value="+">+</option>
<option value="-">-</option>
</select>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
324
<input type="text" name="ikincisayi" size="1">
<input type="submit" value="="> <?=$sonuc?>
</form>
</body>
</HTML>
Basit Bir ġifreli GiriĢ Sayfası
Web sitelerinde gördüğümüz bir sistem olan Ģifreli
sistemlere basit bir örnek yapalım.
<?php //basitparola.php if (!isset($parola) || $parola != "FB") {
?> <FORM ACTION="basitparola.php" METHOD="POST">
Parola: <INPUT NAME="parola" TYPE"password"><BR> <INPUT TYPE="submit">
</FORM> <?php
} else {
echo"korumalı alana hoĢgeldiniz "; }
?>
Örneğimizde parola bilgisi kodun içinde yazılmıĢtır. Bu
Ģekilde olunca kullanıcının parolayı değiĢirme imkanı yoktur. Ayrıca prola kod içinde metin lrak kodlandığından
sunucuya dosya eriĢimi olan herkes kodu görecek kısaca paolayı öğrenebilecektir (örneğin hostng firması
çalıĢanları).
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
325
Birden Fazla Sayfaya Yayılan Formlar
Bazen uğraĢmamız gereken formlar tek bir sayfa için
fazla gelebilir. Bunları birden fazla sayfaya yayılmıĢ formlarda toplayıp öyle kullanmamız icap edebilir. Bu
iĢlem için üç alternatifimiz vardır.
1. Form konularında ögrdüğümüz gibi Hidden alanlar
kullanmak
2. Bilgileri bir tabloya yazmak
3. Bilgileri oturum değĢkenlerinde tutmak.
Kullanım ve hata kontrolü açısından en rahatı ise birinci yöntemdir. Zaten POST metodu kullanıacak olursa
gönderilen bilgi boyutuda sorun olmadığından bu gayet mantıklı bir durumdur. Hidden alan kullanımına örnek
olarak ise
<INPUT TYPE="HIDDEN" NAME="isim" VALUE="<?php
print $_POST['isim']; ?>">
verilebilir.
PHP ile Posta Gönderme
Gerek PHP gerekse HTML içinde form komutları görüldüğü kadarı le basit bir geri besleme (feedback)
yada iletiĢim saufası yapmak kolaydır. ĠĢin aslı burada kolaya kaçıp formun action kısmında
<form name="form1" method="post" action="mailto:[email protected]">
denilmesi bu iĢlem için teknik anlamda yeterlidir. Ancak burada formu dolduran kiĢinin bilgileri size POST formu
nasıl yolladı ise öyle gelecektir. DeğiĢken adı, &
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
326
iĢaretleri, = iĢaretleri %20 karakterleri vs vs. Kısaca bu
bilgiyi okumak zordur ve bunu teknik bilgisi olmayan birisine kabul ettirmek zordur. (Teknik bilgisi olan birisi
ise bunu görünce zaten sizle çalıĢmaktan vazgeçer)
Peki ne yapmalı. Aklın yolur birdir. Demek ki formdan
bilgiler alınıp toplanmalı daha sonra uygun Ģekilde biçimlenip PHP‘ nin kendi fonksiyonları ile e-posta olarak
gönderilmelidir.
Not:
Bu kodu kendi bilgisayarınızda denemeniz için bir
SMTP sunucuya ihtiyaç vardır. Internet ortamında
ise emrinize ait bir SMTP sizi bekliyor olacaktır.
mail() fonksiyonu – PHP ile eposta göndermek
Mail fonksiyonu Mail (kime, konu, mesaj, [ek_baĢlıklar]); Ģeklinde kullanılır.
Bu fonksiyon ile e-posta otomatik olarak "kime" kısmındaki kiĢiye veya kiĢilere gönderilir. Her bir virgül
(,) ayrı bir kısmı göstermektedir. Burada kısımdan kast edilen Ģey bir epoastanın kısımlarıdır. Hedef adres, konu,
bilgi, karbon kopya, gövde metni gibi. Örneğin:
mail("[email protected]", "Deneme", "Merhaba\nBu bir
denemedir\nHoĢçakalın.");
Ek baĢlıkları da yazarsak:
Mail ("[email protected]", "Deneme", "Merhaba\nBu bir denemedir\nHoĢçakalın.", "From:
[email protected]\n‖,‖Reply-To: [email protected]");
Ek BaĢlıkların tümünün daima çift tırnak içinde olduğuna
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
327
ve birbirlerinden "\n" ile ayrıldıklarına dikkat edilmelidir.
Bu yazım Ģekli mesajı oluĢtururken de geçerlidir. Mesajı oluĢtururken bir alt satıra geçmek için her zaman ―\n‖
karakteri kullanılmalıdır.
Posta yollarken en sık kullanılan başlıkları
listeleyelim:
From (Kimden)
Reply-to (Cevabın yollanacağı adres)
Cc (Carbon Copy - Karbon kopya)
Bc (Blind Copy - Kör Kopya - gönderdiğiniz e-posta adreslerini gizler)
ġimdi kullanıcının girdiği isim, eposta adresi, yorum bilgilerini [email protected] adresine ―web sitesinden
gönderildi‖ konusuna sahip bir epoasta olarak gönderecek kodu inceleyelim. Burada kullanılacak
formda
isim (ziyaretçi dolduracak)
eposta (ziyaretçi dolduracak)
yorum (ziyaretçi dolduracak)
kime ([email protected])
konu (―web sitesinden gönderildi‖)
Ģeklinde bilgilerin kaynağını belirleyip buna uygun bir
format oluĢturalım.
Önce formu hazırlayalım ve dosyayı feedback.php olarak
saklayalım:
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
328
<html>
<head>
<title>Yorum Gönderme Formu</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>
<!-Bilgiler sender.php dosyasına gönderilecek -->
<form name="eposta" action="sender.php"
method="post">
<table border="0" cellspacing="2" cellpadding="2"
align="left">
<tr> <td colspan="2"> <p align="left">Lütfen
yorumunuzu gönderin.</p></td></tr>
<tr>
<td width="98"> Ad Soyad: </td>
<td width="150"><input type="text" name="isim"><!-- 1. DeğiĢken alındı "isim" --></td>
</tr>
<tr>
<td width="98"> E-Posta: </td>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
329
<td width="150"><input type="text" name="eposta"><!-- 2. DeğiĢken alındı "eposta" --
></td>
</tr>
<tr>
<td width="98">Yorumlarınız </td>
<td width="150"> <textarea name="yorum" cols="55" rows="10"></textarea></td></tr>
<!-- 3. Degisken alındı "yorum" -->
<!-- 4. ve 5. Degisken "kime" ve "konu" ise zaten belli olduğundan ―hidden‖ ile veriliyor-->
<br><input type="hidden" name="kime" value="[email protected]">
<input type="hidden" name="konu" value="web sitesinden gönderilmiĢtir">
<!-- 6. ve 7. değiĢkenler ise buton olduğundan Php
karĢılığı değer almaya gerek yoktur. -->
<tr><td>
<input type="submit" name="gonder" value="Gönder">
<input type="reset" name="Submit" value="Sil">
</p>
<p>Lütfen 10 sn. bekleyin. Tekrar Gönder
butonuna basmanıza gerek yoktur.</p>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
330
</td> </tr>
</table>
</form>
</body>
</html>
ġimdi bu verileri kullanarak elektronik postamızı hazırlayıp yollayacak PHP kodumuzu yazalım:
<?php
$mesaj = "Ad Soyad: " . $isim . "\n";
$mesaj .= "E-Posta: " . $eposta . "\n";
$mesaj .= "Yorum: " . $yorum . "\n";
$extra = "From: $kime\n";
$extra .= "Reply-To: $eposta\n";
$extra .= "Bcc:[email protected]\n";
$extra .= "Content-Type:text/plain; charset=\"iso-8859-9\"\n";
$extra .= "Content-Transfer-Encoding: 8bit\n";
mail($kime, $konu, $mesaj, $extra);
?>
HTML sayfalarını yayınlarken geçerli olan bütün kurallar, e-posta hazırlarken de geçerlidir: Ġçeriğin hangi karakter
seti ile okunması gerektiğini mutlaka belirtmelisiniz, aksi takdirde e-postanız farklı e-posta istemcilerinde farklı
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
331
sonuçlar verecektir! Bu sorunu çözmek için, $extra
değiĢkenine Content-Type ve Content-Transfer-Encoding değerleri eklenmiĢtir. Postanın BCC bölümüne de bir e-
posta adresi yazılarak epostanın aynı zamanda [email protected] adresinede bilgi olarak geçilmesi
sağlanmıĢ oldu.
Son olarak akılda tutulması gereken konu ise kullanıcıyı sonuçtan haberdar etmektir. Böylece hem kullanıcı dostu
bir kod yazılmıĢ olur hemde kullanıcı postanın gönderildiğini görür ve merakta kalıp iĢini sağlama almak
için ikinci bir posta göndermez. Bunun için yukarıdaki
kodun altına sadece birkaç HTML kodu eklenmesi yeterli olacaktır. Sender.php dosyasının son durumu:
<?php
$mesaj = "Ad Soyad: " . $isim . "\n";
$mesaj .= "E-Posta: " . $eposta . "\n";
$mesaj .= "Yorum: " . $yorum . "\n";
$extra = "From: $kime\n";
$extra .= "Reply-To: $eposta\n";
$extra .= "Bcc:[email protected]\n";
$extra .= "Content-Type:text/plain; charset=\"iso-8859-9\"\n";
$extra .= "Content-Transfer-Encoding: 8bit\n";
mail($kime, $konu, $mesaj, $extra);
?>
<html>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
332
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1254">
<title>Merhaba; Sayın <?php echo($isim) ?>,
formunuz baĢarıyla alındı.</title>
</head>
<body>
<b>Sayın <font color="Purple"><?php echo($isim);
?></font>,
formunuz <b><font color="Purple">
<?php echo($kime); ?></font></b> adresine gönderilmiĢtir.
TeĢekkür ederiz.</b>
</body>
</html>
Bu kodu keni bilgisayarınızda denemek için bir SMTP
sunucuya ihtiyacınız olduğunu hatırlatalım. Ayrıca bu SMTP sunucu varsa ve Windows altında çalıĢıyorsanız,
―php.ini‖ dosyasını açın ve [mail function] baĢlığı altındaki ayarlarınızı Ģu Ģekilde değiĢtirin:
Kullandığınız bilgisayarda kurulu bir SMTP sunucusu varsa:
SMTP = localhost ;for win32 only (Kendi serverınızın smtp ayarını yazın)
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
333
[email protected] ;for win32 only (Email
adresinizi yazın)
Öte yandan kendinize ait POP3 ve SMTP destekli bir
adresiniz var ise bunu da kullanmanız olasıdır.
Web Sayfasından Bir Siteye Dosya Yükleme
(Upload)
Upload terimine uygun bir Türkçe karĢılık bulmak sorun.
Biz yükleme diyip geçelim. Normalde kullanıcılar internette gezer yada dosya indirir. Formları iĢlerken
gördüğümüz INPUT etiketinin TYPE="file" parametresi ziyaretçiye Web sunucusuna dosya yükleme (upload)
imkanı sağlamaktadır. Ancak HTTP buna izin versede tarayıcı programları bu yeteneği ileriki sürümlerinde
kazandılar.
Bu endiĢe birazda haklıdır. DüĢünecek olursak; örneğin
kullanıcıdan CV dosyasını yüklemesini istedik. Peki
kullanıcı bunu Word formatındamı yükledi yoksa HTML formatındamı. Peki ya kullanıcı bir punduna getiripte
hack için kullanılabilecek bir dosya yüklerse ne olacak.
Görüldüğü üzere dosya yükleme (upload) olayı hafife
alınacak bir konu değildir. Ġnternette herkesi kötü niyetli gibi düĢünüp ona göre tedbir almak gerekir.
<HTML>
<HEAD>
<TITLE>PHP Kullanarak Dosya Gönderme</TITLE>
<meta http-equiv=\"content-type\"
content=\"text/html; charset=ISO-8859-9\">
</HEAD>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
334
<?php
$dizin = "files/";
$url = "http://localhost/";
if ( isset ( $gonder )) {
print ("<b>Yol:</b> $gonder<br>\n");
print ("<b>Adı:</b> $gonder_name<br>\n");
print ("<b>Boyut:</b> $gonder_size<br>\nst");
print ("<b>Tür:</b> $gonder_type<br>\n");
copy ( $gonder, "$dizin/$gonder_name" )or die
("Dosya kopyalanamadı!");
if ( $gonder_type == "image/gif"
||$gonder_type == "image/pjpeg" ) {
print ("<img
src=\"$url/$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="500000">
<INPUT TYPE="file" NAME="gonder"><BR>
<INPUT TYPE="SUBMIT" VALUE="Dosya Yükle!">
</FORM>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
335
</BODY>
</HTML>
Bu programda <INPUT TYPE="file" NAME="gonder"> etiketinde kullandığımız NAME parametresine verdiğimiz
değer, ziyaretçimizin göndereceği dosyanın sunucu tarafından kaydedileceği geçici dizinin tam yolunun
yazılacağı değiĢkenin adı olacakdır. PHP, bu dosya ile ilgili her türlü bilgiyi bu adla kaydedektir. PHP,
ziyaretçiden bir dosya baĢarıyla aktarıldığı anda otomatik olarak bu isimden yararlanarak Ģu değiĢkenleri oluĢturur:
$gonder
Geçici kayıt dizini yolu (UNIX'te /tmp/phpXXX,
Windows'da Windows/TEMP0phpXXX Burada XXX yerine ziyaretçilerin gönderdiği dosyaların sıra numarasını
göreceksiniz.)
$gonder_name
Ziyaretçinin gönderdiği dosyanın adı.
$gonder_size
Ziyaretçinin gönderdiği dosyanın boyutu.
$gonder_type
Ziyaretçinin gönderdiği dosyanın türü
PHP ayrıca bu bilgileri $_POST dizi-değiĢkeninde de
tutar. Yukardaki programda Ģu iki değiĢken çok önemlidir:
$dizin = "/inetpub/wwwroot/";
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
336
$url = "http://server/";
$dosya_dizin adıyla oluĢturduğumuz değiĢkene
vereceğimiz değer, ziyaretçinin göndereceği dosyanın kopyalanacağı klasörün adı olarak kullanlacaktır.
Sözgelimi Windows ortamında buraya kiĢisel Web sunucunun varsayılan klasörünün adını yazabilirsiniz.
PHP SERVER DEĞĠġKENLERĠ
PHP sistem bazında yapılacak bazı iĢlemleri kolaylaĢtırma
için ön tanımlı değikenler kullanır. Ancak burada bazır değiĢkenleri her sunucu için geçerli olmadığını
unutmamalıyız. Bu değiĢkenlerin en genel olanlarına bir göz atalım.
PHP_SELF: ÇalıĢan PHP programının bulunduğu
dizin ve adını verir. Özellikler kendi çağrı yapan formlarda bu değer çok
kullanılır.
QUERY_STRING Get metodu ile bilgi alınırken
tarayıcının göndereceği bilgilerin tutulduğu değiken
REMOTE_ADDR Ziyaretçinin bilgisayarına ISS
tarafından atanmıĢ IP adresi
REQUEST_METHOD Form ile gelen bilgilerin gönderildiği
metod: GET veya POST
REQUEST_URI O anda çalıĢmakta olan PHP dosyasının adı ve varsa bu ada
eklenmiĢ Query_String
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
337
SCRIPT_FILENAME O anda çalıĢmakta olan PHP
programının dosya adı
SCRIPT_URI O anda çalıĢmakta olan PHP
programının tam URL adresi
SERVER_PROTOCOL Sunucunun HTTP protokolünün sürümü
SERVER_ADDR Sunucunun IP adresi
HTTP_USER_AGENT Kullanıcının sayfayı gezmek için kullandığı tarayıcının imzası. Bir çok
site bu imzaya bakarak farklı kod parçalarını kullanıp uyumsuzluk
sorunlarını elimine etmeye çalıĢmaktadır
HTTP_REFERER Kullanıcın bizim sayfamıza gelmek için tıkladığı linkin bulunduğu sayfa
<?php
phpinfo()
?>
Yukardaki örnek kod kurulu olan PHP programına ait
bilgilerin yanında yukardaki değerleri ve diğer tüm değiĢkenleri listelemektedir. Ancak istenirse özel bir
değiĢkene ait kod yazmak mümkündür.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
338
Kullanıcının Girdiği Değerlerin Doğruluğunu Kontrol Etme
Kullanıcının girdiği değerlerin doğruluğunu kontrol etmek
programın iĢleyiĢi açısından önemlidir. Örneğin kullanıcıya listelemek istediği sınıfı seçmesi için bir form
sunmuĢ olalım. Kullanıcı hiçbir sınıf girmeden ―gönder‖ butonuna tıklarsa ne olacak, ya da sınıf bilgisinde yer
alması imkansız bir kararter girerse ne olacak.
Kullanıcı bir form doldururken dört tür hata oluĢabilir
1. Hatalı girilmiĢ bilgi. Örneğin 01.01.2007 yerine
01/01/2007 gibi.. Yada saat için 10.35 yerine 1035 girmek gibi
2. Tehlikeli bilgi. Özellikle hacking için
3. YanlıĢ bilgi. Avantaj sağlamak için aldatıcı verilen
bilgiler.
4. GirilmemiĢ bilgi.
Doğrulama iĢleminin yapılabileceği iki yer vardır. Kullanıcı tarafı ve sunucu tarafı. Kullanıcı tarafında
Javascript le yazılmıĢ kodlar daha girilirken bilginin kontrolünü sağlarlar. Kullanıcı tarafındaki doğrulamanın
avantajı iĢlem hızlanır ve kontrol anında yapılır. Dezavantajı ise ilave kod ve javascript bilgisi gerektirir.
Sunucu tarafı doğrulama ise form verisi hatalı ise veriler
git-gel-geri git iĢlemine tabi tutulacağından sunucuya binen yük artar. Ancak buradaki kontrollerde gerçekten
daha detaylı olabilirler.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
339
Windows ve Unix Dosya EriĢim Yetkilendirmesi
Her ne kadar ülkemizde çoğunluk Windows yüklü
bilgisayarlarda olsada hosting sistemlerinde genelde Linux yüklüdür. O bakımdan bu konu anlaĢılmalıdır.
Sadece dosya fonksiyonları için değil FTP komutlarını kullanırkende bu bilgiler gerekli olacaktır. Windowsta bu
iĢlem ACL denilen Access Control List ile yapılır. Dosya nitelikleri dosyaya olan yetkilerimizi belirtir. Ancak
dosyanın çalıĢtırılabilir bir dosya olup olmadığını ise Windows dosyanın uzantı adından anlar. Unix bu konuda
farklı bir yaklaĢım uygular. Unixte her dosya ve klasör için kullanıcıların ayrı ayrı yetkileri vardır. Örneğin bir
klasörde duran bir dosya için her kullanıcının okuma,
yazma ve çalıĢtırma anlamında farklı yetki dereceleri vardır. Kısaca unix yada Linux sistemlerde bir dosyanın
var olduğunu bilmeniz hatta dosya listesinde görmeniz o dosyaya eriĢebilme yazda dosyaya yazabilme yetkiniz
olduğu anlamına gelmez. Unix sitemleri için
u : dosya/dizinin sahibi (user)
g : dosya/dizinin sahibiyle aynı grupta olanlar (group)
o : diğer kullanıcılar (others)
a : herkes (all)
Bunların her biri için yetkilerin sayısal değeri hesaplanır.
Okuma yetkisi r, yazma yetkisi w çalıĢtırma yetkisi ise x ile ifade edilecek olursa r : 4, w : 2, x : 1 sayısal değerini
taĢır. Bu hesabın sonucu ise chmod komutu ile dosyaya
uygulanır.
Bir örnekle durumu inceleyelim. Dosya.txt dosyasının
kullanıcı yetkilerini sahibi için, tüm iĢlemler, grup için
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
340
okuma ve çalıĢtırma, diğerleri içinse sadece çalıĢtırma
yetkisi olacak Ģekilde ayarlayalım. ĠĢlem sırası Ģöyle olmalı. U, G, O harflerini yazıp altlarına sırası ile rwx
harflerini koyup ve örnekte görüldüğü gibi verilen ifadelerden – veya + olarak yetkileri yazıp daha sonra
bunların sayısal değerini hesaplayabiliriz.
U G O
rwx rwx rwx
+++ +-+ --+
4+2+1 4+0+1 0+0+1
Sonuç değeri ise U için 7, G için 5 ve O içinse 1 olur.
Bunları yan yana yazarak chmodi ile kullanılacak 751 değeri bulunur. Buradan anlayacağınız gibi 777 niteliği
olan bir dosya herkes arafından her iĢleme açık durumdadır.
FTP programları dosya niteliği ayarlarken rastgele 777 değerini kullanmamaya özen gösterilmelidir. Buna dikkat
edilemezse böyle bir açık bekleyen hackerlar can
yakabilir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
341
PHP Klasör Fonksiyonları
mkdir() fonksiyonu (Klasör oluĢurmak)
Bu fonksiyonlar eğer sunucudaki yetkilerimiz izin veriyorsa klasör oluĢturabiliriz.
mkdir ("test", 777);
777 parameresi klasör için izinleri belirtir ve sadece Unix
ve türevlerinde geçerlidir.
rmdir() fonksiyonu (Klasör silmek)
Bu fonksiyonlar eğer sunucudaki yetkilerimiz izin veriyorsa klasör silebiliriz.
rmdir ("test");
chdir() fonksiyonu (Klasör değiĢtirmek)
Bu fonksiyonla aktif klasörü değiĢtirebiliriz.
is_dir() fonksiyonu (Dizin mi)
yukardaki örnekte görülebileceği gibi bir parametrenin bir klasör olup olmadığını test etmek içinse bu fonksiyon
kullanılır. Ġsim bir klasöre aitse fonksiyon true/doğru,
değilse false/yanlıĢ sonuç verir. Örnek:
<?
if ( is_dir ( "/klasor1" ) )
print ("Bu bir klasor!");
?>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
342
opendir() fonksiyonu (Klasörü açmak)
Bir klasörü açar. Deyim yerindeyse okumak için müsaitmi kontrol eder.
readdir() fonksiyonu (Klasörü okumak-listelemek)
Klasörün içindeki dosya ve alt klasör isimleri sıra ile okur.
closedir() fonksiyonu (Klasörü kapatmak)
Opendir ile açılan klasörü kapatır.
<?php
$klasor_adi = "./";
$klasor = opendir ($klasor_adi);
while ( gettype ( $info = readdir( $klasor ) ) !=
boolean ) {
if ( is_dir( "$klasor_adi/$bilgi" ) )
print " [Klasör] " ;
print ("<A
href=\"$klasor_adi/$bilgi\">$info</A><br>\n");
}
closedir ($klasor);
?>
Yukardaki örnek kodla; alt klasörler sıra ile HTML
formatında listelenmektedir. AĢağıdaki kod ise dosyaları listelemektedir.
<?
$dizinler=opendir(".");
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
343
while (($dosya = readdir($dizinler))!==false)
{ echo ("<li>$dosya\n");
}
closedir($dizinler);
?>
ġimdi kapsamlı bir örnekle dosyaları listeleyip, link
halinde gösterlim ve tıklanan dosyayıda içerik olarak okuyup ekrana çıkaralım.
Öncelikle dosyaları listeleyen kod liste.php
<?
if ($basla)://form doldurulmuĢsa if-else arası
kısım çalıĢır
$i=1;
$dizinler=opendir("$yol");//dizini açıyoruz
while (($dosya = readdir($dizinler))!==false)
/*dosyalar bitinceye kadar okuyor ve atama
yapıyoruz*/
{
if ((substr($dosya,-4,4)==".php") &&
$yol!=""):
/*eğer dosya adının sondan 4‟hanesinden
itibaren 4 hanesi .php ise yap*/
echo ("<li><a
href=dok.php?ad=$yol/$dosya>$dosya</a><br>");
$i++;
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
344
elseif ((substr($dosya,-4,4)==".php") &&
$yol==""):
echo ("<li><a
href=dokum.php?dosyaad=$dosya>$dosya</a><br>");
$i++;
else:
$i++;
endif;
}
closedir($dizinler);
else: //form doldurulmamıĢsa else-endif bloğunu
yapar yani yol ister
?>
<form action="liste.php" method="post">
Yol <input type="text" name="yol"><br>
<input type="submit" name="basla"
value="gonder">
</form>
<?
endif;
?>
Bu kod ise dokum.php
<? //dokum.php
show_source($dosyaad);
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
345
/*diğer dosyanın adres satırından gelen $dosyaad
değiĢkeninin ifade ettiği dosya içeriğini ekrana
döker*/
?>
Örnek çalıĢtırıldığında ekrana form gelecektir. Burada
içeriğinin görüntülenmesi istenilen dizin adı girilir, eğer boĢ geçilirse dosyanın bulunduğu dizin baz alınır. Daha
sonra dosyalar tek tek listelenecektir. Herhangi bir dosya adı tıklandığında ise show_source fonksiyonu
çalıĢacak ve dosyayı görüntüleyecektir.
PHP Dosya Fonksiyonları
Normalde bu fonksiyonlar da diğerleri ile birlikte anlatılabilrdi. Ancak programcılık dünyasında metin
dosyaları VTYS sistelerinin çıkmasından önce ver depolamak için kulanıldığından bu konunun oradan önce
gelmesi daha uygun göründü. PHP dili ile formlar hazırlayarak metin dosyalarını depo olarak kullanan
güzel uygulamalar yapılabilir. Örneğin basit bir sayaç, ziyaretçi defteri, sözlük gibi. Önce fonksiyonları basit
örneklerle görüp sonra kompleks kullanımlara bakalım.
file_exits() fonksiyonu (Dosya var mı?)
Bir dosyanın var olup olmadığını denetleyen bu
fonksiyon, dosya varsa true(doğru), yoksa false(yanlıĢ) sonucunu verir. Parametre verilirken klasör adıda
iletilebilir ancak burada daha önce HTML konusunda önerdiğimiz gibi ―/‖ kullanımına dikkat edilmelidir.
<?php
if ( file_exits ( "dosya.txt" ) )
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
346
print ("Dosya var!");
?>
Örnek kodumuz ―dosya.txt‖ adında bir dosya var mı diye kontrol etmektedir. Eğer dosya varsa ―Dosya var‖ mesajı
görüntülenecek aksi takdirde program yoluna devam edecektir.
<?php
if (file_exists(―dosya.txt‖)):
echo ―dosya mevcut‖;
else:
echo ―dosya bulunamadı‖;
endif;
?>
filesize() fonksiyonu (Dosya boyutunu bulma)
Adını verdiğimiz dosyanın boyutunu byte cinsinden bir
değer olarak verir:
Örnek:
<?php
print ("Dosyanın büyüklüğü (byte cinsinden) :");
print filesize( "dosya.txt" );
?>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
347
is_file() fonsiyonu (Dosya mı )
Klasörlerle dosyaların isimlendirilmesi ile teknik anlamda bir ayrıma gidilmiĢ olmaz. Bunlar temelde nitelikleri ile
ayrılırlar. Kullanıcı verilen parametredeki ismin bir dosya olup olmadığı test etmek için bu fonksiyonu kullanabilir.
Örnek olarak farzedelim kullanıcı forma dosya adını girecek ve buna mukabil o dosyanın içerği ekrana
yazdırılacak olsun. Ya girilen isim bir dosya değilde klasöre aitse ne olacaktır. Haliyle kodumuz
çalıĢmayacaktır. Oysa okuma iĢlemine baĢlamadan önce is_file() ile test yapılmıĢ olsaydı kod Ģartlar doğru
olduğundan çalıĢacak, Ģart sağlanmadıysa yani öyle bir dosya yok ise bir mesaj verilebilecekti. Parametre olarak
verilen isim bir dosyaya ait ise fonksiyon true/doğru,
değilse false/yanlıĢ sonuç verir. Örnek:
<?
if ( is_file ( "dosya.txt" ) )
print ("Bu bir dosyadır!");
?>
is_readable() fonksiyonu (Dosya okunabilir mi?)
Programda kullanmaya kalkmadan önce bir dosyanın eriĢilebilir ve PHP tarafından okunabilir olup olmadığını
kontrol etmek isteyebiliriz. Ortalama bir Windows kullanıcısı iseniz bu olay sizin için bir anlam ifade
etmeyebilir. Çünkü Windowsta normal Ģartlar altında dosya var ise okunabilirdir. Ancak unix ekolü sistemlerde
dosyanın var olması yetmez birde bağlandığınız kullanıcı hesabının o dosyayı okuma izni olması gerekir. Bu
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
348
fonksiyon dosya okunabilir ise true/doğru, değilse
false/yanlıĢ sonuç verir. Örnek:
<?
if ( is_readable ( "dosya.txt" ) )
print ("Bu dosya okunabilir bir dosyadır!");
?>
is_writable() fonksiyonu (Dosya yazılabilir mi? )
Programda kullanmaya kalkmadan önce dosyanın
eriĢilebilir ve yazılabilir olduğunu kntrol etmeye yarar. Dosya yazılabilir ise true/doğru, değilse false/yanlıĢ
sonuç verir. Yukarda ki örnekte açıklandığı gibi Unix ekolü sistemlerde dosyanın eriĢilebilir olması yanında
bağlantı sağladığımız hesabın o dosyaya yazma yetkisi olmasıda gereklidir. Örnek:
<?
if ( is_writable ( "dosya.txt" ) )
print ("Bu dosyaya yazılabilir!");
?>
is_executable() fonksiyonu (Dosya çalıĢtırılabilir mi? )
PHP dili ile iĢletim sistemi komutlarınında çalıĢtırılabileceğinden daha önce bahsetmiĢtik. Ancak bu
iĢlemden önce bu komutu çalıĢtırmaya yetkimiz olup olmadığını kontrol etmemiz yerinde olur. ĠĢletim
sisteminin komutlarını çalıĢtırma olayı çok komplez bir konudur ve açıkçası böyle bir olayı bir dil içinde
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
349
kodlamak çok maharet gerektiren bir iĢtir. DüĢünelim;
hosting makinesi Linux olsun ve bu makinede RAR programı yüklü olsun. Linux sistemlerde kullanıcı Ģifreleri
passwd dosyasında tutulmasından hareketle rar a –d pass passwd dosyasını bir yere sıkıĢtırıp sonra silmek ve
daha sonra mail komutu ile bu dosyayı bir adrese mail yoluyla göndermek mümkündür. Böyle bir açığı
affedecek hacker yoktur. Onun için bir çok hosting Ģirketi dosya çalıĢtırma yetkisini ya hiç vermez yada çok kısıtlı
kullandırır.
Bu fonksiyon dosya çalıĢtırılabilir ise true/doğru, değilse
false/yanlıĢ sonuç verir. Örnek:
<?
if ( is_executable ( "dosya" ) )
print ("Bu dosya çalıĢtırılabilir!");
?>
touch() fonksiyonu (dosya oluĢturma)
touch fonksiyonu bir metin dosyası oluĢturmak için
kullanılır. Eğer verilen isimde bir dosya zaten varsa içeriğine dokunmadan dosya tarihi vs bilgiler değiĢtirilir.
<?php
$klasor = "/text/";
touch ("$klasor/dosya.txt");
print ("dosya.txt adlı bir dosya oluĢturuldu!");
?>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
350
unlink() fonksiyonu (dosya silme)
Unix sistemlerde dosya isimleri dosyanın fiziksel haline bir bağlantı kabul edilirler. Dolayısı ile bu bağlantıyı
kırmak dosyaya eriĢimide imkansız kılar. Kısaca dosya aslında silinmiĢ olur. PHP ile mevcut bir dosyayı silmek
için unlink() fonksiyonu kullanılır. Bu fonksiyon da silinecek dosyanın adı ile birlikte yolunu ister. Bu komut
Windows sistemlerinde iĢlemeyebilir. Örnek:
<?php
$klasor = "/files";
unlink ("$klasor/dosya.txt");
print ("dosya.txt adlı dosya silinmiĢtir!");
?>
copy() fonksiyonu (dosya kopyalama)
PHP ile dosyaları kopyalamak için bu fonksiyon kullanılır.
Bu fonksiyon iki parametre alır. Kaynak dosya ve hedef dosya. Ancak hedef dosya için gerekli oluĢturma
yetkimizin olup olmadığı, kaynak dosyayı görme yetkimizin olup olmadığı bu komut için önemlidir.
<?php
copy("yenidosya.txt","yenidosya2.txt");
?>
readfile() fonksiyonu (Dosyayı satır satır okumak ve ekrana yazmak)
Dosyanın tamamen ekrana yazılması için kullanılır.
readfile(“dosyaadı”);
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
351
fopen () fonksiyonu (dosya açma)
Bir dosyayı açmak için kullanılır. Dosyanın ne amaçla açılacağı ise parametre halinde verilir. w dosyayı yazmak
için, r okumak için ve a ise varolan bir dosyaya ek bilgi girmek için kullanılır. Bu fonksiyon dosyanın baĢarıyla
açılması halinde bir tamsayı değeri sonuç olarak verecektir. PHP programlarımızda, açılan dosyanın
mutlaka ona iĢaret eden bir değiĢkene (file pointer) bağlı olması gerekir; daha sonra bu dosya ile ilgili bütün
iĢlemleri bu iĢaret değiĢkeni ile yaparız. Örnek:
<?
$dosya = fopen( "dosya.txt" , 'r' ); // okumak
için
$dosya = fopen( "dosya.txt" , 'w' ); // yazmak
için
$dosya = fopen( "dosya.txt" , 'a' ); // eklemek
için
?>
―r‖ modunda PHP, bu dosyayı sadece okumak amacıyla açacak ve fonksiyondan dönen değeri $dosya
değiĢkenine atayacaktır. Olmayan bir dosyayı açmak istediğimiz zaman PHP hata mesajı verir. Olmayan bir
dosyayı yazmak amacıyla açmak istediğimizde PHP önce
bu dosyayı oluĢturur. Bir dosyaya ek yapmak istediğimiz zaman ise kodumuz örneğin son satırındaki gibi kullanılır.
fopen() komutunun parametreleri
r : Sadece okuma iĢlemi yapılacağı zaman
kullanılır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
352
r+: Hem yazma hem de okuma iĢlemine izin verir.
Dosyayı silmez.
w: Sadece yazma iĢlemine izin verir. Eğer sistemde
belirtilen adda bir dosya varsa, dosyanın içeriği silinir ve boyutu sıfırlanır. Eğer belirtilen adda
dosya yoksa, yeni bir dosya oluĢturulur.
w+-: Hem yazma hem de okuma iĢleminde
kullanılır. Eğer dosya varsa silinerek yenisi oluĢturulur. Dosya yoksa yeni bir dosya
oluĢturulur.
a : Sadece yazma iĢlemi için kullanılır.
a+ : Hem okuma hem de yazma iĢlemlerine izin verir. Eğer dosya yoksa oluĢturur.
fgets () fonksiyonu (dosyadan satır satır okuma)
Bir dosyadan bilgi okumak için kullanılır. Okunacak karakter sayısı parametre olarak verilmiĢ olsada satırın
bundan önce sonlanması veya dosya sonuna gelinmesi bir hataya sebep olmaz. Bu durumda fonksiyon
okuyabildiği kadar karakteri sonuç olarak verir.
fseek () fonksiyonu (dosya içinde bir yere konumlanma)
Bir dosya açıldığı zaman dosya imleçi dosyanın baĢına konumlanmıĢtır. Keza fgets kullanımında her satır
bitiminde imleç bir sonra ki satıra konumlanır. Fseek fonksiyonu imleçi parametre olarak verilen bir konuma
doğrudan konumlandırmak üzere kullanılır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
353
fread () fonksiyonu (dosyadan belirli sayıda karakter okuma)
Bazen bir dosyayı satır satır okumak yerine istenen
sayıda karakter blokları halinde okutmak dan bilgi okumak için kullanılır. Okunacak karakter sayısı
parametre olarak verilmiĢ olsada dosya sonuna gelinmesi bir hataya sebep olmaz. Bu durumda fonksiyon
okuyabildiği kadar karakteri sonuç olarak verir. Bu fonksiyon genel olarak fseek ile kullanılır.
fgetc () fonksiyonu (dosyadan birer birer okuma)
Bazen bir dosyanın satır satır yada blok olarak okumak
yerine byte byte okunması istenebilir. Bu iĢlem içinse
fgetc kullanılır.
feof () fonksiyonu (dosya sonuna gelindi mi)
Bir dosyadan bilgi okuma esnasında dosya sonuna gelinigelinmediğini kontrol etmek önemlidir. Bu fonksiyon
bu iĢ için kullanılır ve eğer dosya sonu ise true değerini verir.
fclose () fonksiyonu (dosyayı kapat)
Yapılacak iĢlem bittikten sonra dosyayı kapatıp bağlantıyı
kesmek için kullanılır. Bu aĢama önemlidir çünkü gereksiz yere açık duran her dosya sistem kaynaklarını
kullanmaktadır.
ġimdi fgets, feof ve fclose kullanan basit ve ilkel bir
dosya içeriği listeleme örneği görelim
<?php
if ($dosya = (fopen ("dosya.txt" , 'r') ) ) {
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
354
print ("Dosya açıldı!<br>");
}
else {
print ("Dosya açılamadı!");
}
while (!feof ($dosya))
{
$satir = fgets ( $dosya, 1024 ) ;
print ("$satir<br>");
}
fclose ($dosya);
?>
Örnekte görüldüğü gibi dosya açılmaya çalıĢılıyor ve
duruma uygun mesajı ekrana basıldıktan sonra dosya içeriği satır satır ekrana yazdırılıyor. Fgets ile 1024
değerinin kullanılması kafa karıĢtırabilir. Ancak eğer satır
1024 ten kısa ise fgets okuyabildiği kadarını kabul eder. while() döngüsü, feof() doğru değilken devam etmek
üzere kurulmuĢ olduğu için, dosya sonuna ulaĢıldığında döngü duracaktır. Okuma iĢlemi durabilen bir döngü
içinde kullanılmazsa, fgets() PHP'nin bir programın sona ermesi için verilmiĢ varsayılan süresi doluncaya kadar
dosyayı okumak isteyecektir. Bunun kısa anlamı ise sonsuz döngüdür.
ġimdi fseek ve fread kullanan örneğe bakalım;
<?php
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
355
$adi =”dosya.txt”;
if ($dosya = (fopen ($adi, 'r') ) ) {
print ("Dosya açıldı!<br>");
}
else {
print ("Dosya açılamadı!");
}
$boyut = filesize($adi);
$seek_konumu = (int) ($boyut / 2 );
while ( ! feof ($dosya) ) {
$str = fread ( $dosya, $ seek_konumu) ;
print ("$str<br>");
}
fclose ($dosya);
?>
Fgetc kullanan örnek ise aĢağıdadır.
<?php
$adi = "dosya.txt";
if ($dosya = (fopen ($adi , 'r') ) ) {
print ("Dosya açıldı!<br>");
}
else {
print ("Dosya açılamadı!");
}
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
356
while ( ! feof ($dosya) ) {
$bytebyte = fgetc ( $dosya ) ;
print ("$bytebyte");
}
fclose ($dosya);
?>
fputs() ve fwrite() fonksiyonu (dosyaya yazma-dosyaya ekleme)
PHP açısından dosyaya ekleme yada yazma teknik anlamda farklı bir iĢlem değildir. Sadece dosyanın açılma
aĢaması farklıdır. fputs ve fwrite aynı iĢi yaparlar ve aynı Ģekilde kullanılırlar.
$dosya = fopen( "bir_dosya.txt" , 'w' ) or die
("Dosya açılamıyor!") ; // yazmak
$dosya = fopen( "bir_dosya.txt" , 'a' ) or die ("Dosya
açılamıyor!") ; // eklemek
<?php
$adi = "dosya.txt";
$dosya = fopen ($adi , 'w') or die ("Dosya
açılamadı!");
$str = "Bu satır dosyaya kaydedilecek: Ġbrahim
Kutluay!\n";
fwrite ( $dosya , $str ) ;
fputs ( $dosya , "PHP dersleri. Bu satır ise fputs
ile yazılmıĢtır \n" ) ;
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
357
fclose ($dosya);
?>
<?php
$adi = "dosya.txt";
$dosya = fopen ($adi , 'a') or die ("Dosya
açılamadı!");
$str = "Bu satır dosyaya kaydedilecek: Ġbrahim
Kutluay!\n";
fwrite ( $dosya , $str ) ;
fputs ( $dosya , "PHP dersleri. Bu satır ise fputs
ile yazılmıĢtır \n" ) ;
fclose ($dosya);
?>
flock() fonksiyonu (Kullanımdaki dosyayı kilitleme)
Ġlk bakıĢta kilitleme kelimeside böyle bir Ģeye neden ihtiyaç duyulduğuda anlamsız gelebilir ancak dosya
kilitleme kesinlikle gereklidir. Metin dosyaları tabiatları gereği tek kullanıcılıdır. Bu bakımdan VTYS tabir
ettiğimiz gerçek vertbanı dosyalarından farklıdırlar. Örneğin bir kullanıcı metin dosyasını kayıt eklemek üzere
açmıĢken hemen bir karıĢıklık olabileceğini söylemek mümkündür. ĠĢte bu yüzden iĢlem yapılırken dosyanın
geçici olarak kilitlenmesi en sağlık lı yöntem olacaktır. Bu
fonksiyona kilitlemek istediğimiz dosyanın iĢaret değiĢkeninin adını ve kilit türünü belirten sayıyı
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
358
parametre olarak vermek gerekir. Bu fonksiyon ile
kullanabileceğimiz kilit türü parametreleri Ģunlardır:
1:Paylaşım Diğer proseslerin dosyayı paylaĢmalarına
imkan verir
2:Tam Diğer proseslerin dosya ile iĢlem
yapmasına engel olur
3:Serbest Dosyanın 1 veya 2 olan kilidini kaldırır
Örnek:
<?php
$adi = "/www/dosya.txt";
$dosya = fopen ($adi , 'w') or die ("Dosya
açılamıyor!");
flock ( $dosya , 2); // dosyayı kilitle komutu
böylece verildi
$str = "Merhaba Dünya!\n";
fwrite ( $dosya , $str ) ; // dosyaya yazıldı
fputs ( $dosya , "Merhaba Hayat \n" ) ;
flock ( $dosya , 3); //dosyanın kilidini çöz
fclose ($dosya);
?>
Bir dosya, kilitlendiği anda, aynı dosyayı daha sonra kilitlemeye kalkan diğer programlar kendilerinden önce
konulmuĢ kilide saygı gösterirler. Yani kilitli dosya bir daha kilitlenemez. Önce ilk kilidin çözülmesi gerekir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
359
fileadate() fonksiyonu (Dosyaya son eriĢim tarihi- file access date )
Bir dosyaya son eriĢim tarihini Epoch formatında verir.
Date() ile bunu anlamlı hale getirmek mümkündür.
filemdate() fonksiyonu (Dosyanın son değiĢtirilme tarihi- file modification date)
Bir dosyanın en son değiĢtirildiği tarihi Epoch formatında
verir. Date() ile bunu anlamlı hale getirmek mümkündür. En çok sayfaların sonuna son değiĢiklik tarihini
yazdırmak için kullanılır.
filecdate() fonksiyonu (Dosyanın oluĢturulduğu tarih - file creation date)
Bir dosyanın oluĢturulduğu tarihi Epoch formatında verir. Date() ile bunu anlamlı hale getirmek mümkündür.
<?php
print ("son değiĢiklik tarihi :");
$islemtarihi = filemdate( "dosya.txt" );
print date("D d M Y G:i:s H", $islemtarihi
);
?>
CSV Dosya Fonksiyonları
CSV dosyaları (Virgülle AyrılmıĢ Değerler- Comma Separated Values) değerlerin belirli bir karakterle
ayrıldığı metin dosyalarıdır. Bu karakter genelde ―;‖ yada ―,‖ (noktalı virgül yada virgül) karakteridir. Standart bir
format olup veri alıĢveriĢi için uygundur. Metin dosyada
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
360
bir tablo gibi kullanıma imkan verir. Excel tafından
iĢlenebilir. Onun için bir metin dosyasını Excel ile açmak için uzantısını csv yapmak yeterlidir.
PHP dilinde CSV dosyalarından bilgi okumak için fgetcsv,
CSV dosyasına bilgi yazmak içinse fputcsv kullanılır.
fgetcsv() fonksiyonu (CSV dosyasını satır satır okuma)
Metin dosyaları için bu iĢlemi fget ile yaparken CSV dosyaları biraz ayrı bir iĢleme ihtiyaç duyarlar. Örneğin
(―Ġbrahim‖;‖Kutluay‖;33) bilgilerini ele alırsak görüleceği gibi metindeki ― karakterlerinin çıkarılması ve ―;‖ ile
ayrılmıĢ değerlerinden iĢlenmesi gereklidir. fgetcsv() de tam olarak bunu yapar. fget () fonksiyonundan farklı
olarak okuduğu satırı iĢler ve bilgileri bir dizinin
elemanları olarak dönderir.
<?php
$satir = 1;
$handle = fopen("test.csv", "r");
while (($data = fgetcsv($handle, 1000, ",")) !==
FALSE) {
$bilgisay = count($data);
echo "<p> $satir satırında $bilgisay alan
bulundu: <br /></p>\n";
$satir++;
for ($c=0; $c < $bilgisay; $c++) {
echo $data[$c] . "<br />\n";
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
361
}
}
fclose($handle);
?>
Yukardaki kod bir CSV dosyasını satır satır okuyup döngü içindeki bilgileri değerlere ayrılmıĢ olarak yazmaktadır.
fputcsv() fonksiyonu (Değerleri CSV formatında yazma)
Metin dosyaları için bu iĢlemi fput ile yapılmaktaydı.
Ancak (―Ġbrahim‖;‖Kutluay‖;33) bilgilerini ele alırsak görüleceği gibi metindeki ifadelerin iĢlenmesi gereklidir.
Split fonksiyonu ilede CSV ayracının eklenmesi gereklidir. Kendisine parametre olarak geçilen dizinin
elemanlarını CSV biçimine uygun Ģekilde düzenler ve dosyaya yazar. Geriye yazılan metnin boyutu döner,
iĢlemde bir hata varsa da dönen değer FALSE olur.
<?php
$liste = array (
'aaa,bbb,ccc,dddd',
'123,456,789',
'"aaa","bbb"'
);
$dosya = fopen('text.csv', 'w');
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
362
foreach ($liste as $satir) {
fputcsv($dosya, split(',', $satir));
}
fclose($dosya);
?>
Yukardaki kod bir CSV dosyasını satır satır okuyup döngü
içindeki bilgileri değerlere ayrılmıĢ olarak yazmaktadır.
KullanıĢlı Bir Örnek Kayıt Arama
Öğrenci Notlarını Webde Yayınlama
PHP ile birbirine benzer yapıda dizayn edilmiĢ ancak günlük hayatta kullanılabilecek örnekler yapalım. Ġlk
örnek öğrenci notlarını web sitesinden yayınlamak olsun. Öğrenci notlarının CSV formatında bir dosyada
tutulduğunu ve bu dosyanın hazır olduğunu varsayarak; aĢağıdaki örnek veriler ıĢığında
542;62
543;78
544;45
545;52
örnek koda geçelim;
<html>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
363
<head>
<title>CSV arama</title>
<META Http-Equiv="Pragma" Content="no-cache">
<meta http-equiv="content-type" content="text/html;
charset=iso-8859-9" />
<meta name="keywords" content="Csv" />
</head>
<body>
<?
if (!$_POST):
{?>
<Form Action="<?$PHP_SELF?>" Method="POST">
<tr><td colspan=2 align=center style="font-color:red;"> Not arama</td></tr>
<tr><td> No</td> <td><input type="TEXT" name="no"></td></tr>
<tr><td> <input type="SUBMIT" value
="ARA"></td></tr>
</table>
</form>
<?}
else :
$no=$_POST['no'];
//echo $no; deger aliyormu kontrol için
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
364
$dosya="dosya.csv";
$baglan=fopen($dosya,'r');
if (!$baglan)
{
echo "baglanti kurulmadı";
exit();
}
else
{
echo "tabloya baglandi <br>"; }
while (!feof($baglan))
{
$satir=fgetcsv($baglan,filesize($dosya),";");
//echo $satir[0]; okuyor mu kontrol için kullanabiliriz
if ($satir[0]==$no)
{
$varmi=true;
break;
}
}
if ($varmi)
{
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
365
echo "<b>$satir[0]</b> numaralı kiĢi : <b>$satir[1]</b> almıĢtır";
}
else {echo "numara bulunamadı"; }
endif;
?>
</body>
</html>
Yukardaki kodda Ģimdiye kadar gördüğümüz bir çok bilgi
bir araya getirilmiĢtir. Her Ģeyden önce programda tek dosya içinde hem form hemde formu iĢleyen kod
verilmiĢtir. Program ilk kez çalıĢtığında $_POST dizi değiĢkeni boĢ olacağından, programın form kısmı ekrana
verilmekte ve notu aranan öğrenci numarasının girilmesi istenmektedir. Bilgi girilip butona tıklandığında ise
$_POST bu sefer dolu olacağından programın formu
iĢleyen kısmı yani bu numarayı arayan kısım çalıĢacaktır.
Arayan kısımda ise sıra ile satırlar fgetcsv ile okup
parçalanmakta ve soldaki ilk bilginin yani parçalandıktan sonra dizinin [0]. elemanının forma girilen bilgiye eĢit
olup olmadığı kontrol edilmektedir. EĢitlik sağlandığında döngü kırılmaktadır aksi takdirde numara bulunsa bile
dosya bitene kadar döngü sürecek ve web sunucuya adeta iĢkence çektirecektir.
Basit Telefon Rehberi
Yukardaki örnekte ufak bir değiĢiklik yaparak aynı
programı bu defa basit bir telefon rehberine çevirebiliriz.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
366
Rehberin yine CSV formatında ve hazır olduğunu
varsayalım; aĢağıdaki örnek veriler ıĢığında
Ahmet;05335333355
Mehmet;0542542442
örnek koda geçelim;
<html>
<head>
<title>CSV arama</title>
<META Http-Equiv="Pragma" Content="no-cache">
<meta http-equiv="content-type" content="text/html; charset=iso-8859-9" />
<meta name="keywords" content="Csv" />
</head>
<body>
<?
if (!$_POST):
{?>
<Form Action="<?$PHP_SELF?>" Method="POST">
<tr><td colspan=2 align=center style="font-color:red;"> Telefon Rehberi </td></tr>
<tr><td> Ġsim giriniz</td> <td><input type="TEXT"
name="isim"></td></tr>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
367
<tr><td> <input type="SUBMIT" value ="ARA"></td></tr>
</table>
</form>
<?}
else :
$isim=$_POST['isim'];
$dosya="dosya.csv";
$baglan=fopen($dosya,'r');
if (!$baglan)
{
echo "baglanti kurulmadı";
exit();
}
else
{
echo "tabloya baglandi <br>"; }
while (!feof($baglan))
{
$satir=fgetcsv($baglan,filesize($dosya),";");
//echo $satir[0]; okuyor mu kontrol için kullanabiliriz
if ($satir[0]==$isim)
{
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
368
$varmi=true;
break;
}
}
if ($varmi)
{
echo "<b>$satir[0]</b> isimli kiĢinin telefon numarası : <b>$satir[1]</b>";
}
else {echo "numara bulunamadı"; }
endif;
?>
</body>
</html>
Bu kodda da tek dosya içinde hem form hemde formu
iĢleyen kod verilmiĢtir. Program ilk kez çalıĢtığında
$_POST dizi değiĢkeni boĢ olacağından, programın form kısmı ekrana verilmekte ve numarası aranan kiĢinin
girilmesi istenmektedir. Bilgi girilip butona tıklandığında ise $_POST bu sefer dolu olacağından programın formu
iĢleyen kısmı yani bu ismi arayan kısım çalıĢacaktır.
Arayan kısımda ise sıra ile satırlar fgetcsv ile okup
parçalanmakta ve soldaki ilk bilginin yani parçalandıktan sonra dizinin [0]. elemanının forma girilen bilgiye eĢit
olup olmadığı kontrol edilmektedir. EĢitlik sağlandığında
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
369
döngü kırılmaktadır aksi takdirde numara bulunsa bile
dosya bitene kadar döngü sürecektir.
Basit Sözlük
Yukardaki örnekte yine ufak bir değiĢiklik yaparak aynı
programı bu defa basit bir sözlük olarak kullanabiliriz. Verilerin yine CSV formatında ve hazır olduğunu
varsayalım (internette hazır halde bir sürü kelime listesi
çeĢitli formatlarda bulunmaktadır. Dolayısı ile bu uygulamayı Ģirket için bir sözlük olarak kullanmanız
mümkündür). AĢağıdaki örnek verileri inceleyecek olursak;
yes;evet
no;hayır
evet;yes
hayır;no
name;ad,isim
ad;name
isim;name
bu yapıda bir veri ile hem Ġngilizce hem Türkçe sözlük
olarak aĢağıdaki 30-40 satırlık programı kullanabileceğimizi görürüz. örnek koda geçelim;
<html>
<head>
<title>CSV arama</title>
<META Http-Equiv="Pragma" Content="no-cache">
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
370
<meta http-equiv="content-type" content="text/html; charset=iso-8859-9" />
<meta name="keywords" content="Csv" />
</head>
<body>
<?
if (!$_POST):
{?>
<Form Action="<?$PHP_SELF?>" Method="POST">
<tr><td colspan=2 align=center style="font-
color:red;"> Basit Sözlük </td></tr>
<tr><td> Kelimeyi Giriniz </td> <td><input
type="TEXT" name="sozcuk"></td></tr>
<tr><td> <input type="SUBMIT" value
="ARA"></td></tr>
</table>
</form>
<?}
else :
$sozcuk=$_POST['sozcuk];
$dosya="dosya.csv";
$baglan=fopen($dosya,'r');
if (!$baglan)
{
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
371
echo "baglanti kurulmadı";
exit();
}
else
{
echo "tabloya baglandi <br>"; }
while (!feof($baglan))
{
$satir=fgetcsv($baglan,filesize($dosya),";");
//echo $satir[0]; okuyor mu kontrol için kullanabiliriz
if ($satir[0]==$sozcuk)
{
$varmi=true;
break;
}
}
if ($varmi)
{
echo "<b>$satir[0]</b> kelimesinin anlamı:
<b>$satir[1]</b>";
}
else {echo "kelime dosyada mevcut değil "; }
endif;
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
372
?>
</body>
</html>
Bu kodda da tek dosya içinde hem form hemde formu
iĢleyen kod verilmiĢtir. Program ilk kez çalıĢtığında $_POST dizi değiĢkeni boĢ olacağından, programın form
kısmı ekrana verilmekte ve numarası aranan kiĢinin girilmesi istenmektedir. Bilgi girilip butona tıklandığında
ise $_POST bu sefer dolu olacağından programın formu iĢleyen kısmı yani bu ismi arayan kısım çalıĢacaktır.
Arayan kısımda ise sıra ile satırlar fgetcsv ile okup parçalanmakta ve soldaki ilk bilginin yani parçalandıktan
sonra dizinin [0]. elemanının forma girilen bilgiye eĢit olup olmadığı kontrol edilmektedir. EĢitlik sağlandığında
döngü kırılmaktadır aksi takdirde numara bulunsa bile
dosya bitene kadar döngü sürecektir.
Basit Ziyaretçi Defteri
Ziyaretçi defterleri kullanıcı etkileĢim için ideal bir yoldur.
Kullanıcı buraya bir not yada soruyu yazar sizde bunu görebilirsiniz. Hatta cevapta yazabilirsiniz... Burada kod
olarak basĢt bĢr ziyaretçi defteri verilecektir. Ġlk amaç
alınan bilgileri bir metin dosyada depolamak ve bunları biçimli olarak geri yazdırmak… ileri seviye bir ziyaretçi
defterinden beklenenler ise ;
Ayıp kelime süzgeci (Herkes size hayranlığını ifade
etmeyebilir)
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
373
Ziyaretçilerin durmadan yada otomasyon yoluyla
yazmasının önüne geçmek için otomatik onay kodu üreteçleri
Bilgilerin doğruluğunu kontrol etmeli
Veritabanı kullanımı
<?php
if (!$_POST) {
// Form dolduruldmuĢ ise
?>
<HTML>
<HEAD>
<TITLE>PHP'de Formlar</TITLE>
<meta http-equiv='"content-type' content='text/html; charset=ISO-8859-9'>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1254'>
</HEAD>
<BODY>
<FORM ACTION="<?$PHP_SELF;?>"
METHOD="POST">
<P><font size='3' face='verdana, Arial,
Helvetica'>
Defteri imzalamadan okumak için <a
href='zd1mesaj.php'>
burayı tıklayın</a></FONT></P>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
374
<P><font size='3' face='Arial, Helvetica'>
Adınız, Soyadınız: <br><INPUT TYPE="TEXT"
NAME="adi"><BR>
Email Adresiniz: <br><INPUT TYPE="TEXT"
NAME="adres"><BR>
Mesajınız:<BR>
<TEXTAREA NAME="mesaj" ROWS=10 COLS=30></TEXTAREA>
<BR><BR><BR>
<INPUT TYPE="SUBMIT" VALUE="Gönder">
<INPUT TYPE="RESET" VALUE="Sıfırla">
</FORM>
</BODY>
</HTML>
<?
}
else
{
?>
<HTML>
<HEAD>
<TITLE>PHP'de Ziyaretçi Defteri</TITLE>
<meta http-equiv='content-type'
content='text/html; charset=ISO-8859-9'>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
375
<meta http-equiv='Content-Type' content='text/html; charset=windows-1254'>
</HEAD>
<BODY>
<P><font size='3' class='s4' face='Arial, Helvetica'>
<?php
$txtdosya = "mesajlar.txt";
if (file_exists("$txtdosya")) {
$baglanti = fopen($txtdosya,'a');
}
else {
$baglanti = fopen($txtdosya,'w');
}
foreach ($_POST as $key=>$deger ) {
$buyugecevir = strtoupper($key);
print ("$buyugecevir: $deger<br>");
$metin = "$buyugecevir: $deger<br>";
fputs($baglanti, $metin);
}
fputs($baglanti, date("D d M Y h:i:s"));
fputs($baglanti, "<br>\n");
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
376
fputs($baglanti, "<center><img src='nokta.gif' width=100% height=1
border=0></center>\n");
fclose($baglanti);
?>
<HTML>
<HEAD>
<TITLE>PHP'de Misafir defteri</TITLE>
<meta http-equiv='"content-type' content='text/html; charset=ISO-8859-9'>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1254'>
</HEAD>
<BODY>
<P><font size='3' class='s4' face='Arial, Helvetica'>
<center><img src='nokta.gif' width=100%
height=1 border=0></center>
Sayın: <?$adi=$_POST['adi'];echo $adi;?><br>
Deftere bilgi girdiğiniz için teĢekkür ederim </P>
<p>Ana Sayfaya Dönmek için <A
HREF="index.php"> tıklayın</A><BR>
Mesajları okumak için<A HREF="zd1mesaj.php">
tıklayın</A>
</BODY>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
377
</HTML>
<?
}
?>
Program öncelikle gönderilen bir değer varmı diye bakıp,
eğer bu değer varsa değerleri iĢlemek, yoksa formu gönderip değerleri toplamak üzere tasarlanmıĢ
durumdadır. if (!$_POST) kodu ile değer olup olmadığı kısaca form üzerinde gönder düğmesine baslıp baılmadığı
kontrol ediliyor. Eğer form iletilmiĢ ise bu defa mesajların kaydedileceği dosya zaten varmı diye bakılıyor. Eğer
dosya varsa ―eklemek‖ yoksa ―yazmak‖ üzere dosya açılıyor ve sırası ile formdan gelen veriler bu dosyaya
kaydediliyor ve en sonunda bu dosyaya yazılan bilgiler ile birlikte bir teĢekkür mesajı görüntülenip çıkılıyor.
Programda Ģu haliyle mesajları ekrana gösteren
zd1mesaj.php dosyası eksik. Onu da dosya fonksiyonları ile kendiniz yazabilirsiniz.
PHP Çerez - Cookie Fonksiyonları
Çerezler bir sitenin kullanıcı bilgisayarına bir takım bilgiler içeren paket (dosya) bırakıp daha sonra bu
paketteki bilgilere göre bir takım iĢlemler yapmasına
yarayan dosyalardır. Kısaca çerezler yardımıya site sahibi ziyaretçi hakkında bilgiler alıp saklayabilir ve bir dahaki
ziyarette kullanabilir.
Örneğin bir anket kodu hazırlamıĢ olalım; bir çok kiĢi
haliyle sonucu etkilemeye çalıĢacaktır. Bu durumda çak basit bir tedbir olsada kutlanıcı bilgisayarına anketei
oyladığı anda bir çerez bırakmak ve daha sonra tekrar
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
378
aynı yere geldiğinde ise çerez varmı diye kontrol edip,
eğer varsa ankete daha önceden katıldığını gösteren bir mesaj görüntülemektir. Zaten çerezler genel olarak
anket formlarında ve üyelik sistemlerinde kullanılır.
Üyelik sistemlerine gelince; sayfaya giriĢin bir kullanıcı adı ve Ģifre ile mümkün olduğunu varsayalım. Sayfaya
üye olduktan sonra üyeler kullanıcı adı ve Ģifresi ile sisteme giriĢ yaparlar. Daha sonra bu web sayfasına
girilmek istendiğinde sistem atılan çerez, web sayfası tarafından kontrol edilir ve Ģifreyi tekrar girmemize gerek
kalmaz. Aslında çerezler daha pek çok iĢlemde kullanılırlar ancak en çok bu alanda kullanıldıklarından
bunun detaylarına girildi.
Not: Sakın “aha süper bir güvenlik önlemi buldum”
diye düşünmeyin. Çünkü çerezler tarayıcı
tarafından verilen bir komutla temizlenebilir. Kısaca çerezler tek başına güvenlik için yetmez. IP
numarasınıda kullanarak bir nebze etkili olunur ancak bu seferde kişiler ADSL modemlerini
resetleyerek değişik bir numara alıp bizi aldatabilirler. Çerezlerin tamamen güvenilir
olduğunu düşünenler aşağıdaki listeye bir göz atmalıdır.
Çerezler Ģifrelenmeden saklanır yani düzyazı dosyalarıdır. ġifre vs bilgiler için uygun değildirler.
(Parolaları MD5 yapıp saklamayı tekrar hatırlatmıĢ olalım. Detay için md5() fonksiyonuna bakınız)
Çerezler sistemde herkesin rahatlıkla görevileceği bir Ģekilde ve belli bir klasör içinde durur
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
379
Çerezler kullanıcı tarafından silinebilir yada tarayıcı
programa temizletilebilir
Kullanıcı çerez kullanımı yasaklamıĢ ve bu
dosyaların bırakılmasını tarayısısına engelleme talimatı vermiĢ olabilir
Çerezlerin kullanıcı tarafında ne kadar saklanacağıda belirlenebilir. Eğer bir zaman belirtilmezse çerez sadece
tarayıcı penceresi açıkken bırakılır ve kapatılırken silinir. Aksi takdirde istenirse 1 ay gibi bir zamanda belirtilebilir.
Çerezlerin içerdiği değerlere eriĢmek için PHP sunucu değiĢkenlerinden $_COOKIE kullanılır.
$degisken=$_COOKIE[―çerez adı‖];
Not: $_COOKIE[] değiĢkeni $HTTP_COOKIE_VARS[]
değiĢkeninin yerine gelmiĢtir. ġimdiden kod yazılırken buna uygun davranılması uygun olur. Her ne kadar
kerhen geriye uyumluluk adına iki kod çalıĢıyor olsada bu
ilerdede bu destek ürecek anlamına gelmez.
setcookie() fonksiyonu – (Çerez bırakma)
Bu fonksiyon süre belirterek veya süre belirtmeden kullanıcı bilgisayarına bir çerez bırakır. Süre belirtilecek
olursa; istenilen süre saniye cinsinden girilir yani 1 saat için 3600 ve 1 gün için 6540 gibi. Sadece o pencere açık
olduğu sürece bırakma Ģekli
setcookie(―çerez adı‖,‖saklanacak değer‖);
Zaman belirerek çerez bırakmak içinse
setcookie(―çerez adı‖,‖saklanacak
değer‖,time()+istenilen sure);
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
380
Bırakılan bir çerezi temizlemek içinse kodda ufak bir hile
kullanılır.
setcookie(―çerez adı‖,‖‖,time()-sure)
Birden fazla çerez bırakmak için dizi değiĢkeler kullanılabilir.
setcookie(―eleman [adi]‖,‖tuncay‖);
setcookie(―eleman [soyadi]‖,‖Ģanlı‖);
Siteye giren kullanıcıyı tanıma ;
<? setcookie ( "Kod", "555", time()+3600 ) ;
if ( $ _COOKIE ['Kod']=="555") { echo "Kodunuz 555 tir "; ] else { echo "Çerez yüklü
değil" }; ?>
Yukarıdaki örnekte php sayfamızı çalıĢtıran ziyaretçinin
sistemine 1 saat süre ile saklanmak üzere bir çerez bırakılmıĢtır. Çerezin adı Kod ve değeri 555 tir. Daha
sonra bu adrese tekrar girilirse haliyle çerez bulunmuĢ olacak ve Kod değeri yazılacaktır.
Kullanıcı siteye kaçıncı defa girdi ;
<? $tmp=$_REQUEST['gelis];
echo "$tmp"; setcookie ( "gelis", "2", time()+3600 );
if ( $tmp > "0" ) { echo "Sayfamızı daha önce $tmp kez ziyaret etmiĢtiniz.";
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
381
$tmp++;
setcookie ( "gelis", $tmp, time()+3600 ); } else {
echo "Sitemize ilk geliĢiniz. hoĢgeldiniz.."; setcookie ("gelis","1",time()+3600);
};
?>
Yukarıdaki komutlar sayfaya giriĢlerimizi sayacaktır.
Sayfaya ilk giriĢimizde "Sayfaya ilk giriĢiniz.." ibaresi ile karĢılaĢacağız. Daha sonraki giriĢlerimizde sayfaya kaç
kere girmiğimizi gösterecektir. Burada dikkat etmemiz gereken husus, "$_REQUEST" birimini kullandığımız.
Herzaman $HTTP_COOKIE_VARS deyimini kullanmayabiliriz. Çerez değerini alırken $_REQUEST
metodunu da kullanabiliriz.
Cookie kullanarak bir sayaç kodu hazırlayalım.
<? // cookiesayac.php $hane=3;//kaç haneli sayaç kullanılacak?
$sure=5;//cookie sistemde kaç saat tutulacak $yasam=$sure*3600;// cookie süresi hesaplanıyor gün
için 3600 $cookiename="counter";//cookie adı ―counter‖ olacak
$ok=$_COOKIE[$cookiname]; $isim="cookie.txt";//cookie dosyası adı
if (file_exists($isim))://dosya var ise aç $dosya=fopen($isim,"r");
$bak=(integer)fgets($dosya,1024); if(!$ok):// çerez sistemde yoksa bir artır
$bak++; endif;
fclose($dosya);
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
382
else://dosya yoksa oku değiĢkenine 1 verilir yani yeni a
çılır $bak=1;
endif; $dosya=@fopen($isim,"w");//dosya yazma modunda acıl
ır ve bilgiler yazılır fputs($dosya,$bak);
setcookie($cokiename,1,time()+$yasam); fclose($dosya);
/* Ekrana yazdırılıyor */ $str=strlen((string)$bak);
$str=$hane-$str; if($str>0):
for($i=1;$i<=$str;$i++): echo ―0‖;
endfor;
endif; echo "$bak";
?>
Yukardaki kod alıntı ancak değiĢtirilmiĢ bir koddur. Kodda dikkat edilecek konular ise öncelikle bu konu
include edecek kiĢilerin include komutunu kodlaının en baĢında kullanmalarıdır. Eğer iclude edilmeden önce
ekrana çıktı veren komut yada tag kullanılır ise cookie sisteme bırakılamaz. Bu da kodun çalıĢmaması demektir.
En sonda ise sayaç hane sayısı sayacın o anki değerinden büyük ise sayac değerinin baĢına ―0‖ değerleri
eklendiğine dikkat edilmelidir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
383
Aynı sayfada birden fazla çerez bırakmak
Bir sayfada birden çok cookie bırakmak normal Ģartlarda
imkansızdır. Ġkinci bir cookie‘yi bırakmak istediğimizde pencerede hata mesajı görüntülenecektir. Ayrıca cookie
bırakmak istediğimizde bunu hiçbir header(sayfa baĢlığı, meta tanımlama vb) kullanmadan önce yada ekrana hiç
birĢey yazdırmadan önce yapmak gereklidir. Eğer bu kurala uyulmazsa hata oluĢacaktır. Buna engel olmak
için cookieler genellikle sayfaların ilk baĢında bırakılır kullanılacak değerler sayfaların ilerleyen bölümlerinde
kullanılır. Bunun yanında php dilinde illaki cookie kullanılması gerekli durumlarda kullanmak için bir
fonksiyon vardır. Eğer sayfa baĢında ob_start(); ile
baĢlayıp sayfa sonunu ob_end_flush(); ile yaparsak o arada cookieleri istediğimiz gibi kullanabiliriz.
<?php
ob_start();
echo "deneme";
echo "!\n";
setcookie ("birinci", "degeri");
setcookie ("ikinci", "degeri");
ob_end_flush();
?>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
384
PHP Dilinde Oturum – Kullanımı
Oturum yönetimi kısaca sayfalar arasında bilgi akıĢını
sağlamaktır. Oturum yönetimi iĢlevleri aslında çerezler ile benzeĢir ancak güvenlik sebebiyle oturum yönetimi
tercih edilir. Bir site kodlanmıĢ olsun ve bu sitede üyelik sistemi de olsun. Bu sitede kullanıcı bilgileri çerezler ile
saklanıp paylaĢılabilir ancak bu durumda herkese açık
olacaktır. Diğer dezavantajları tekrar saymadan devam edelim. Adres satırından diğer dosyalara aktarılabilir. Bu
hem güvelik anlamında iĢi karıĢtırır hemdesite içi kodlama daha bir karıĢacaktır.
Bu gibi durumlarda güvenliği krumak içinde PHP yazarları PHP diline session özelliğini eklemiĢlerdir. Session olayı
sadece PHP diline özgü bir yetenek değildir. Aslında bir tekniktir. Sayfalar arasında veri akıĢını sağlar. Ġlgili
kullanıcı adı ve Ģifre bir sayfadan diğer sayfaya taĢınarak kullanıcının tekrar tekrar Ģifre girmesine gerek kalmaz.
Bu oturum denetimi web penceresini kapatana kadar devam edecektir.
Kısaca özetlersek, Session'lar bize sayfalar arasında verilerin taĢınmasına olanak sağlar. Bu veriler herzaman
üyelik sayfalarındaki kullanıcı adı ve Ģifreler olmayabilir.
Üyelik sistemleri Session'ların kullanıldığı en yaygın sistemlerdir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
385
PHP ve MYSQL Kullanımı
Bugün dünyada aĢağı yukarı tüm programlar bir takım
verileri iĢlemek için yazılırlar. Vei iĢlemek demek veri depolamak demektir. Veri depolamak demek ise
veritabanı yönetim sistemleri demektir. Veritabanı yönetim sistemi demek ise SQL dili gelir akla. Bugün
nerdeyse bilinen bütün diller bir çok veritabanı ile
çalıĢabilirler. Aslında yaptıkları ise kullanıcıdan verileri alıp bunu SQL kodlarına çevirip veritabanına göndermek,
yada verileri SQL ile sorgulayıp dönen sonuçları uygun görünüme getirip ekrana yazmaktır. Bu bakımdan Ģunu
söylemek çok yanlıĢ olmaz. SQL sorgulama dilini bilmeyen programcı yarım programcıdır.
PHP içinde en çok fonksiyon Mysql ve daha sonra Oracle için yazılmıĢtır. Ancak Mysql için geliĢtirilmiĢ olan bir çok
fonksiyon gündelik kullanım içinde sürekli gerekli değildir. Aslında bu tüm veritabanı sistemleri geçerlidir.
Yani 10 kadar fonksiyon ile veritabanı ile çalıĢan uygulamalar yazılır. Yalnız bu 10 sayısı toplam yada
kesin bir sayıyı değil her bir veritabanı için gereken bir sayıyı ifade eder.
Mysql veritabanı kullanılarak, her türde program yazmak
mümkündür. Tabii bunu derken Windows gibi bir iĢletim sistemi yazılabileceğini kastedilmemektedir. Ancak
veritabanı programcılığı açısından bilinmesi gereken bazı konular vardır.
Mysql nedir
Veritabanı ve Tablo nedir
Mysql tablo tipleri
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
386
Mysql veri tipleri
Tablo Tasarlama, Key ve index kullanımı
Mysql‘i komut satırından yönetmek
SQL dili
Mysql üzerinde veritabanı ve tablo oluĢturmak için
kullanılacak araçlar
PHP ile bu tablolara bağlanıp iĢlem yapmak
MySQL Nedir ?
MySQL bir ĠliĢkisel Veri Tabanı Yönetim Sistemidir. SQL
komutları ile çalıĢır. SQL Sorguları ile veritabanlarına bilgiler eklenir, silinir ve güncellenir. Kısaca, SQL
veritabanlarında kullanılan komut dilidir. Unix tabanlı sistemler için geliĢtirilen ancak zaman içinde Windows,
Linux, Mac OS gibi pek çok sistemdede kullanılabilir hale gelen MySQL veritabanları arasındaki en hızlı
sistemlerdendir. Oracle'dan sonra en hızlı veritabanı olan MySQL, kullanımı kolaylığı ve Linux iĢletim istemi yada
ticari olmayan kullanımlar için bedava olmasından dolayı Web üzerinde en çok tercih edilen veritabanı
durumundadır.
MySQL, ayrıca tüm programlama dilleri tarafından da
desteklenir. Sorguları salt SQL kodları ile alıp gönderdiği
için oldukça hızlıdır ve kullanıldığı dili fazla zorlamaz. MySQL'de veriler sunucu üzerinde tutulur, size tahsis
edilen Ģifre ile bu veritabanına eriĢerek veri akıĢı sağlanır.
PHP, MySQL için biçilmiĢ kaftan gibidir. Bunun yüzden PHP ve MySQL muhteĢem ikili olarak adlandırılır. Her
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
387
ikiside Unix tabanlı sistemler için geliĢtirildiği için
birbirine son derece uyumludur ve hızlıdır.
Veritabanı ve Tablo Nedir
Tablo demek satır ve sütunlardan oluĢan bilgiler yığınıdır.
Fiziksel anlamda bir veritabanı ise değiĢik tabloların bir arada bulunduğu alandır. Gözünüzün önüne bir Excel
sayfası getirin. Her sayfa bir tablo, Excel dosyasının
kendisi ise Veritabanına karĢılık gelir. Tablo tasarımı ise çok bilgi ve tecrübe gerektiren bir konudur. Çünkü kötü
tasarlanmıĢ bir tablo üzerine yazılan kod sonuçta bir gün mutlaka kullanıcıyı yarı yolda bırakır.
Örnek bir tablo
No Adı Soyadı Sınıfı Doğum Tarihi
1 Ġbrahim Kutluay 5 01.04.1974
2 Ġsmail Kutluay 4 02.02.1976
3 Tuba ġahin 2 03.05.1980
Mysql Tablo Tipleri
Mysql standart olarak iki tipte tablo kullanır. Myisam ve
Innodb. Ancak Oracle Innobase, Ģirketini satın alınca Mysql AB Ģirketide Interbase VTYS‘nin ilk geliĢtiricisi Jim
Starkey‘i iĢe alarak kendi tablo formatını geliĢtirme yoluna gitmiĢtir. Ancak Ģu anda hala ilk iki format
günceldir.
Mysql Veri Tipleri
Veri tipleri sadece Mysql için değil tüm programlama dilleri ve veritabanı programları için bilinmesi gereken
konulardır. DeğiĢkenler konusu hatırlanacak olursa bu
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
388
olayı kavramak kolaylaĢır. Dile veya göre programa göre
değiĢseler de mantık hep aynıdır. Mysql için 4 ana tip vardır. Metin, sayı, tarih/zaman ve küme tipleri. Bir
tablo sütunu için bir tip belirlemek demek o alana nasıl bir bilgi depolanacağının belirtilmesi demektir.
Metin tipleri
CHAR( ) 0 ile 255 karakter uzunlukta sabit kayıt boyutlu metin alanı.
VARCHAR( ) 0 ile 255 karakter uzunlukta değiĢken kayıt boyutlu metin alanı.
TINYTEXT Maksimum 255 karakterlik metin alanı
TEXT Maksimum 65535 karakterlik metin alanı
BLOB Maksimum 65535 karakterlik metin alanı
MEDIUMTEXT Maksimum 16777215 karakterlik metin alanı
MEDIUMBLOB Maksimum 16777215 karakterlik metin alanı
LONGTEXT Maksimum 4294967295 karakterlik metin alanı
LONGBLOB Maksimum 4294967295 karakterlik metin
alanı
Parantezler kullanılarak alanların maksimum uzunluğu
tanımlanabilir. VARCHAR(20) gibi.
CHAR ve VARCHAR Farkı
Bu iki tipteki metin alanı en çok kullanılan tiplerdir. Char tabloda sabit geniĢlikte yer tutar. Örneğin isim char(100)
Ģeklinde bir alan tanımlandıysa ve bu alana ―ALĠ‖ bilgisi girilirse veritabanı geriye kalan 97 karakteri boĢluk ile
dolduracaktır. Varchar tipi alanda ise alan geniĢliği ne
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
389
olursa olsun kaydettiğiniz bilginin uzunluğu kadar yer
kullanılır. Bu hesap gerektirdiği için ve char ipinde alan geniĢliği hep aynı olduğu için Char tipli alanların nispeten
biraz daha hızlı çalıĢtığı söylenir. Aslında bana görede bu mantıklıdır. Ancak bu konuda araĢtırma yapan bazı
arkadaĢlarım diğer veritabanı sistemlerinde olsun Mysql de olsun ya bu fark konusunda 3 Ģey söylüyorlar.
1. Varchar daha yavaĢtır.
2. Evet varcgar daha yavaĢtır ancak fark önemsiz
denecek kadar az
3. Varchar daha hızlı
Ancak disk üzerinde ve hafıza kullanımında tasarruf sağladığından varchar daha çok tavisye edilmektedir.
Aynı tabloda hem char hemde varchar tipi alan varsa Mysql uyum sebebiyle char alanları varchar tipine
çevirmektedir.
BLOB ve TEXT Alanlar
BLOB Binary Large OBject . TEXT ve BLOB alanlar değiĢken boyutlu ve uzun metinleri tutmak için kullanılan
alanladır. Varchar tipinin daha uzun veri tutabilen üst sürümleridir. Bu tipler büyük metin parçaları
depolayabilirler ancak diğer tiplerden çok daha yavaĢtırlar.
Sayısal Veri Tipleri
Sayısal tipleri kullanarak tüm sayısal alan depolacak
tablo alanları tanımlanır. Ancak bu alan kullanılırken öncelikle alt ve üst sınırlara ve ondalık durumuna dikkat
edilmelidir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
390
TINYINT( ) -128 ile 127 arası yada 0 ile 255 arası iĢaretsiz (UNSIGNED)
SMALLINT( ) -32768 ile 32767 arası yada 0 ile 65535 iĢaretsiz
MEDIUMINT( ) -8388608 ile 8388607 arası yada 0 ile 16777215 arası iĢaretsiz
INT( ) -2147483648 ile 2147483647 arası yada 0 ile 4294967295 arası iĢaretsiz
BIGINT( ) -9223372036854775808 ile 9223372036854775807 arası yada
0 ile 18446744073709551615 arası iĢaretsiz
FLOAT Küçük boyutlu ondalıklı sayı
DOUBLE( , ) Büyük boyutlu ondalıklı sayı
DECIMAL( , ) Metin tipte saklanan Double tipli
değiĢkendir.
Tamsayı tiplerinde gördüğünüz iĢaretsiz (UNSIGNED) seçeneği ek bir özelliktir. Normalde tamsayılar eksi veya
artı değer alabilirler. Ancak sayı unsigned olarak tanımlanırsa eksi değer alamaz ve sıfırdan baĢlar. Buda
sayının taĢıyabileceği üst sınırı artırır.
Tarih / Zaman Tipleri
AĢağıdaki tarih zaman tiplerinde Y yıl, G gün, A ay, S Saat, D dk N Saniye anlamına gelmektedir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
391
DATE YYYY-AA-GG
DATETIME YYYY-AA-GG SS:DD:NN
TIMESTAMP YYYYAAGGSSDDNN
TIME SS:DD:NN.
Küme Tipi
ENUM ( )
ENUMERATION (numaralandırma) tipidir.Sütun gelen
numarayı veri olarak depolar
SET
Enum ile aynıdır ancak veri uygun elemanların bir kaçından olauĢabilir.
ENUM('y','n')
Enum listelerinde 65535 değer olabilir. Bu listede
olmayan bir değer verilirse alana boĢ bir değer atanır. SET yukarda da belirtildiği gibi enum ile aynıdır. Ancak
Set listesinde 64 eleman olabilir ve bunlardan bir kaçıda değer olarak depolanabilir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
392
Tablo Tasarlama, Key Ve Ġndex Kullanımı
Tablo tasarımı yapılırken öncelikle nelerin kayıt alınacağı,
bunlara girilecek bilgilerin tipi ve uzunluğu saptanır. Daha sonra yapılacak optimizasyonlar yapılır, anahtar
alanlar vs saptanır ve daha sonra tablo oluĢturulur.
Örnek bir tablo
No Adı Soyadı Sınıfı Mezuniyet
1 Ġbrahim Kutluay 5 Yüksekokul
3 Ġsmail Kutluay 4 Üniversite
2 Tuba ġahin 2 Ortaokul
8 Ġbrahim ġahin 5 Lise
4 Ġsmail ġahin 1 Lise
9 Azize ġahin 2 Lise
5 Türkan ġahin 1 Lise
ġimdi genel mantık açısından tablo tasarımı konusunda
fikir geliĢtirelim.
Görüldüğü gibi öğrenci no herkes için tek bir değer
almaktadır. Ġsim ve soy isim char ve ya varchar olarak tanımlanabilir ve 20 karakter yeterlidir. Sınıf değeri için
Ģu anda smallint tipi bile uygun ama 6 FEN C gibi
değerler içinde hazır bir alan tutmak adına varchar yada char tanımlanabillir.
Burada tasarım hüneri bunlarda değil son iki sütundadır. ġöyleki gördüğünüz gibi cinsiyet bilgisi 5, mezuniyet ise
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
393
10 karakter uzunlukta. Tabloda 1.000.000 kayıt var ise
bu iki sütun toplam 15 Mb yer kullanacaktır. Peki biz cinsiyet değeri yerine, erkek =1 kadın= 0 olarak smallint
, ve de mezuniyet için aynı teknikle, ilkokul =0, ortaokul=1, lise=2 , Myo =3 ve Üniversite=4 diye iki
değer kullansak nasıl olur. Ekrana görüntülerken ilave kod yazmak gerekecek ancak ilk hali ile 15 MB yer
kullacak olan bu sütunlar smallint ile sadece 2 MB yer tutacak. Tabii bu değerler liste alınırken vs hafızanın
daha ekonomik kullanılmasınada yarayacak.
Son olarak ise arama iĢlevleri için hazırlık yapmaya
gelelim. ġimdi Örneğin adı Tuba olan öğrenciyi bulmak istersek ne yapmak gerekecek. CSV örneklerini
hatılarsak For each ile bütun tabloyu sırayla okuyup kontrol edeceğiz. Peki bu iĢlemi hızlandıramazmıyız.
Örneğin yukardaki asıl tablonun asıl tablonun yanında
birde anahtar dosya tanımlasak. Mesela numara alanı için
Öğrenci no Adı
1 Ġbrahim
2 Ġsmail
3 Tuba
4 Ġsmail
5 Türkan
8 Ġbrahim
9 Azize
ġeklinde kayıt tutan bir indeks dosyası tanımlasak ve burada kayıtlar sıralı olduğu için arama yöntemleri
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
394
kullansak nasıl olur. Örneğimizde 8 nolu kayda ulaĢmak
için 5 kayda gidip kontrol etmek gerekirken ikiye bölerek arama yöntemi kullanılırsa neler olur.
Bu töntemde kayıtların en ortasındaki eleman bulunur.
Örneğimizde bu 4 tür. Aradığımız değer bundan büyükse buraya kadar elemanlar iptal olur, küçükse bundan
sonraki değerler iptal olur. Görüldüğü gibi ilk elemede kayıtların yarısı uçmakta. Daha sonra orta eleman 8
oluncaya kadar bu yüntem devam edecektir.
Key kullanmanın tek faydası bu değildir. Key alanlar
tablolar üzerinde iĢlem yaparken bize doğru kayıtların iĢleme girmesi konusunda ehberlik eden alanlardır.
Örneğin yukardaki tabloda ―adı Ġbrahim olan kaydı sil ― deseydik silinen kayıt sayısı iki olacaktı. Peki ya silmek
istediğimiz kayıt sadece bir tane olsaydı. Bu durumda
ilgili kaydın numarasını vermemiz gerekirdi. ĠĢte key alanlar bu konuda yardımcı olarak ön plana çıkarlar.
Key alan kullanmadan veri giriĢi yapılır ancak silme yada güncelleme yapılacak olursa iĢler karıĢır.
Programcılık dünyasında artık veritabanı tasarımı ayrı bir uzmanlık alanı haline gelmiĢtir. Yukarda saydıklarımız
Ģüphesiz kimseyi veritabanı yöneticisi yapmaz ama arama algoritmaları ve indekslerin gerekliliği ise sadece
tavsiye anlamında kaynaklarda yer almaktadır. O bakımdan iĢin detayını öğrenmek bakımından iyi bir adım
atılmıĢ olmaktadır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
395
MYSQL ‘i Komut Satırından Yönetmek
PHP dilinin baĢında PHP ile Mysql arasında nasıl iletiĢim
kurulduğundan bahsedilmiĢti. Ancak MYSQL sadece böyle değil komut satırından da yönetilir. Komut satırından
kasıt Windows komut noktası değilde bu komutları anlayacak bir SQL iĢlemcisinin komut satırıdır. Burada
göreceğiniz komutlar komut satırına yazılıyor olsalarda aslında normal SQL dili komutlarıdır. SQL standartlarına
uygun tüm VTYS ler içinde geçerlidirler. Kısaca öğrenmek lehinize olacaktır. Basit birkaç komut görelim daha sonra
ise SQL dilinin detaylarına girelim.
Mysql’i BaĢlatmak
Benim kullandığım Uniform paketinde bu iĢ için komut noktasında ―c:\> satırında‖ iken ―mysqld-opt.exe‖
komutu verilemektedir. Böylece Mysql çalıĢacaktır.
Komut Satırından Veritabanı OluĢturmak
Mysqladmin komutu bu iĢlemi yapacaktır. –u parametresi
ile kullanıcı adı belirtilir.
mysqladmin -u root create veritabaniadi
Ģeklinde kullanılır.
Komut Satırından Tablo OluĢturmak
MySQL'de bir tablo oluĢturmak için CREATE TABLE komutu Ģöyle kullanılır:
CREATE TABLE tablom (id INT , alan1 VARCHAR(10), alan2 VARCHAR(10)) ;
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
396
Bu komutla, "tablom" isimli üç sütunlu bir tablo oluĢturulur:
ilk sütunda sadece tam sayı olan değerler bulunabilir,sonraki iki sütunda ise en fazla 10 karakterlik
değiĢen boyutta alfanümerik değerler yer alır.
Genel bir kural olmamakla birlikte tablolarda bir adet indeks alanı bulunması mutlaka tavsiye edilir. Bu alan
genellikle otomatik artıĢlı bir alandır. Yine genel olarak bu alanın ya adı ―id‖ olur yada alan adı ―id‖ ile biter.
Komut Satırından Veri GiriĢi
Create table ile oluĢturulan bir tabloya veri giriĢi için INSERT INTO komutu kullanılır:
INSERT INTO tablom (id, alan1, alan2) VALUES
(1,'Ali’,'Veli')
Bir tablonun oluĢturulması ile içine veri yerleĢtirilmesi
komutları ayrı ayrı zamanlarda, ayrı iĢlemler olarak yapılabileceği gibi, toplu bir metin halinde, otomatik
olarak da yapılabilir.
Komut Satırından Veri Sorgulama
Bir tablodaki bilgileri görmek yada bir tablodan koĢul yada
oĢullara göre kayıt sorgulamak için SELECT komutu kullanılır.
SELECT * FROM tablom ;
Bu, MySQL programına, tablom adlı tablodaki bütün kayıtların okunmasını bildirir. Buradaki "*" iĢareti, "bütün
sütunlardaki bütün değerler" anlamına gelir. KoĢul verilmediği içinde zaten tüm kayıt satırları okunacaktır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
397
Sadece alan1 alanındaki bilgileri gömek isteseydik, bu
komutu Ģöyle yazmak gerekirdi:
SELECT alan1 FROM tablom;
Select komutunda sadece bize gereken sütunların seçilmesi çok önemli bir konudur. Bir çok üşengeç
programcı SELECT * from diyerek işi daha kısa yoldan haletliğini sanır ancak bu her zaman dğru
değildir. Hatta genellikle yanlıştır. Neden derseniz. Select komutu sonuç olarak bir çıktı üretmektedir.
Bu çıktı ya ekrana yollanacaktır yada istenen yere.
Web ortamında buna riayet etmezseniz sonuçta
almanız gerekenden daha büyük bir sonuç veri kümeniz olacaktır. Böylece hem sunucu gereksiz
yorulacak, hem siz işinize yaramayan bir bilgiyi sunucudan almak için gereksiz zaman harcamış
olacaksınız hemde sunucu trafiği olumsuz
etkilecenecektir. Cidden amacınız sadece ad-soyad listsi almak ise yanda tüm kimlik detay bilgilerinide
görmek istermiydiniz.
Komut satırından Bilgi DeğiĢikliği Yapmak
Bir tablodaki bilgilerin yenileriyle değiĢtirilmesini, yani
tablodaki kayıt yada kayıtların güncelleĢtirilmesini UPDATE komutu sağlar. Veritabanı dosyalarını
güncelleĢtirme zorunluğu bulunması ise bize veritabanı tasarımının çok önemli olduğunu gösterir. Örneğin:
UPDATE tablom SET alan1 = "Ali" ;
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
398
Bu komut, tablodaki bütün satırlarda, ilgili sütundaki
değerleri "Ali" olarak değiĢtirmekle sonuçlanır. Amacımız gerçekten bu olsaydı sorun değil ancak genelde sadece
bir yada bir koĢula göre değiĢiklik yapılması gerekir. Kısaca MySQL'e hangi satırda (veritabanı diliyle
söylersek, hangi kayıtlarda) değiĢiklik yapılacağını daha ayrıntılı söylememiz gerekir. Veritabanı dosyamızı
oluĢtururken, her kaydın diğer kayıtlarda olmayan (unique) bir sütun (bunu da veritabanı tekniğindeki
terimle söylersek alan) bulunmalıdır. Yukardaki key kullanımını hakkında yazılanları hatırlattıktan sonra öneği
yeniden ele alalım
UPDATE tablom SET alan1 = "Ali" WHERE id = 1;
MySQL bu komutu gördüğü zaman sadece id alanı 1 olan kiĢinin (yani 1 nolu kaydın) "alan1" alanındaki değeri
bizim verdiğimiz yeni değerler yani ―Ali‖ olarak
değiĢtirecektir.
Komut Satırından Kayıt Silmek
Bir MySQL tablosundaki kayıt yada kayıtları silmek için -
DELETE komutu kullanılır:
DELETE FROM tablom WHERE id = 1;
Şimdi id alanı olmasaydı nasıl kayıt silerdik diye
düşünmen yeridir sanırım. Tabloda sadece bir kayıtta id 1 olacağı için bu komutla sadece bir satır silinecektir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
399
SQL Dilinin Tarihçesi
Veritabanı sistemleri herhangi bir bilgiyi
depolayabileceğimiz ortamlardır. GeniĢ ölçekli ulusal bilgi bankalarından, bir öğrencinin notlarına varıncaya kadar,
veritabanları bilgileri depolayıp dağıtabilirler. Ġlk baĢta bu iĢlemler için metin formatlı dosyalar kullanılmıĢ bunlar
yetersiz kalınca ise veritabanı programları geliĢtirilmiĢtir.
15-20 yıl öncesine kadar büyük veritabanı sistemleri yalnızca büyük mainframe bilgisayarlarda çalıĢabilirlerdi.
Haliyle pahalı fiyatlara sahiptiler. Günümüzde kullanılan çoğu ev bilgisayarları bile o zamanın süper bilgisayarları
kadar hızlanmıĢ olup verileri daha hızlı ve ucuz bir Ģekilde dağıtmada yardımcı olmaktadır.
Bilgisayar ortamında tutulan kayıtlar arttıkça bunları iĢlemek, süzmek, yedeklemek, aralarındaki iliĢkileri
koruma için geliĢtirilen programların ortak adı DBMS (Data Base Management System) -ki biz bunu Türkçeye
VTYS olarak çevirelim- programlarıdır. Bu VTYS sistemlerinde bulunan kayıtlarla iĢlem yapmak ortak bir
yöntem aranmaya baĢlayınca 1970 yılların sonunda IBM DB2 VTYS için SQL dili geliĢtirildi. SQL (Structured
Query Language) Yapısal Sorgulama Dili anlamına
gelmektedir. SQL dilinin amacı sistemi yönetenler kadar kullanıcılarında neredeyse günlük konuĢma Ġngilizcesine
yakın bir Ģekilde verilerle iĢlem yapabilmesidir. Eğer ortaokul düzeyinde Ġngilizceniz var ise SQL dili size zor
gelmeyecektir. SQL prosedürel bir dil değildir. Bunun anlamı veritabanı operasyonunun nasıl yapılacağından
çok ne olduğudur. Hangi kayıtlar çekilecek, eklenecek, silinecek vb. Günümüzde birde RDBMS –ĠVTYS diyelim-
dediğimiz iliĢkisel veritabanları vardır. DBMS (VTYS) ile
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
400
RDBMS (ĠVTYS) arasındaki karakteristik fark RDBMS'nin
set-oriented (küme yönelimli) veritabanı dili sunmasıdır. Birçok RDBMS'in veritabanı dili SQL'dir. Küme yönelimli
demek SQL'in veri kümesini grup halinde iĢleme tabi tutmasıdır.
VTYS geliĢtiricileri programlarına SQL komutlarını anlama, iĢleme yeteneklerini eklemektedirler. Ancak her
Ģirket kendi VTYS programını daha iyi hale getirmek için ayrı ayrı komutlar ekleyince bir standart belirlemek
zaruri hale geldi. Günümüzde SQL dili için iki ayrı kurum iki ayrı standart belirlemiĢtir. Bunlardan biri ANSI
(American National Standards Institute) diğeri ise kısa adı ISO olan International Standards Organization‘ dur.
VTYS sistemlerinin bir çoğu ANSI-92 standardına tam uyum desteğiyle gelirler.
ĠliĢkisel Bir VTYS Ġçin 12 kural
En popüler veri depolama modeli olan RDBMS -iliĢkisel
veritabanı- 1970' de Dr.E.F-Codd tarafından tanımlanmıĢtır. Codd ĠVTYS sistemleri için olmazsa olmaz
12 kuralı velirlemiĢtir. Bunlar Codd‘un 12 kuralı olarak bilirnirler. Bunlar sırasıyla;
1. Relational Data Process
2. Informaton rule
3. Guaranteed acces
4. Systematic Null Value Support
5. Active, Online Katolog
6. Comprenhensive Data Sublanguage
7. View updating rule
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
401
8. Set level Insertion, update, and deletion
9. Physical Data Independence
10. Logical Data Independence
11. Integrity Independence
12. Distribution Independence
Olarak belirlenmiĢtir.
1- Relational Data Process: ĠVTYS
programları depoladıkları bilgileri veritabanını iliĢkisel olarak yönetebilmeli
2- Information Rule : Bütün bilgiler bir iliĢkisel veritabanında (tablo ve kolon adları
dahil) bir tablodaki değerler gibi gösterilebilmeli. (Örneğin Mysql de bütün
veritabanı isimleri, bunların içinteki,tablolar, bu taplardaki alanlar ve bu alanlarında
tipleri, uzunlukları da Mysql tablolarında
tutulmaktadır)
3- Guarented access : ĠliĢkisel veritabanı
içindeki her değer tablo adı, birincil index değeri ve kolon adları birleĢtirilerek
eriĢilebilir olmalı.
4- Systematic Null Value Support :
Veritabanı yönetim sistemi altyapı olarak null verileri (değerleri verilmeyen veya
uygulanabilir olmayan veri) desteklemeli.
5- Active, Online Catalog : Veritabanı tanımı
ve içeriği mantıksal seviyede bir tablo gibi
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
402
veritabanı dili tarafından sorgulanabilmeli.
(bkz.Madde 2)
6- Comprenhensive Data Sublanguage : En
az bir dil, veritabanı tanımlanmalı ve bu dil, veri tanımlama, değiĢtirme ve güvenilirlik
kuralları, yetki ve hareketleri destekmeli. (örneğin SQL gibi)
7- View updating rule : Bütün görüntü tabloları (view) sistem tarafından
güncellenmeli.
8- Set level Insertion, update, and deletion
: Veritabanı sistemi sadece kayıtları seçme iĢlemini değil aynı zamanda veri kümesi
seviyesinde ekleme, güncelleme ve silme yapabilmeli.
9- Physical Data Independence : Uygulama
Programı mantıksal olarak Fiziksel eriĢim metodu veya depolama yapısı değiĢtiğinde
etkilenmemeli.
10- Logical Data Independence : Uygulama
programı tablo yapısındaki değiĢikliklerden etkilenmemeli.
11- Integrity Independence : Veritabanı güvenlik kuralları tanımlayabilmeli ve bunu
online katalog içinde depolayıp geçersiz kılınamamalı. (Örneğin mysql2in kullanıcı
yetki tablosu)
12- Distribution Independence:
Veritabanındaki veriler tekrar tekrar
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
403
dağıtılabilmeli. 12- Nonsubversion :
TanımlanmıĢ güvenlik kuralları düĢük seviyeli dillerle etkisiz hale getirilememeli.
Bir çok database'in ata-çocuk iliĢkisi bulunmaktadır. Ata her bir çocuk için iĢaretçiler içerir. Bu metodun bir çok
avantaj ve dezavantajları vardır. Bu sayede disk üzerindeki fiziksel veri yapısı önemini kaybetmektedir.
Programcılar basit olarak iĢaretçileri bir sonraki yerde saklayarak veriyi eriĢilebilir kılmaktadır. Bu yolla veri
kolayca eklenebilmekte ve silinebilmektedir.
Codd'un fikri ĠVTYS‘lerin, iliĢkisel cebirin matematiksel
konseptleri ile veriyi küme ve iliĢkisel altkümelere bölmekti. Çünkü bilgi doğal olarak farklı kümeler yoluyla
gruplanır. Dr.Codd. Veritabanı sistemini bu konsept etrafında toplamıĢtır. ĠliĢkisel model altında veri
kümelere bölünmüĢ ve tablo yapısında toplanmıĢtır. Bu
tablo yapısında veri elementleri kolon veya alan ( Column-Fields) olarak anılır. Bir grup alan kümesi satır
veya kayıt olarak bilinir.
SQL Dilinin Bölümleri
SQL dilinde komutlar 3 gruba ayrılır.
DDL (Data Definition Language):Veri tanımlama komutları.
DML(Data Manupulation Language):Veri düzenleme ve iĢleme komutları.
DCL (Data Control Language):Veri kontrol komutları.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
404
A. DDL (DATA DEFINITION LANGUAGE) KOMUTLARI
DDL deyimleri veritabanı üzerinde nesne (tablo, yeni
veritabanı, tablo alanları) yaratmak için kullanılırlar. En yaygın kullanılan DDL deyimleri Ģunlardır:
CREATE
ALTER
DROP
B. DML (DATA MANIPULATION LANGUAGE) KOMUTLARI
Veritabanı içindeki seçmek, değiĢtirmek, güncellemek ve silmekle ilgili SQL deyimleridir.
SELECT
INSERT
UPDATE
DELETE
C. DCL (DATA CONTROL LANGUAGE) KOMUTLARI
Veritabanındaki kullanıcı haklarını düzenlemek için
kullanılan deyimlerdir.
GRANT
DENY
REVOKE
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
405
SQL Komutları ve Örnekler
SQL diline ait komutları kendilerine ait bölümlerde
inceleyelim. Ancak Ģunu hatırlatmaka fayda var SQL diline ait komutlar büyük-küçük harf duyarlı değildirler.
Örneğin select, Select, SELECT ve SEleCT komtularının hepsi aynı olarak ele alınır. Ancak bu sadece SQL
komutları için geçerlidir. Metin ifadeler bunun dıĢındadır.
Örneğin adı ―Ali‖ olan kayıtları listele gibi bir komut yazdığınızda varsayılan olarak ―Ali‖ olan kayıtlar
gelecektir ama ―ALĠ‖ ve ―ali‖ gibi kayıtlar gelmezler. Çünkü bu bir komut değiĢ verilen bir Ģarttır ve bilgisayar
aslında siz ne emrederseniz onu yapmaktadır. Kısaca bilgisayar verdiğiniz emre bakar aslında ne kastettiğiniz
konusunda tahmin yürütmez.
Bu arada son kez hatırlatmıĢ olalım yazdığınız SQL
ifadeleri ne kadar kaliteli ve optimize edilmiĢ ise bu sitenizin (veya masaüstü program yazıyorsanız
programın) hızına birinci dereceden etki eder. Örneğin bir okuldaki öğrenciler içinde 6-A sınıfındaki öğrencilerin
listeleneceğini farzedelim. Bunu PHP ile iki Ģekilde yapmak mümkündür.
Mysql‘ e ―Tüm kayıtları gönder‖ der ve gelen
kayıtarı kontrol edip 6-A öğrencilerini ekrana kendiniz yazarsınız.
Mysql‘e ―Okuldaki öğrecileri öğrencileri kontrol et ve 6-A öğrencilerini gönder‖ dersiniz ve buradan
gelen tüm kayıtları ekrana yazarsınız.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
406
ġüphesiz bu iki iĢlemi yapan kiĢide programcıdır ancak 1.
iĢlemi programıcı amatör iĢi yapmıĢtır.
Komutlara geçmeden önce son bir hatırtmada bulunalım.
SQL, sadece PHP diline yada MYSQL‘ e ait bir kavram değildir. Bugün PHP, Java, C++, Delphi, Python, ASP, C#
dahil hangi dile bulaĢırsanız bulaĢın mutlaka temel SQL bilmeniz gerekir. Yine aynı Ģekilde Interbase, MsSQL,
Oracle, Mysql, Firebird vs hangi ĠVTYS sistemini kullanırsanız kullanın mutlaka SQL bir gün size lazım
olacak. Onun için SQL konusunu çok ama çok iyi çalıĢmalısınız.
A. DDL KOMUTLARI
CREATE Komutu
CREATE komutu tablo ve view gibi bir veritabanı nesnesi yaratmayı sağlar. (Create ayrıca yeni veritabanıda
oluĢturabilir.)
Mysql‘de sütun adlarını sınırlamak için ― ` ‖ karakteri kullanılır. Normalde bu verilmedende iĢlem yapılır.
normal SQL nostasyonlarında bu karaktere gerek yoktur.
Kullanım Yapısı:
CREATE <tablo adı>
Örnek:
CREATE TABLE ogrenci
(
ogrno INT,
adi VARCHAR(30),
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
407
soyadi VARCHAR(30)
) ;
Daha üst düzey bir örnek
CREATE TABLE ders01a (
id INT NOT NULL AUTO_INCREMENT,
ad VARCHAR( 25 ) NOT NULL ,
soyad VARCHAR( 25 ) NOT NULL ,
tel VARCHAR( 15 ) NOT NULL ,
email VARCHAR( 40 ) NOT NULL ,
PRIMARY KEY ( id )
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE
utf8_turkish_ci;
ALTER DEYĠMĠ
Daha önce yaratılmıĢ nesnenin değiĢtirilmesini sağlar.
Örneği bir tablonun tasarımını değiĢtirmek gibi.
Örnek:
ALTER TABLE ders01a ADD msn VARCHAR( 40 ) NOT
NULL ;
Yukardaki komutla ders01a tablosuna birde msn adlı alan eklenmektedir.
DROP DEYĠMĠ
Bir nesnesin silinmesini sağlar.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
408
Örnek:
DROP TABLE ders01a
Yukardaki örnek kod az ders01a adlı tabloyu mevcut
veritabanından kaldıracaktır. Yani tablo komple yok olacaktır.
Drop Database Ģeklinde kullanılrsa bu komut komple bir veritabanınıda silebilir.
B. DML (DATA MANIPULATION LANGUAGE) KOMUTLARI
SELECT DEYĠMĠ
Tablolardan koĢul belirterek yada belirtmeden verilerin bir kısmına yada tümüne eriĢmeyi sağlayan komuttur.
Genellikle bir ya da daha çok tablonun bütün alanları ya da belli alanları için SELECT deyimi yazılır. SELECT
komutu tartıĢmasız olarak en çok kullanılan SQL komutudur.
Temel Kullanımı:
SELECT [ALL] [DISTINCT] liste [INTO yeni tablo] FROM
[tablo]
[WHERE ifade]
[GROUP BY ifade]
[HAVING ifade]
[ORDER BY ifade]
[COMPUTE ifade]
[LIMIT ifade]
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
409
Parametrelerin Anlamları:
ALL : Parametresi bütun sütunları döndürür. DISTINCT : Parametresi çiftleyen kayıtlardan sadece
birer tane gelmesini sağlar. liste : Parametresi tablodan döndürülecek sütunların
isimlerini bildiren listedir. INTO :Parametresi Select ifadesiyle gelen kayıtları baĢka
bir tabloya doğrudan yazmaya yarar. yeni tablo : Parametresi sorgu sonucu yaratılacak
tabloyu belirtir. FROM : Verilerin hangi tablodan getirileceğini belirtir.
tablo : Parametresi ise sorgulanacak olan tablo ya da tabloları, görünümleri belirtir.
WHERE : Select ifadesi için koĢul belirtmeye yarar.
GROUP BY: Kayıtların gruplanmasını sağlar. HAVING : Grupların ara toplamları alınır. HAVING
sözcüğü de kayıtlarda kısıtlama yapar ancak hesaplamayı etkilemez.
ORDER BY: Sorgulama sonucu dönen kayıtları belir bir sütuna göre artan (ASC) yada azalan (DESC) Ģekilde
sıralamayı sağlar. COMPUTE : Parametresi ise hesaplama yapar. Tipik
olarak SUM, AVG, MIN, MAX, COUNT gibi fonksiyonları kullanarak hesaplama yapar.
LIMIT : Parametresi ifade ile verilen sayıda kaydı dönderir.
LIMIT Mysql ile kullanımda belirli bir özelliğe sahiptir. Normal SQL de ―limit 10‖ ilk 10 kaydı getir demektir.
Ancak Mysql de ―limit 0,10‖ ilk 10 kaydı getir demekken
―limit 100,10‖ 100. kayıttan sonraki ilk 10 kaydı getir
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
410
demek anlamına gelir. Bu iĢlem en çok verileri sayfalar
halinde listelemeye yarar
Yukardaki karĢık kullanım tablosu yerine en basit kullanım için Select komutu
Select (alan adi) from (tablo adı);
Ģeklindedir.
Örnek:
SELECT * FROM ders01a
Bu komut ders01a tablosundaki tüm kayıtları seçer. SELECT deyiminin ardından kullanılan * iĢareti bütün
kayıtlar anlamına gelir. Bu deyimin aynısı Ģu Ģekilde de yapılabilir:
Örnek:
SELECT id,ad,soyad,tel,email,msn FROM ders01a
SELECT deyimi ile sadece belli kolonlar (alanlar) da seçilebilir:
SELECT id,ad,soyad FROM ders01a
Yukardaki komutla tablodan id, ad ve doyad kolonları seçilmiĢtir.
SELECT Distinct ad FROM ders01a
Yukardaki komutla ders01a dosyasında isimler sadece
birer kere listelenecektir. Yani 10 tane adı Mehmet olan öğrenci varsa bunlardan sadece birisi listelenecektir.
SELECT * FROM ders01a Order by Sinif
Yukardaki komutla tablodaki kayıtlar sinif alanına göre
sıralanarak listelenecektir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
411
SELECT * FROM ders01a Order by Sinif, ogrencino
Yukardaki komutla tablodaki kayıtlar önce sinif alanına, daha sonra sınıfı aynı olanlarda kendi içlerinde ogrenci
no alanına göre sıralanacaktır.
SELECT * FROM ders01a Order by Sinif DESC
Yukardaki komutla tablodaki kayıtlar sinif alanına göre büyükten küçüğe göre sıralanacaktır.
SELECT * FROM ders01a Group by Sinif
Yukardaki komutla tablodaki kayıtlar sinif alanına göre
gruplanarak listelenecektir.
SELECT * FROM ders01a LIMIT 0 , 300
Tablodan ilk 300 kaydı seçerek listeler
SELECT * FROM ders01a LIMIT 10
Tabloadan ilk 10 kaydı seçerek listeler
SELECT * FROM ders01a LIMIT 100 , 20
Tablodan ilk 100 kayıttan sonra gelen 20 kaydı seçerek
listeler
SELECT mamul, siparisadet FROM siparisler ORDER BY
mamul COMPUTE SUM(adet)
Yukarıdaki örnekte siparisadet kolonunun toplamı alınır.
AS Deyimi ile Alias Tanımlama
SQL kullanımında kullanıcının iĢini kolaylaĢtıran
iĢlevlerden biride Alia yani Lakap kullanımıdır. Lakaplar hem bir tablo, hem alan isimleri hemde sanan sütunlar
için kullabılabilir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
412
Örneğin hazır bir veritabanı olsun. Bu tabloda personel
için L_01_employee_db_recs olsun… Bunu SQL çinde doğru yazmak kesinlikle zor..Üstelikte birden fazla
tablodan kayıt çekilen ve ilerde görülecek olan Join iĢlemlerinde SQL yazmak için hem kodu uzatan hemde
okumayı zorlaĢtıran bir durum. ġimdi koda bakalım ve durumu daha iyi anlayalım. Kod yazılırken Joinli
ifadelerdeki notasyon kullanılmıĢtır.
Select L_01_employee_db_recs.name,
L_01_employee_db_recs.surname, L_01_employee_db_recs.date1
Select abc.name,abc.surname, abc.date1 from L_01_employee_db_recs AS abc
Görüldüğü gibi abc yerine ―eleman‖ gibi daha anlaĢılır bir isim yazılacak olursa kodu okumak dahada kolaylaĢacak.
Aslında burada mantık basit. SQL çalıĢtıran sisem burada
kullanıcıdan aldığı ifadeler yerine çalıĢtırmadan önce gerçek hallerini koyup öyle iĢlem yapmaktadır, hepsi bu.
Where Deyimi
Where deyimi aslında en çok Select ile birlikte kullanılır. Ancak where deyiminin tek kullanım alanı bu değildir.
Where kayıt silerken veya güncellerkende kullanılması
adeta zorunlu bir deyimdir. Select komutunda kullanılan Where parametresi ile belirli koĢullara uyan kayıtların
seçilmesi sağlanır. Aslında bu olay çok önemlidir. Örneğin Adana‘da oturan kiĢilerin listesi dediğimiz zaman
yapabileceğimiz iki Ģey vardır. Ya 70 milyon kaydı çeker tek tek oturduğu yer kontrol edilir. Yada daha
veritabanından sorgu aĢamasında iken ―Oturduğu yer
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
413
Adana olan kayıtları Ģeç ve bana gönder‖ denilebilir. Bu
iĢlem bize iki fayda sağlar;
1. Web server yorulmaz mümkün olan en az sayıda
kayıtla iĢlemi yapmıĢ olur
2. Gerekmediği halde seçilen kayıtların web bant
geniĢliğini kullanması engellenmiĢ olur
SQL ile Arama Operatörleri
AĢağıdaki tabloda iĢlemde kullanılabilecek operatörler görüntülenmektedir.
KarĢılaĢtırma operatörleri
(=, >, <, >=, <>, !=, !<, !>
Aralık belirtme BETWEEN ve NOT BETWEEN
Liste IN ve NOT IN
String karĢılaĢtırma LIKE ve NOT LIKE
Bilinmeyen değerler IS NULL ve IS NOT NULL
KoĢulların birleĢtirilmesi AND, OR
Tersini alma NOT
ÖRNEK:
SELECT * FROM ders01a WHERE id =1 SELECT * FROM ders01a WHERE adi =’ALİ’
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
414
And ve Or ile Birden Fazla KoĢulun Kontrol Edilmesi
Where kalıbını kullanırken birden çok kritere göre cümle
yazılması gereken durumlarda kullanılır. Kullanım ġekli:
... where kriter1 and kriter2
... where kriter1 or kriter2
SELECT * FROM ders01a WHERE adi =’İbrahim Halil’ and soyadi =’Kutluay’
SELECT * from ders01a WHERE yazili1 BETWEEN 50 AND 100
Aynı anlamda: SELECT * from ders01a WHERE yazili1 >= 50 AND
yazili1>= 100 SELECT * FROM MUSTERI WHERE borc BETWEEN
1000 AND 5000 AND grup='Kkarti' SELECT * from ogr WHERE adi= “Ali” and
adi=”Veli”
In ve Not In Deyimleri
In ve Not In deyimleri bir koĢul için birden fazla değerin kontrol edilmesini sağlarlar. Aslında bunların yerine AND
– OR blokları da yazılabilir ancak bu iki deyim daha temiz bir kod görünümü sunarlar. ġimdi yukardaki son örneği
ele alalım. Daha sonra bunu IN deyimi ile yazalım.
SELECT * from ogr WHERE adi= “Ali” and
adi=”Veli”
SELECT * from ogr WHERE adi IN (“Ali”,”Veli”)
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
415
Görüldüğü gibi ikinci kullanım daha temiz ve anlaĢılırdır.
IN deyimi birden fazla değerin içinden eĢitlik durumunu kontrol ederken NOT In kelime anlamı gibi bunun tersini
yani değerlerin dıĢında olması Ģartını arar.
Like ve Not Like Deyimleri:
Where kalıbı içerisinde kullanılan bu deyim ile regexp
benzeri eĢitlik yada olmama durumları kontrol edilir.
Kısaca, kayıtlarda baĢ harfe veya belli yere kadar olan harf veya harflere göre arama yapmak gibi iĢlerde
iĢimize yarayabilir.
Kullanım ġekli:
... where alan_adı like Ģart
Örnekler:
Select * from eleman where adi like ―A%‖ // Eleman
tablosundaki adı A ile baĢlayanlar
Select * from eleman where adi like ―AL%‖ // Eleman tablosundaki adı Al ile baĢlayanlar
Select * from eleman where adi like ―%A%‖ // Tabloda
adınındaki herhangi bir harf A olanlar
Select * from eleman where adi like ―Ce?al%‖
Son örnek size DOS bĠlgini< varsa wildcaRd olayını hatırlatmıĢ olmalı. Tabloda adı ―Ce‖ ile baĢlayan ve
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
416
ondaki sonraki harfi ne olursa olsun sonu ―al‖ ile biten
kayıtlar listelenmektedir.
Group By Deyimi
Kayıtları belirli bir alana göre gruplamak için kullanılır.
Örneğin müĢterileri Ģehirlere göre gruplanmı olarak listelemek için bu deyimden faydalanılır. Ancak grup by
sadece kendisine verilen sırada iĢlem yapmaktadır. Kısaca kayıtlar sıralı değilse bu iĢlemin sonucu tuhaf
veriler dönebilir. O yüzden temel prensip gruplanacak alana göre sıralama yapılıyor olmasıdır.
Kullanım Ģekli:
SELECT [Alan Adi] FROM [Tablo Adı] WHERE [Seçilen Kriter] Group By [Alan Adı];
Örnekler:
Select * from isim group by ad;
Order By Deyimi:
Tablodan sorgulanan kayıtları sıralamak için
kullanılır.Dikkat edlmesi gereken nokta anahtar alan kullanımıdır. Eğer tabloda anahtar alan var ise sıralama
bu kullanılarak yapıalacağından iĢlemin hızı artacaktır. ĠĢte bu yüzden ilerde olabilecek bu gibi durumlar için
tablonun daha tasalanma aĢamasında gerekli anahtarların konulması önemlidir. Order by ile birden
fazla alan kullanarak sıralama yapılabilir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
417
Kullanım ġekli:
SELECT [Alan Adi] FROM [Tablo Adı] WHERE [Seçilen
Kriter] Order By [Alan Adı];
Örnekler:
Select ad,soyad from eleman order by soyad;
Yukardaki örnekte ―eleman‖ adlı tablodan ad ve soyad
sütunları çekilerek soyad alanına göre sıralanıyor. Peki aynı soyada sahip kiĢiler ne olacak derseniz bir alttaki
örneğe bakalım.
Select ad,soyad from eleman order by ad,soyad;
Bu örnektede aynı tablodan aynı kayıtlar sorgulanmakta. Ancak bu sefer sıralama iĢleminde önce soyad daha
sonrada ad sıralanacaktır. Yani eğer aynı soyada sahip kiĢiler varsa bunlarda adlarına göre sıralanmıĢ olacaktır.
SELECT Ġçinde Aritmetik ĠĢlemler
Bu satırları okurken Ģunu düĢünebilirsiniz ―bu PHP dili de
aptal bir dil, aritmetik bile toplamı yok mu ki SQL ile yapalım.‖
ĠĢin aslı PHP dilinde artimetik iĢlem fonksiyonları var. Ancak öncelikle Ģunu anlamalıyız. PHP dili için değil ama
masaüstü program yapılan diller için konuĢursak;
günümüzde orta halli bir web sunucu bile çoğunlukla evde kullandığımız bilgisayardan çok daha fazla RAM ve
iĢlemci gücüne sahiptir. Kısaca biz hız gerektiren iĢlemleri sunucuda yapar ve sadece sonucu alırsak trafiği
engellemiĢ ve hız kazanmıĢ oluruz.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
418
ġimdi diyeceksiniz ki ―ee PHP zaten sunucuda
çalıĢmıyormu o zaman neden kayıtlar üzerinde ki bu tip aritmetik iĢlemleri PHP ile yapmayayım‖…
Cevabı iki Ģıklı bu sorunun;
1. SQL de yaptırmak her ikiside sunucuda çalıĢmasına
rağmen nispeten daha hızlıdır. Çünkü SQL de Mysql‘in kendisi kayıtları okuyup değeri
hesaplayacak ve bunun için en optimize yöntemi kullanacaktır. Diğer yanda PhP tarafında yapmak
içinse, kayıtlar çekilip değiĢkenlere atanacak, sonra birde bunlarla iĢlem yapılacak ve değer elde
edilecek. Hangisi daha kısa ?
2. Daha kısa kod yazmak için. Yani
SQL ile olsa kod;
select maas+mesai as hakedis from eleman
Gördüğünüz gibi sonuç elimizde PHP ile olsa birde bunları
iĢleyecek while yada for döngüsü kurulacak döngüde iĢlem yapılacak ve bunun için kod yazılıp varsa hatalar bulunup
düzenlenecek.
Aritmetik ĠĢlem Operatörleri
Aritmetik iĢlemleri gerçekleĢtirmek için belli operatörler
kullanılır:
+ Toplama
- Çıkarma
/ Bölme
* Çarpma
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
419
SELECT borc, (borc*10)/100 FROM taksitler
Bu komutla hem gerçek borç hemde vade farkı hesaplanmıĢ hali listelenecektir.
Aggregerate fonksiyonları
SQL dilinin kolaylıkları bununla bitmez. SQL dili, bir sütundaki bilgilerin arasında ortalama, en küçük, en
büyük değerleri bulan fonksiyonları hazır sunar. Yine aynı Ģekilde bir sütundaki değerlerin toplamını veya
sayısını da SQL fonksiyonu ile öğrenmek mümkündür.
sum() fonksiyonu – Bir sütunun toplamı
Bir sütuna göre bir select ifadesinin toplamını alır.
SELECT grp, sum(bakiye) FROM taksitler GROUP BY grp
Yukarıdaki örnekte taksitler tablosundaki bakiye alanı grp kodu bazında toplanır.
SELECT grp, sum(bakiye) FROM taksitler GROUP BY grp HAVING sehir = 'ADANA’
Yukarıdaki deyim ile taksitler tablosundaki bütün kayıtların bakiye bilgileri gruplarına göre ara toplam
alınır, bir de sehir bilgisine göre filtrelenir.
Gruplama yapılmayan her sütun GROUP BY deyiminde
kullanılması gerekir:
Örnek:
SELECT urunid, kategoriid, SUM (fiyat) FROM
urunler GROUP BY urunid, kategoriid
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
420
avg() fonksiyonu – Bir sütunun ortalaması
Bir sütuna göre bir select ifadesinin ortalamasını bulur.
SELECT avg(maas) FROM eleman
Yukardaki sade kullanım iĢlevi görmeniz içindir. Bu
komutla eleman tablosundaki kayıtların ortalama maaĢı bulunur. Tabii koĢul eklemekte mümkündür.
SELECT avg(maas) FROM eleman WHERE bolum=”Bilgi İşlem”
Yukardaki komutta birinci gibi ortalamayı bulur ancak bu sefer bulunan ortalama sadece Bilgi ĠĢlem bölümüne ait
ortalamadır.
SELECT avg (maas+prim) FROM eleman
Yukardaki örneke bu sefer maaĢ ve prim toplamının ortalaması istenmiĢtir. Görüldüğü gibi avg () fonksiyonu
ile basit aritmedik iĢlemelerde yapmak mümkündür.
min() fonksiyonu – Bir sütundaki en küçük değer
Bir select ifadesinin bir sütunundaki değerlerden en
küçük olanı verir.
SELECT min (maas) FROM eleman
Yukardaki sade kullanım iĢlevi görmeniz içindir. Bu
komutla eleman tablosundaki kayıtların içinde maaĢ bilgisi en düĢük olan değer gelecektir. Tabii koĢul
eklemekte mümkündür.
SELECT min (maas+prim) FROM eleman
Yukardaki örnekte bu sefer maaĢ ve prim toplamı en düĢük olan kayıt istenmiĢtir. Görüldüğü gibi min ()
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
421
fonksiyonu ile basit airtmedik iĢlemelerde yapmak
mümkündür.
SELECT min(maas) FROM eleman WHERE
bolum=”Bilgi İşlem”
Yukardaki komutta birinci gibi minimum değerini bulur
ancak bu sefer bulunan değer tüm elemanların değil sadece Bilgi ĠĢlem bölümüne ait en düĢük maaĢ
değeridir.
max() fonksiyonu – Bir sütundaki en büyük değer
Bir select ifadesinin bir sütunundaki değerlerden en
büyük olanı verir.
SELECT max (maas) FROM eleman
Yukardaki sade kullanım iĢlevi görmeniz içindir. Bu komutla eleman tablosundaki kayıtların içinde maaĢ
bilgisi en büyük olan değer gelecektir. Tabii koĢul eklemekte mümkündür.
SELECT max(maas) FROM eleman WHERE
bolum=”Bilgi İşlem”
Yukardaki komutta birinci gibi minimum değerini bulur
ancak bu sefer bulunan değer tüm elemanların değil sadece Bilgi ĠĢlem bölümüne ait en büyük maaĢ
değeridir.
SELECT max (maas+prim) FROM eleman
Yukardaki örneke bu sefer maaĢ ve prim toplamı en fazla olan kayıt istenmiĢtir. Görüldüğü gibi max () fonksiyonu
ile basit aritmedik iĢlemlerde yapmak mümkündür.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
422
count() fonksiyonu – Bir sorguya göre dönen kayıt sayısı
Bir select ifadesinin sonucunda dönen kayıt sayısını verir.
KoĢul belirtilmezse tablodaki kayıt sayısını, koĢul belirtilir ise koĢula uyan kayıt sayısını verir.
SELECT count (maas) FROM eleman
Yukardaki sade kullanım iĢlevi görmeniz içindir. Bu
komutla eleman tablosundaki kayıtların içinde maaĢ
bilgisi en büyük olan değer gelecektir. Tabii koĢul eklemekte mümkündür.
SELECT max(maas) FROM eleman WHERE bolum=”Bilgi İşlem”
Yukardaki komutta birinci gibi minimum değerini bulur ancak bu sefer bulunan değer tüm elemanların değil
sadece Bilgi ĠĢlem bölümüne ait en büyük maaĢ değeridir.
JOIN ĠġLEMĠ
Sql‘de bazen birden fazla tablodan iliĢkilendirme ile
sorgulama yapmak gerekir. Örneği Öğrenci tablosundan no, adı, soyadı, yanına ise Türkçe dersinden aldığı
notların getirilmesi gerektiğinde uygulanacak iĢlem böyle bir sorgudur.
Aslında temel olarak uygun where kullanımı ileda bazı join iĢlemleri yapılabilir ancak JOIN‘in kendisi kodlama
açısından daha sadece bir kullanım sağlar.
ġimdi Personel ve departman adlı 2 tablodan sorgulama
yapalım.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
423
SELECT no, ad, soyad, dept_no, yonno FROM
personel,dept
WHERE personel.dept_no = dept.dept_no
Join iĢleminin çeĢitleri vardır. Inner join, Left Outer Join, Right Outer Join. Günümüzde kısaca Left ve Right join
olarak bilinmektedirler.
INNER JOIN
Join iĢleminde her iki tarafında Ģarta uyması
zorunluluğunu arar. Aksi takdirde kayıtlar listeye alınmaz.
Örneğin MüĢteri tablosundan MüĢteri adını ve Telefonlar tablosundan da MüĢteri telefonunu seçtiğimizde Inner
join kullanarak Adını ve telefonu yan yana getirelim.
Select id,adi, telno
From Cari
Inner join TELNO on Cari.id=TELNO.mus_id
Yukarıdaki sorguda aslında her Ģey güllük gülistanlık görünüyor ama aslında önemli bir sorunu da içinde
barındırıyor.
ġimdi Ģu soruyu kendimize soralım. Ya müĢterinin kayıtlı
bir telefonu yoksa ?
Yukarıdaki sorgu bu durumda o müĢteriyi hiç göstermeyecektir. Peki Sorgumuzda alacaklarında
olduğunu ve müĢterileri arayarak para tahsilatı
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
424
yapılacağını düĢünün. Haberiniz olmayan bir alacağı
kimden tahsil edeceksiniz ?
ĠĢte bu yüzden Inner Join kullanımında son derece dikkatli olmak zorundasınız.
LEFT JOIN
Left Join iĢleminde soldaki tablodaki her kayıt detayda karĢılığı olsun olmasın listelenir.
Select id,adi, telno
From Cari
Left join TELNO on Cari.id=TELNO.mus_id
Mesela yukarıda örneği bu Ģekilde yazmıĢ olsaydık, telefonu olsun olmasın bütün cariler listelenecek, teleonu
kayıtlı müĢterilerin ise bu bilgileride görüntülenecekti.
RIGHT JOIN
Right Join iĢleminde detay tablosundaki her kayıt, ana tabloda karĢılığı olsun olmasın listelenir.
TABLOYU KENDĠSĠ ĠLE ĠLĠġKĠLENDĠRME (SELF JOIN)
SELECT A.no , A.ad , A.soyad,
B .ad , B.soyad , B.dog_tar
FROM personel A , personel B
WHERE A.yon_no =B .yonno2;
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
425
ĠÇĠÇE SELECT NESTED SELECTS
Bazı durumlarda iç içe select kullanmanız gerekir.
Örneği firmanızda ki tüm departmanların satıĢ toplamını listelemeniz istenmiĢ olsun. Burada yapılması gereken iĢ
önce depertmanları Select ile seçmek ve sonra bunların her birinin satıĢ toplamını buldurmaktır.
1. Adım
Select * from Dept_adi from Departman
2. Adım
Select sum(satis_tutari) from Satislar Where
Dept_adi=‘xx‘
3. Adım
ġimdi sorguları birleĢtirelim.
Select D.Dept_adi, (Select sum(satis_tutari) from Satislar S Where S.Dept_adi=D.Dept_adi)
from Departman D
UNION KULLANIMI
Ġki ayrı SELECT komutunun sonucunda elde edilen
tabloların birleĢimi iĢlemini gerçekleĢtirir.
Select * from a where adi=‘Ahmet‘
Union
Select * from a where adi=‘Mehmet‘
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
426
Tabiki yukarıdaki komutu görünce ―biz bunu where ilede
yapardık‖ diyebilirsiniz ama yukarıdaki amaç kullanım Ģeklini göstermektir.
EXISTS KULLANIMI
And, or veya not operatörleri ile kullanılabilir.
C. DCL (DATA CONTROL LANGUAGE) DEYĠMLERĠ
Veritabanındaki kullanıcı haklarını düzenlemek için kullanılan deyimlerdir. Örneğin GRANT, DENY, REVOKE
gibi.
Örnek:
USE DB
GRANT SELECT ON Stok TO PUBLIC
GRANT DEYİMİ
AĢağıdaki örnek AyĢe adlı kullanıcı veritabanı ve tablo oluĢturma izni verilir:
GRANT CREATE DATABASE, CREATE TABLE
TO ayĢe
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
427
SQL FONKSĠYONLARI
SQL dilini destekleyen programların daha iyi olma çabası
SQL diline birçok hazır fonksiyon eklenmesine sebep olmuĢtur. Sonuçta kazan kullanıcı olmuĢtur tabiî ki.
AĢağıda listelenen fonksiyonların bir çoğu sadece Mysql değil bir çok VTYS için geçerlidir. Ancak bazı sistemlerde
fonksiyon adı değiĢebilir, kullandığı parametre tipleri vs değiĢebilir.
Bu bakımdan eğer birden çok VTYS ile çalıĢacak bir kod düĢünüyorsanız ilk yöntem SQL92 standardına uygun
foksiyonları kullanp diğerlerinden kaçınmak olacaktır. Diğer yöntemler ise her VTYS için ayrı kod yazmak yada
bu iĢi otomatik hale getiren bir DAL kullanmak. DAL Database Absraction Layer kelimelerinden üretilmiĢtir.
Veritabanı soyutlama katmanı demektir.
Bundan sonraki SQL fonksiyonlarının bazıları her DBMS üzerinde çalışmayabilir, yada kullanımı
farklılıklar gösterebilir.
Metinlerle ĠĢlem Yapan SQL Fonksiyonları
ascii() fonksiyonu
Parametre olarak verilen değerin ASCII karĢılığını bulur.
char() fonksiyonu
ASCII olarak verilen değerleri birleĢtirip string bir değer
olarak sonuç dönderir.
CHAR ( N1, N2 .. )
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
428
concat() fonksiyonu
Birden çok değeri birleĢirip bir string olarak verir. Bu fonksiyonlar örneği ad veya soyad bilgisi sanal olarak tek
bir sütun haline getirilebilir.
CONCAT ( N1, N2 .. )
length() fonksiyonu
Kelime anlamından da tahmin edileceği üzere parametre
olarak verilen değerin kakater sayısını verir.
LENGTH (N1)
DönüĢtürme Fonksiyonları
conv() fonksiyonu
Veriyi bir tabandan baĢka bir tabana çevirir. CONV ( veri,
a1, a2 ) veri'yi a1 tabanlı olarak alıp a2 tabana
dönüĢtürür.
bin() fonksiyonu
Sayıyı onluk sayı sisteminden ikilik sayı sistemine çevirir. BIN (Sayi) Ģeklinde kullanılır.
oct() fonksiyonu
Sayıyı onluk sayı sisteminden sekizlik yani octal sayı
sistemine çevirir. OCT (N) Ģeklinde kullanılır.
hex() fonksiyonu
Sayıyı onluk sayı sisteminden onaltılık yani Hex sayı sistemine çevirir. HEX (N) ġeklinde kullanılır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
429
Tarihlerle ĠĢlem Yapan SQL Fonksiyonları
DAYOFWEEK(tarih) => YYYY - MM - DD formudaki
tarih'in, ODBC standardinda haftanın kaçıncı günü olduğunu bulur.
SELECT DAYOFWEEK('2001-12-26') =>4
DAYOFMONTH(tarih) => Ayın kaçıncı günü olduğunu
bulur.
DAYOFYEAR(tarih) => Yılın kaçıncı günü olduğunu bulur.
MONTH(tarih) => Kaçıncı gün olduğunu bulur.
DAYNAME(tarih) => Gün adını bulur.
MONTHNAME(tarih) => Ay adını bulur.
QUARTER(tarih) => Tarihin, yılın kaçıncı çeyreğinde
olduğunu bulur.
WEEK(tarih) => Yılın kaçıncı haftası olduğunu bulur.
YEAR(tarih) => Hangi yıl olduğunu bulur.
HOUR(zaman) => HH : MM : SS formatındaki zaman
verisinden saat bulunur.
MINUTE(zaman) => Dakikayi bulur.
SECOND(zaman) => Saniyeyi bulur.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
430
%M : Ay adı ( January, December ) %W : Gün adı ( Sunday, Saturay ) %D : Gün değeri ve eki ( 1st, 2nd ) %Y : Yıl değeri , 4 dijit ( 1993 ) %y : Yıl değeri , 2 dijit ( 93 ) %a : Kısa gün adı ( Sun, Sat) %d : Gün değeri , 2 dijit ( 00 , 31) %e : Gün değeri ( 0 , 31 ) %m : Ay değeri , 2 dijit ( 01 , 12 ) %c : Ay değeri ( 1 , 12 ) %b : Kısa ay adı ( Jan , Dec ) %j : Yılın gün sayısı ( 001 , 366 ) %H : Saat , 2 dijit ( 00 , 23 ) %k : Saat ( 0 , 23 ) %h : Saat , 2 dijit ( 01 , 12 ) %l : Saat ( 1 , 12 ) %i : Dakika ( 00 , 59 ) %r : Zaman , 12 saatlik ( hh : mm : ss [AP] M ) %T : Zaman , 24 saatlik ( hh : mm : ss ) %S : Saniye ( 00 , 59 ) %p : AM yada PM %w : Haftanı kaçıncı günü olduğu (0=Sunday , 6=Saturday ) %U : Yılın kaçıncı haftası olduğu ( Pazar ilk gün olmak üzere) %u : Yılın kaçıncı haftası olduğu ( Pazartesi ilk gün olmak üzere) %% : Sadece ' % ' karakteri
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
431
TABLOLARDA DEĞĠġĠKLĠK YAPMAK:
INSERT Komutu
Bir tabloya bilgi eklemeye yarar. Kullanım Ģekli:
Insert Into Tablo adı (alan1,alan2,..,alanN) values
(‗değer1‘, ‗değer2‘,.., ‗değerN‘);
Insert Into isim (ad,soyad) values
(‘ali’,’rizeli’);
Ġsim adlı tabloya sadece ad ve soyad alanlarına olmak üzere kayıt yapar.
Insert Into isim values
(„ali‟,null,‟[email protected]‟);
Bu kullanım Ģeklinde alanlar belirtilmediğinden tüm
alanların değeri belirtilmek zorundadır. Eğer girilecek alanlar belirtilmiĢ olsa idi boĢ kayıtlar belirtilmek zorunda
kalmazdı.
Örneği öğrenci tablosuna numarası 1 olan öğrenciyi ekleyelim.
INSERT INTO ogrenci (no, adi) VALUES(‘1’,’Ali’);
Insert komutunun değiĢik kullanım Ģekilleri de vardır ancak temel kullanımı budur. ÇalıĢmamızın ileri
sürümlerinde bu konu ile ilgili daha çok örnek
ekleyeceğim.
UPDATE Komutu:
Tablodaki verileri güncellemek için kullanılır. Tabloda
iĢlem yapmak üzere uygun bir alan üzerinden where ifadesi ile kullanılmalıdır. Kullanım Ģekli
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
432
Update [Tablo Adı] Set alan=yeni deger Where
aranan alan= alan değeri
Kullanılacak anahtar alanın iĢlem çoklu güncelleme değilse Unique (tekil index) olması tercih edilmelidir.
SET ile de kullanılabilir. SET değiĢtirilecek kolonları ve değerleri belirtir. WHERE sözcüğü ise değiĢtirilecek satırı
belirtir. UPDATE tablo SET sütun = ifade WHERE kosul Ģeklinde set halinde düzenleme yapar.
Örnek: AĢağıdaki örnekte fiyat değerini %10 artırır.
UPDATE taksitler SET tutar= tutar * 1.1
Örneğin bir kaydı düzeltmek istersek ;
UPDATE Musteri SET Ad = 'Ali‟ WHERE id='1';
Not: Yukardaki örnekte eğer id alanı bir olan birden fazla kayıt varsa onlarda etkilecektir. Eğer derdiğimiz cidden tek bir kaydı iĢlemekse o zaman tekil bir key alan
kullanmalıyız.
DELETE DEYĠMĠ
Bir tablodaki verileri silmek için DELETE komutu
kullanılır.
Kullanım biçimi:
DELETE FROM tablo
WHERE arama_koşulu
Örneğin musteri tablosundaki tüm verileri silmek için;
DELETE * from musteri;
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
433
Tabloda, bakiyesi 1000'den küçük olan
müĢterilerin satırlarını silmek için:
DELETE * FROM musteri WHERE bakiye <=1000
Bu komutu, kayıt yenileme tarihini yenilememiĢ kiĢilerin
tümünü silmek için de kullanabiliriz. Veritabanımızda yenileme tarihini gösteren bir alan bulunduğunu
farzedelim:
DELETE FROM musteri WHERE yenileme_tarih < 2007-
10-10;
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
434
PHPMYADMIN
Günümüzde kullanılan grafik ekranlarla iĢlem yapmak
oldukça kolaylaĢmıĢtır. Bir çok iĢlemi yaparken programlarda tanımlı sihirbazlar gerekli yönlendirmeleri
yaparak iĢlemi basitleĢtirmekte, iĢlem için gereken ek bilgiler dialog penceleri yardımıyla alınmaktadır. Oysa
eskiden bu iĢlemlerin hepsini yapmak için yüzlerce belki
binlerce komutu ve parametrelerini örenmek gerekirdi.
Günümüzde her nekadar grafik arayüzler Linux ve unix
türevlerinde de varsa bile komut gereksinimi devam etmektedir. SQL komutlarında gördüğümüz üzere
veritabanını yönemek için Mysql komutları vermek mümkündür. Ancak bir çok son kullanıcı için bu komutları
doğru ve hatasız yazmak deveye hendek atlamkatan zordur.
ĠĢte bu yüzden daha görsel ve güvenli bir arayüz tercih edilir. Hosting hizmeti verenler komut eriĢiminin
tehlikelerini bilirler. Web ortamında bunun çeĢitli sakıncaları vardır. Tabii birde hosting servislerini
kolaylaĢtırmak zorunluluğu vardır ki kullanıcılar iĢlemlerini daha rahat yapıp, teknik desteğe ihtiyaç
duymasın.
1. Web ortamında önüne gelene komut çalıĢtırma yetkisi vermek saflığında ötesinde aptallık
demektir. Çünkü saniyeler içinde sunucu hack edilebilir.
2. Kullanıcılar için grafik bir arayüz daha Ģirin ve basit gelecektir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
435
3. Kullanıcıyı doğrudan bir arayüzle karĢılamak aynı
zamana daha geliĢmiĢ güvenlik kontrolüne izin verir. ġöyle düĢünelim. Kullanıcı Ģehir adını
parametre vererek buna dair kayıtları listeleyecek olsun. Bunu iki Ģekilde yapabiliriz. Ya kullanıcı
istediği Ģehri yazar, yada programcı Ģehir adlarını bir liste kutusuna koyar ve kullanıcı buradan
sadece veriyi seçebilir. ġphesiz ikinci yöntem kullanıcıya daha kolay gelir. Ancak bu asıl güvenlik
açısından çok daha önemlidir. Çünkü kullanıcı yazma ekranı olsa araya bir takım kodlar gömerek
SQL Injection denilen saldırı tekniğini kullanabilir. Ancak liste kutusunda tek yapabileceği bir ögeyi
seçmek olacaktır.
Görüldüğü gibi ne kadar profesyonel olursanız olun, hazır
yazılımlar kullanarak yapılan MySQL yönetimi hem daha
hızlı hem de daha sıkıntısız olacaktır. Çünkü diğer türlü her türlü iĢlem için baĢtan aĢağı SQL komutları ile
uğraĢmak gerekir. PHP'yle geliĢtirilmiĢ olan PhpMyAdmin yazılımı kullanılarak tarayıcı penceresi içinden MySQL'le
ilgili birçok iĢlemi gerçekleĢtirebilmek mümkündür. Pma‘yi kullanabilmek için Apache ve Mysql çalıĢıyor
olmalıdır. Pma üstünde tanımlı formlardan iĢlemler seçilir ve yazılması gereken SQL kodlarını Pma, kendisi
oluĢturup, PHP bağlantısı üzerinden MySQL‘e gönderip çalıĢtırır.
PhpMyAdmin Kurulumu
Bu konuya burada yer veriliyor olması bunun sık sık
tekrarlanan bir görev olduğunu düĢündürmemelidir. Phpmyadmin kurulumu çok zor bir iĢlem değildir ancak
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
436
hosting Ģirketleri PHP desteği veren sunuculara nerdeyse
otomatik olarak bunuda kurdukları için zaten sıradan kullanıcılar zaten böyle bir sorunla karĢılaĢmazlar.
Peki ne zaman gerekir ?
1. Hosting iĢi yapıyorsanız ve bir sunucu kuracak
iseniz
2. Kendi sisteminizde lokal kullanım ve test ortamı
için
Bir çok durumda her iki iĢide hazır WAMP yada LAMP
paketleri ile yapmak mümkündür bu durumda gene Phpmyadmin hazır gelecektir.
Kurulum için kurum dosyası ilgili sitesinden indirilip web sunucunun ―webroot‖ klasörüne açıldıktan sonra
config.inc.php dosyasına Mysql eriĢimi için gereken Ģifre ve kullancı adı gibi ayarlar girilmelidir.
Not: PMA içine bu ayarlar girildikten sonra MySQL Ģifresi değiĢtirilecek olursa bu dosyada da gerekli değiĢiklikler
yapılmalıdır. Aksi takdirde PMA çalıĢmaz.
PhpMyAdmin'i ÇalıĢtırma ve Tanıma
PhpMyAdmin'i çalıĢtırmak için tek yapılması gereken, PhpMyAdmin‘in kurulu olduğu adresi taayıcıcnın adres
çubuğuna yazmaktır. Pma ile Mysql üzerindeki her türlü sorgulama iĢlemi yapılabildiği gibi veritabanı yönetimi ve
bakım iĢlerinde de kullanılabilir. Pma'nın ilk açılıĢ pencersinde, sol tarafta sistemde tanımlı olan
veritabanlarının listesi, ortada da MySQL'in hafızadaki aktif iĢlemleri ve o anda yerine getirilen görevler yer alır.
Sol tarafta yer alan menüde bulunan veritabanı isimleri,
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
437
yeni kurulan bir MySQL kurulumu için sadece test ve
mysql olarak görülecektir. Menüden bu veritabanı isimlerine tıklanarak, veritabanı içinde yer alan tablolar
ekranına ulaĢılır. Aynı zamanda, sol tarafta da veritabanının altındaki tabloların isimleri belirecektir. Sol
menüdeki tablo isimlerine tıklanarak, tabloların içinde yer alan alanlar hakkında ayrıntılı bilgiye eriĢilebilir. Bilinmesi
gereken Ģudur; Test veritabanı mysql içinde zaten tanımlı olan boĢ bir veritabanıdır. Test ve deneme
iĢlemleri için kullanılır. Mysql isimli veritabanı ie MySQL‘in master veritabanıdır. Kısaca kullanıcının oluĢturacağı
diğer veritabanları, ve bunların içindeki alanlarla ilgili bilgiler, indeks bilgileri, kullanıcı isim, parola ve yetkileri
gibi tüm bilgiler Mysql isimli veritabanında tutulur. Bu açıdan eğer deneme iĢlemler yapacaksanz Mysql adlı
veritabanından uzak durun.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
438
PhpMyAdmin ile Database OluĢturma
Pma calıĢtırıldığında gelecek olan sağ çerçevede yer alan
create new database bölümüne oluĢturulması istenilen veritabanı adı yazılarak create tuĢuna basılırsa database
oluĢturulacaktır.
PhpMyAdmin ile Tablo OluĢturma
Eğer veritabanı sorunsuz olarak oluĢturulursa sağ
çerçevede bir sql sorgu metin kutusu bir de manual olarak table oluĢturmamıza yarayacak olan ―Create new
table on database ...‖ bölümü yer alacaktır. Eğer doğrudan sql olarak tablo oluĢturulacak ise Create Table
ile Run sql query bölümünden tablo oluĢturmak mümkündür. Yada ―Create new table on database...‖
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
439
yazan bölüme tablo adı ve kaç alandan oluĢacağı
yazılarak kaç alandan oluĢacaksa belirtilerek sihirbaz mantığı ile oluĢturmak mümkündür.
Not: PHP ile yazılmıĢ open source yazılımlar genelde kullanıcının iĢini kolaylaĢtırmak için bir takım iĢlevler
içerirler. Mesela kimi yazılım sadece MySQL için kullanıcı adı ve Ģifre sorar, ondan sonra ise tüm veritabanı,
gerekli tablolarve kullanıcı bilgilerini kendisi oluĢturur. Kimi programda ise gerekli tablo yapıları SQL halinde
verilir. ĠĢte bu durumlarda bu sql komutlarını Pma içinden çalıĢtırıp kurulum iĢlemini tamamlamak
mümkündür.
Mesela run sql query bölümünde bir tablo oluĢturalım.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
440
CREATE TABLE ogrenci (
adi VARCHAR (20) not null ,
soyadi VARCHAR (20) not null ,
email VARCHAR (60) not null
)
“Your SQL-query has been executed successfully“
Ģeklinde bir yanıt alınırsa tablo sorunsuz olarak oluĢturulmuĢ demektir.
Eğer ―Create new table on database ― bölümünden yola devam edilirse, burada tablo adı ve tablonun alan sayısı
belirtilerek aynı tablo oluĢturulabilir. Fakat sql cümlecikleri nispeten iĢimizi kolaylaĢtırır. (elle
yazılmadığı durumlarda diye haırlatmaya gerek yok sanırım)
Sağ çerçevenin alt bölümünde yer alan ―drop database‖
linki database silmek için kullanılır.
Tablo oluĢturulurken kullanılan alan türleri Mysql konusu
içinde iken anlatılmıĢtı.
Bir Veritabanının Modelini Çıkarmak
Buradaki baĢlıkta kastedilen aslında yukarda bahsedien
veritabanı için gereken SQL kodlarının bir blok halinde elde edilmesidir. Ġki Ģekilde çıkarılabilir. Pma‘da herhangi
bir database‘i sol menüden seçip sağ tarafta ―View dump (schema) of database‖ bölümünü kullanabiliriz. Burada 3
seçenek vardır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
441
Burada ;
Structure only: Sadece alanları ve tabloları verir.
Structure and data: Hem alanları hemde alanlara kayıtlı verileri verir. Boyut olarak büyük olabilir.
Data only: Sadece tablolara kayıtlı alanları verir.
UPDATE [Tablo Adi] SET [Yeni Değer] WHERE [Seçilen
Kriter]
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
442
MySQL ve PHP
PHP ile MySQL çalıĢtırmak basit diğer fonksiyonları
kullanmak kadar kolay ve pratiktir. Kodlama yapısı diğer fonksiyon ve prosedürlerden farklı olmayan MySQL
fonksiyonları sorguları da SQL komutu ile gerçekleĢtirerek dönen değerleri While, For gibi
değerlerle alabilir. MySQL için kod yazarken önce
Veritabanı sunucusuna bağlanmamız gerekir. Bize verilen kullanıcı adı ve Ģifre ile sunucuya bağlandıktan sonra
yetkilerimiz bize hangi imkanları sunuyorsa buna uygun iĢlemlerimizi gerçekleĢtirebiliriz.
PHP dilinin son sürümleri Mysql ile farklı Ģekillerde bağlantı kurup iĢlem yapabilmektedir. PDO, Mysql
Improved ve klasik SQL cümleleri ile. Aslında Ģu an PHP ile yazılmıĢ hazır kodların bir çoğunda klasik yöntem
tercih edilmiĢtir. Ayrıca programcılık dünyasında SQL dilini yani bir veritabanını nasıl sorgulayacağını bilmek
önemli bir olaydır. Kullanıcı hangi programlama dilinde ve hangi Veritabanı için kod yazarsa yazsın olu mutlaka
SQL dili ile kesiĢir. Dolayısıyla programcı kiĢi veritabanı ile uğraĢıyorsa SQL bilmek zorundadır. PHP ile klasik
yöntemi kullanarak MySQL ve diğer veritabanı tablolarına
bağlanmak ve onlarla iĢlem yapmak oldukça kolaydır. Bu konuda izlenmesi gereken sıra Ģudur:
1. Veritabanı sunucusuna bağlanma (mysql_connect, vs... gibi fonksiyonlar ile) ve bir bağlantı numarası
(link identifier) alma,
2. Bu bağlantıyı kullanarak bir veritabanı seçme
(my_sql_select_db, vs...),
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
443
3. Bu bağlantı üzerinde sunucuya sorgu gönderme
(mysql_db_query, vs...) ve ve sorgu sonuncu bir dizi değiĢken (result identifier) olarak alma
4. Bu diziyi PHP değiĢkenlerine aktararak kullanma (mysql_fetch_row, mysql_fetch_assoc vs...),
5. Sunucu ile bağlantıyı kesme (mysql_close() fonksiyonu)
Daha önce Msql‘i komut satırından yada sql ile nasıl kullanacağımızı iĢlemiĢtik. ġimdi mysql ile php arasındaki
bağlantılar ve komutları görelim:
PHP Dili Mysql Fonksiyonları Tablosu
AĢağıdaki fonksiyonlar basitçe ve topluca verilmiĢtir. En
yukarda tanımlı olanlar daha sık kullanılan fonksiyonlardır. Aslında bu tablo çok daha uzundur ancak
diğerleri dahada ender kullanılan fonksiyonlardır. Bu tablonun ardından önemli fonksiyonlar detaylıca açıklanıp
örneklerle incelenecektir.
mysql_connect : Sunucuya veritabanı
bağlantısı açar
mysql_close : Belirtilen MySQL bağlantısını kapatır
mysql_fetch_row: Sonuç tablosundan dizi
değiĢkeni olur
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
444
mysql_fetch_array : Sonuçları dizi değiĢkeni olarak alır
mysql_num_rows : Sonuçtaki satır sayısını verir
mysql_query : Veritabanına sorgu gönderir
mysql_result : Sorgudan dönen sonuçları alır
mysql_select_db : Sunucudan veritabanı seçer
mysql_affected_rows: Bir önceki iĢlemde etkilenen satır sayısı
mysql_create_db : MySQL'de veritabanı açar
mysql_data_seek : Sonuç satırında belirtilen sıraya geçer
mysql_db_query : MySQL'e sorgu gönderir
mysql_drop_db : Sunucudan veritabanı siler
mysql_errno : Bir önceki iĢlemdeki MySQL hata
numarasını verir
mysql_error : Bir önceki iĢlemdeki MySQL hata
mesajını verir
mysql_fetch_field : Sonuç tablosundaki alan adını obje olarak alır
mysql_fetch_lengths : Sonuç tablosundaki dizi değiĢkenin uzunluğunu alır
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
445
mysql_fetch_object : Sonuç satırını obje olarak alır
mysql_field_name : Sonuç tablsundaki sonucun tablodaki alan adını verir
mysql_field_seek : Sonuç tablosunda sıra indisini
belirtilen yere götürür
mysql_field_table : Alan adı verilen sonucun tablo
adını verir
mysql_field_type : Sonuçtaki alanın hangi tip olduğunu belirtir
mysql_field_flags : Sonuçtaki alanın hangi tür ekstra parametrelerle tanımlandığını
belirtir
mysql_field_len : Sonuçtaki alanın veritabanındaki uzunluğunu verir
mysql_free_result : Sonuçlar için atanan hafızayı boĢaltır
mysql_insert_id : Bir önceki veri yerleĢtirmede
oluĢan otomatik veri değerini verir
mysql_list_fields : Sonuçtaki tüm tablo alanlarını
listeler
mysql_list_dbs : Sunucudaki tüm veritabanlarını
listeler
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
446
mysql_list_tables : Veritabanındaki tüm tabloları
listeler
mysql_num_fields : Sonuçtaki alan sayısını verir
mysql_pconnect : Sunucuya kalıcı bir bağlantı
tanımlar
mysql_tablename : Verilen alanın ait olduğu tablo
adını verir
mysql_connect() deyimi(Database bağlantısı)
Php ile mysql ile bağlantıyı sağlayan komuttur. Kullanım Ģekli ise
mysql_connect(“adres”,“kullanici”,”Ģifre”);
genel olarak mysql kurulduğunda kullanıcı
tanımlanmamıĢ ise tek kullanıcı vardır. Bu kullanıcı ―root‖dur. Ve Ģifresi boĢ geçilecektir. Adres bölümüne ise
eğer kendi makinemizde kullanıyorsak localhost yazarız. Buna göre bağlantı için:
mysql_connect(“localhost”,”root”,””);
Ģeklinde bir cümlecik eğer mysql çalıĢıyor ise bağlantı için yeterlidir. Peki ya çalıĢmıyor ise ne olacak;
mysql_connect() fonksiyonunun baĢarılı olup olmadığını
bu değiĢkenin durumunu test ederek anlayabiliriz. Örneğin:
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
447
$baglan =mysql_connect("localhost", "root",‖‖);
if ( ! $baglan) die ("MySQL ile veri bağlantısı
kurulamıyor!);
Ġkinci satırdaki if ile baĢlayan satır, $baglan değiĢkeninin değer içerip içermediğine bakmaktadır. Çünkü eğer
bağlantı baĢarılı ise bu değiĢken bir değer içerecek aksi taktirde içermeyecektir. Haliyle kodumuz değiĢkende bir
değer yoksa, bağlantı kurma giriĢini durdurarak, ziyaretçiye hata mesajı dönderecektir.
mysql_select_db() deyimi
Bağlantı baĢarıyla kurulduktan sonra PHP programı,
veritabanı sunucusuna, hangi veritabanı dosyasını
kullanmak istediğini belirtmelidir. Buna veritabanı dosyası seçme iĢlemi denir. Bu iĢ için
mysql_select_db() komutu kullanılır. Kullanım Ģekli:
mysql_select_db(“veritabanı adı”,”baglantı
adı”);
Ģeklindedir.
PHP'nin MySQL veritabanını seçememesi çoğu zaman
kullanıcı yetkilerinin Internet ziyaretçilerini kapsayacak Ģekimde düzenlenmemiĢ olmasından kaynaklanır. Bu
durum gerçek Web sunucusunda ortaya çıkarsa, Web sunucusu yönetimine baĢvurmak gerekir. Ancak en
basitinden bağlanılacak veritabanının adını yanlıĢta yazmıĢ olabiliriz. Bu ve diğer öngörülemeyen hatalar için
burada da daha konrollü bir kod yazmak elimizdedir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
448
mysql_select_db( "veritabanının_adı" , $baglan) or die
("Veritabanı açılamıyor!");
Bu kod bize bağlantı kurulamadığı durumlarda ilgili mesajı
gösterecektir. Daha detaylı bir kontrol kodunu ile ―hata kontrolü‖ kısmında tekrar iĢleyeceğiz.
mysql_query() fonksiyonu- Mysql’e sorgu göndermek
PHP dilinde MySQL'e sorgu göndermek için
mysql_query() komutu kullanılır. Parantez içinde tırnak arasında sql sorgusu veya daha önce sql olarak
hazırlanmıĢ değiĢken yazılabilir. Örneğin:
$sorgu=”select * from deneme”;
$islem=mysql_query($sorgu);
veya
$islem=mysql_query(“select * from deneme”);
aynı iĢlemi yapar.
mysql_numrows() fonksiyonu-Sorgudan Dönen Kayıt Sayısını Bulmak
Sorgu sonucu kaç tane kayıt döndürüldüğünü öğrenmek
için mysql_numrows() komutu kullanılır. Bu sayı daha sonra sorgudan gelen kayıtları değiĢkenlere almak yada
sıra ile iĢlemek üzere iĢimize yarayacaktır.
$kac_tane=mysql_numrows($islem);
yukarıdaki sorgudan kaç tane kayıt geldiğini bize verecektir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
449
mysql_result()-Sorgudan Dönen Kayıtları ĠĢlemek
Eğer sorgudan gelen kayıtları değiĢkenlere almak
istiyorsak bunun icinde mysql_result() komutu kullanılır. Mesela yukarıdaki sorgudan ad ve soyad diye iki alan
geldiğini düĢünelim burdan gelen tüm kayıtları ayrı ayrı iki değiĢkene aktaralım.
$i=0;
while($i<$kac_tane):
$ad[]=mysql_result($islem,$i,”ad”);
$soyad[]=mysql_result($islem,$i,”soyad”);
$i++;
endwhile;
Yukarıda $i değiĢkeni sorgudan gelen sonuçları alırken
kullanılan geçici bir değiĢkendir. Sırası ile her satırdaki ad ve soyad alanlarındaki kayıtlar $ad ve $soyad isimli
iki dizi değiĢkene aktarılmıĢtır. Böylece mysql‘de yer alan
yaptığımız sorgu ile alakalı tüm kayıtlar artık php‘nin içine aktarılmıĢtır.
Kayıtları Ekrana Listelemek
Yukardaki sorguda dönen kayıtları ekrana listelemek için kuĢkusuz PHP dili bizlere birden çok imkan sunmaktadır.
Ancak Ģimdilik basit bir FOR döngüsü ile yetinelim.
for($j=0;$j<$kac_tane;$j++):
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
450
echo $ad[j].” “.$soyad[j].”<br>”;
endfor;
Ģeklinde kısa bir döngü kullanılabilir. Tabii ki bunu html kullanarak daha görsel hale getirmek mümkündür.
DeğiĢkenleri Sorguların Ġçinde Kullanmak
Php‘den gelen değiĢkenleri de sorgularda kullanmamız
mümkündür. Mesela $isim diye bir değiĢken değeri alınıp ve bu değiĢkenin ad, soyad ,maas ve eposta bilgileri
ekrana yazılacak olsun. Burada değiĢkenin değerini ekrandan akmak için gerekli formla uğraĢmadan sorgu
ile ilgileneceğiz. Çünkü birincil amaç sorguyu değiĢken ile yapmak.
Kullanılan database personel olsun eleman adlı bir tablo kullanalım:
<?
$host =“localhost”;
$user =“root”;
$password =“”;
$db =“personel”;
mysql_connect($host,$user,$password)
mysql_select_db($db);
$sorgum = “select isim,soyad,maas,email from
eleman where isim=‟$isim‟”;
$sonuc =mysql_query($sorgu);
$kactane =mysql_numrows($islem);
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
451
$i=0;
while($i<$kactane):
$isim
=mysql_result($sonuc,$i,”isim”);
$soyad
=mysql_result($sonuc,$i,”soyad”);
$maas
=mysql_result($sonuc,$i,”maas”);
=mysql_result($sonuc,$i,”email”);
echo”adı: $isim <br> soyadı:
$soyad<br> email: $email<br>”;
$i++;
endwhile;
?>
Daha dinamik bir program yapısı kullanmak ve ileride kodlarınızı sürekli yeniden kullanmak için bu tip yapıları
alıĢanlık edinmelisiniz.
Benim kendi kullandığım genel yapıda buna benzerdir.
Ancak ben buradan bir adım sonrası olarak veritabanı bilgilerini, mysql_connect ve mysql_select_db
komutlarını harici bir dosyaya koyar oradan include komutu ile çağırırım. Dosyada ayrıca hata kontrol koduda
yer aldığından Mysql bağlantısı kurulamaması durumundandan kullanıcı haberdar edilir. Böylece
veritabanı adı, kullanıcı adı yada Ģifre vs değiĢecek olursa tek bir yeri değiĢtirmem yeterli olur aksi durumda
tüm kodları gözden geçirip bağlantı bilgilerini yeniden düzenlemek durumunda kalırım.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
452
mysql_fetch_assoc() fonksiyonu- sorgu sonucundan bir satır almak
Bu fonksiyonlar bir sorgu sonucunda dönet kayıtlar satır
bazlı olarak değiĢkene aktarılabilir.
<?
while ($listele=mysql_fetch_assoc($sorgu)): // kayıtlar döngü içinde iĢleniyor
echo "$listele[Database]";
endWhile;
?>
Yukardaki örnek kod yarım bir koddur. Sadece kullanım amacıyla burada verilmiĢtir. ÇalıĢan bir kod daha sonra
görülecektir.
mysql_error() fonksiyonu- MySQL hatalarını konrol etmek
Kullanıcının MySQL'de oluĢabilecek hataları PHP içinden
fark edebilmesi için, PHP'de özel komutlar vardır. Bu komutlar sayesinde veritabanı sorgulamasında oluĢan
sonuçlar hata numarasıyla birlikte yakalanabilir. Hata gösterge komutları kullanılmadan PHP, MySQL'e dair
hiçbir hata mesajı vermeden iĢleme devam eder.
if (mysql_error())
{
echo ("MySQL hatası oluĢtu. Hata: ");
echo mysql_error() ;
}
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
453
Yukarıdaki PHP satırları mysql_error() komutunu
kullanarak herhangi bir MySQL hatası oluĢtuğunda ekrana MySQL hatasının yazılmasını ve PHP yazılımcısının
uyarılmasını sağlar.
mysql_select_db( "veritabanının_adı" , $baglan)
or die ("Veritabanı açılamıyor!".mysql_error());
Yukardaki kod veritabanı seçme kısmındada gördüğümüz kodun deha detaylı ve geliĢmiĢ bir sürümüdür. Bu
fonksiyonun sonucunun true yada false olması bize bağlanı kurulup kurulmadığını vermektedir. Bu değer
false ise doğrudan die() bölümü iĢlenerek kullanıcının tarayıcısına veritabanının açılamadığı mesajıyla birlikte
MySQL'in hata mesajı da gönderilecektir.
$kayitlar = mysql_query(select * from eleman");
if (mysql_error()) {echo ("MySQL hatası oluĢtu.
Hata no :"); echo mysql_error();}
$isim = mysql_result($kayitlar,$i,"isim");
$soyad = mysql_result($kayitlar,$i,"soyad");
PHP ile Veritabanı OluĢturma Listeleme ve Silme
Aslında bu komutlar çok sık kullanılan komutlar değildir.
Çünkü elimizin alında bulunan Phpmyadmin bir çok konuda eksikliği kapatan bir yardımcıdır. Bu iĢlemler için
bildiğimiz Mysql komutlari SQL sorguları halinde
mysql_query() fonksiyonu ile çalıĢtırılır. Ancak bu iĢlem için yetki verilmiĢ olması gereklidir. Özellikle gerçek web
sunucularında bu yetkilerin sağlanmĢ olduğundan emin olmak gereklidir. Sunucu üzerinde genellikle veritabanı
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
454
oluĢturma yetkisi verilmemiĢtir. Yada bu iĢlem bir panel
yada sihirbaz yardımıyla gerçekleĢtirilir.
<?
@mysql_connect("localhost","root","");
// Mysqle bağlanılıyor
$sorgu=mysql_query("CREATE DATABASE Deneme");
// Deneme adlı database oluĢturuluyor
echo $sorgu; // Sonuç ekrana yazdırılıyor
$sorgu=mysql_query("SHOW DATABASES"); //
Mevcut databaseler alınıyor
while ($listele=mysql_fetch_assoc($sorgu)): // kayıtlar döngü içinde iĢleniyor
echo "$listele[Database]";
endWhile;
$sorgu=mysql_query("DROP DATABASE Deneme");
//Deneme database kaldırılıyor
echo $sorgu;
?>
Yukarıdaki örnek kodlar önce "Deneme" adlı bir veritabanı oluĢturacaktır. $sorgu değiĢkenine atanan
mysql sorgusundan dönen değer eğeriĢlemde bir hata yoksa 1 olmalıdır. Sorgu ile ilgili bir hata olursa bu değer
"0" olarak dönecektir.
Daha sonra ―Show databases‖ ile mevcut veritabanları listelenmektedir. Bunun ardından bir döngü ile sorgu
sonucu dönen veritabanı listesini döngü içinde listelemek için gerekli kodu en basit haliyle görmekteyiz. Döngü
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
455
içerisinde "echo $listele[Database] diyerek tampon
değiĢkeninden dönen değerin ekrana yazılması istenmeĢir. Bu yöntem PHP ile sorgu alıĢveriĢlerinde en
sık kullanılan yöntemlerden birisidir. En son olarak ise DROP yardımı ile Deneme veritabanı silinmektedir.
Görüldüğü gibi MySQL'de PHP ile veritabanı oluĢturmak,
silmek ve listelemek standart'da aynı fonkisyonları kullanarak basit SQL kodlarıyla mümkün. Burdan sonraki
konulardada aynı mantık ve pratik çalıĢma ile diğer iĢlemlerimizi gerçekleĢtirebiliyoruz.
PHP ile Tablo OluĢturma, Listeleme, Güncelleme ve Silme
Bu iĢlemleri yaparkende yukarda görüldüğü gibi aslında
gerekli SQL komutları PHP kodları içinde Mysql‘e yollanıp gerekli iĢlemler yapılacaktır.
<?
@mysql_connect("localhost","root","");
// Mysql e bağlanıldı
@mysql_select_db("Deneme"); // veritabanı seçildi
$sorgu=mysql_query(" // tablo oluĢturan kod gönderiliyor
CREATE TABLE `Tablo` (
`id` INT NOT NULL,
`adisoyadi` TEXT NOT NULL,
`user` TEXT NOT NULL,
`pass` TEXT NOT NULL)"
);
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
456
echo $sorgu;
$sorgu=mysql_query("SHOW TABLES"); // tablo listesi alınıyor
while($listele=mysql_fetch_assoc($sorgu)): // liste ekrana yazılıyor
echo "$listele[Tables_in_Deneme]";
endWhile;
echo $sorgu;
$sorgu=mysql_query("DROP TABLE Tablo"); // oluĢturulan tablo database den kaldırılıyor
echo $sorgu;
?>
ġimdi yukardaki örmek kodları detaylıca inceleyim; önce
veritabanına bağlanıp, iĢlem yapılacak veritabanı seçimli
ve daha sonra ―create table‖ komutu ile istenen yapı verilerek bir tablo oluĢturulmuĢtur. Daha sonra mevcut
veritabanı içindeki tablolar bir sorgu ile alınmıĢ ve dönen kayıtlar ekrana yazılmıĢtır. En son olarak ise ―Drop
Table‖ ile oluĢturulan örnek tablo yok edilmektedir.
Kimi durumlarda bütün tabloyu değilde tablonun
içerisindeki bir sütunu silmemiz gerekebilir. Böyle durumlarda da aĢağıdaki gibi bir kod kullanılır.
<?
@mysql_connect("localhost","root","");
@mysql_select_db("Deneme");
$sorgu=mysql_query("ALTER TABLE Tablo
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
457
DROP `user`,
DROP `pass`");
echo $sorgu;
?>
Sorgudaki farka dikkat ettiyseniz Alter komutu ile iĢlem yapılmakta ve kaldırılacak sütunlar DROP ile birlikte
verilmektedir. Bu komutlarla tablodan user ve pass
alanları kaldırılacaktır.
PHP ile Tablolara Veri GiriĢi, Listeleme, Güncelleme ve Silme
PHP ile veritabanı yada tablo oluĢturma iĢlemi normal
Ģartlarda sık sık kullanacağınız komutlar değildir. normalde bu iĢlemler hosting Ģirketine ait bir panelden
yapılır ve daha sonra bu hazır tabloları iĢleyecek kodlar yazılır. PHP ile ilgili yazılan bu kitapta en çok önem
verilmesi gereken kısım burasıdır. Çünkü veri iĢleme
gereksinimi olmasaydı programlama dillerinede gerek olmazdı. Ancak Mysql in komut satırı kısmında da SQL
kısmındada gerekli komutlar görülmĢtür. Aslında burada da veritabanı oluĢturmak tablo listelemek iĢlemlerindeki
mantık kullanılacaktır. PHP ile gerekli veriler iĢlenecek ve bu verilere uygun SQL ifadeleri hazırlanıp Mysql
komutları halinde veritabanına gönderilecek ve iĢlem yapılmıĢ olacaktır. ġimdi basit bir örnekle baĢlayalım.
Burada bilgi giriĢleri kullanıcıdan istenmeyecek ve bir kaydı kod içinden kaydetmek, değiĢtirmek, silmek,
listelemek gibi iĢlemlerin hangi fonksiyonlar ile yapıldığı görülmüĢ olacaktır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
458
<?
@mysql_connect("localhost","root","");
// Bağlantı kuruluyor
@mysql_select_db("Deneme"); // Veritabanı seçiliyor
$sorgu=mysql_query("INSERT INTO `Tablo` (
// bir kayıt giriĢi yapılıyor
`id`,
`name`,
`code`,
`pass`)
VALUES (
'1',
'Ġbrahim Kutluay,
'BarıĢManço,
'1234')
");
echo $sorgu;
$sorgu=mysql_query("SELECT * FROM Tablo");
// tablodaki tüm kayıtlar alınıyor
while($liste=mysql_fetch_assoc($sorgu)):
// kayıtlar sıra ile değiĢkene alınıyor
echo "$liste[id]-$liste[name]-$liste[code]-$liste[pass]";
// alınan satır ekrana yazılıyor
endWhile;
$sorgu=mysql_query("UPDATE Tablo SET pass=123 WHERE
id=1"); // 1 nolu kayıt güncelleniyor
echo $sorgu;
$sorgu=mysql_query("DELETE FROM Tablo WHERE id=1");
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
459
// 1 nolu kayıt siliniyor
echo $sorgu;
?>
ġimdi örneği detaylıca inceleyelim. Deneme adlı veritabanındaki "Tablo" adlı tabloya bir kayıt giriĢi
yapılmaktadır. "INSERT INTO" ile veritabanına kayıt eklenmiĢtir. Bu iĢlem için kaydın hangi tabloya
yapılacağı, tabloya hangi bilgilerin ekleneceği ve eklenen bilgilerin hangi sütunlar için verildiğini vermekteyiz.
Sonraki aĢama da listeleme olayına geçilmiĢtir. Görüldüğü gibi buradada daha önceki ibi önce ilgili
kayıtlar sorgu ile çekilmiĢ daha sonra döngü halinde iĢlenmiĢtir. SQL kısmında da görüldüğü gibi "SELECT *
FROM" kayıtların seçileceği tablo belirtilmiĢtir. Ayrıca bu hali ile yapılan listelemede, dönen değerler verilerin son
güncelleme tarihine göre listelenir. Yani sıralı olarak
listelenmez. Bu iĢlem için sorguya bu seçeneğin eklenmesi gerekir. Bunu yapmak içinde yine QL
kısmından hatırlayacağınız ORDER by deyimi gereklidir
"SELECT * FROM Tablo" sorgusunu, "SELECT * FROM
Tablo ORDER by id" olarak değiĢtirirsek kayıtlar bu sefer ―id‖ alanına göre sıralı olarak listelenecektir. Sıralamanın
tersten yapılması istenirse ―order by id― yerine ―order by id DESC‖ yazılması gereklidir. Yine SELECT Sql komutunu
hatırlarsanız burada belirli koĢullara uygun kayıtlarında seçilebileceğini görürsünüz. Çünkü her zaman bütün
tablodaki verilerin listelenmesi gerekmeyebilir. Kimi zaman tablo içerisindeki tek bir bilginin alınması bile
yeterli olabilir;
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
460
"SELECT * FROM Tablo WHERE id=1" yapılırsa sadece 1
nolu kayıt sorgu sonucu olarak dönecektir. Bu size ilk etapta pratik gelmeyebilir ancak düĢünelim ki bir sınıf
kayıt var ve öğretmen geçer not alanları görmek istiyor. Tüm sınıfı listeleyip ―geçenleri sen say ve notlarının
ortalamasınıda sen elle hesapla mı‖ diyeceğiz.
"SELECT * FROM Tablo WHERE ort>49" gib bir sorgu ile
ortalaması geçer olan kayıtlar sorgulanıp döngü ile yazdırılabilir.
Varolan bir kaydı güncellemek içinse görüldüğü gibi tabloya UPDATE komutu gönderilmiĢtir. DeğiĢikliğin
yapılacağı verinin bulunduğu tabloyu belirtilir ve "SET pass=123" komutu ile değiĢtirilecek alan verilerek bunun
yeni değeride girilmiĢ olur. En son aĢama ise varolan bir kaydın silinmesidir. Delete SQL komutuna istenilen
duruma uygun bir koĢul eklenerek iĢlem yapılmıĢ olur.
Örnek Uygulama: PHP ile ġifreli GiriĢ Sayfası Yapılması
Web sitelerinde sık sık gördüğünüz Ģifreli giriĢ
sayfalarından bir tanede yapmak istenirse aĢağıdaki kodlar iĢe yarayabilir. Kodlar geliĢirmeye müsaittir.
Ayrıca içinde iĢe yarayacak bir Javascript koduda mevcuttur. Önce bu iĢlem için kullanmak üzere bir tablo
oluĢurmak gereklidir. Bunu ister PMA ile ister PHP kodu yazarak oluĢturmak mümkündür.
CREATE TABLE `kisi` (
`kullanici` varchar(8) NOT NULL default '',
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
461
`sifre` varchar(8) NOT NULL default '',
`adi` varchar(20) NOT NULL default '',
`soyadi` varchar(15) NOT NULL default '',
`email` varchar(40) NOT NULL default '',
`cinsiyet` enum('e','k') NOT NULL default 'e',
`songiris` timestamp(14) NOT NULL,
`suan` enum('0','1') NOT NULL default '0'
) TYPE=MyISAM;
daha sonra dosyalarımızı sırasıyla dosyalarımız oluĢturalım. Ġlk önce sabitlerin saklandığı sabit sayfası:
sabit.php
<? $server ="localhost"; $user ="root"; $pass =""; $database ="giris"; ?>
/********************************************
*************************/
index.php
<? include "kontrol.php"; if($kontrol==1): header("Location: sayfa.php"); else: ?> <html>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
462
<head> <title>PHP&MySQL GiriĢ Sayfası</title> <meta http-equiv="Content-Type" content="text/html; charset="> </head> <body bgcolor="#FFFFFF" text="#000000"> <SCRIPT> function submitChange() { var theForm = document.giris; if ( theForm.kullanici.value.length == 0 ) { alert( 'Lütfen bir kullanıcı ismi giriniz!' ); theForm.kullanici.focus(); return; } if ( theForm.sifre.value.length == 0 ) { alert( 'Lütfen Ģifre giriniz!' ); theForm.sifre.focus(); return; } theForm.submit(); } </SCRIPT> <center> <b><font face="Verdana, Arial, Helvetica, sans-
serif" size="2">Kullanıcı GiriĢi </font></b> <form name="giris" method="post" action="gir.php"> <table width="223" border="0" cellspacing="1" cellpadding="1"
> <tr> <td width="115"><font face="Verdana, Arial, Helvetica, sans-
serif" size="2">Kullanıcı Adı</font></td> <td width="101"> <font face="Verdana, Arial, Helvetica, sans
-serif" size="2">
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
463
<input type="text" name="kullanici" size="10" maxlength="
8" value="<? echo $kullanici?>"> </font></td> </tr> <tr> <td width="115"><font face="Verdana, Arial, Helvetica, sans-
serif" size="2">ġifre</font></td> <td width="101"> <font face="Verdana, Arial, Helvetica, sans
-serif" size="2"> <input type="password" name="sifre" size="10" maxlength=
"8"> </font></td> </tr> </table> <p> <input type="button" onClick="submitChange()" value="GiriĢ"
> </p> </form> </center> <br> <br> <br> <center><a href=kaydet.php>Kullanıcı Kayıt</a></center> </body> </html> <? endif; mysql_close() ?>
/********************************************
*************************/
kaydet.php
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
464
<html> <head> <title>Kullanıcı Kayıt Sayfası</title> <meta http-equiv="Content-Type" content="text/html; charset="> </head> <body bgcolor="#FFFFFF" text="#000000"> <center> <p><font face="Verdana, Arial, Helvetica, sans-
serif" size="2"><b>Kullanıcı Kayıt Sayfası</b></font></p> <form name="form1" method="post" action="kayit.php"> <table width="337" border="0" cellspacing="1" cellpadding="1"
> <tr valign="middle"> <td width="93"> <div align="right"><b><font face="Verdana, Arial, Helvetica
, sans-serif" size="2">Lakap</font></b></div> </td> <td width="25"> </td> <td width="209"><font size="2"> <input type="text" name="kullanici" size="10" maxlength="
8" value="<?echo $kullanici?>"> </font></td> </tr> <tr valign="middle"> <td width="93" height="2"> <div align="right"><b><font size="2" face="Verdana, Arial,
Helvetica, sans-serif">Sifre</font></b></div> </td> <td width="25" height="2"> </td> <td width="209" height="2"><font size="2"> <input type="password" name="sifre1" size="10" maxlength
="8"> </font></td> </tr> <tr valign="middle"> <td width="93" height="17">
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
465
<div align="right"><b><font size="2" face="Verdana, Arial,
Helvetica, sans-serif">Tekrar</font></b></div> </td> <td width="25" height="17"> </td> <td width="209" height="17"><font size="2"> <input type="password" name="sifre2" size="10" maxlength
="8"> </font></td> </tr> <tr valign="middle"> <td width="93"> <div align="right"><b><font size="2" face="Verdana, Arial,
Helvetica, sans-serif">Ġsim</font></b></div> </td> <td width="25"> </td> <td width="209"><font size="2"> <input type="text" name="adi" size="25" maxlength="20" v
alue="<?echo $adi?>"> </font></td> </tr> <tr valign="middle"> <td width="93"> <div align="right"><b><font size="2" face="Verdana, Arial,
Helvetica, sans-serif">Soyisim</font></b></div> </td> <td width="25"> </td> <td width="209"><font size="2"> <input type="text" name="soyadi" size="25" maxlength="2
5" value="<?echo $soyadi?>"> </font></td> </tr> <tr valign="middle"> <td width="93"> <div align="right"><b><font size="2" face="Verdana, Arial,
Helvetica, sans-serif">E-mail</font></b></div> </td> <td width="25"> </td> <td width="209"><font size="2">
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
466
<input type="text" name="email" size="30" maxlength="40"
value="<?echo $email?>"> </font></td> </tr> <tr valign="middle"> <td width="93"> <div align="right"><b><font size="2" face="Verdana, Arial,
Helvetica, sans-serif">Cinsiyet</font></b></div> </td> <td width="25"> </td> <td width="209"><font size="2"> <font face="Verdana, Arial
, Helvetica, sans-serif"> <input type="radio" name="cinsiyet" value="e" <? if($cinsiy
et=="e") echo checked?>> Erkek<br> <input type="radio" name="cinsiyet" value="k" <? if($cinsiy
et=="k") echo checked?>> Kız </font></font></td> </tr> </table> <br> <input type="submit" name="Submit" value="Submit"> <input type="reset" name="Submit2" value="Reset"> </form> <p> </p> </center> </body> </html>
/********************************************
*************************/
kayit.php
<? include"sabit.php";
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
467
if (($sifre1==$sifre2) && ($kullanici) && ($adi) && ($soyadi) && ($e
mail) && ($cinsiyet)): mysql_connect($server,$user,$pass); mysql_select_db($database); $sorgu="SELECT kullanici from kisi"; $ids=mysql_query($sorgu); $i=0; while($i<mysql_numrows($ids)): $id = mysql_result($ids,$i,"kullanici"); $i++; if($kullanici==$id): echo"<center>Kullanici adı mevcut</center>"; include "kaydet.php"; die(); endif; endwhile; $sorgu = "INSERT INTO kisi values ('$kullanici','$sifre1','$adi','$so
yadi','$email','$cinsiyet','','0')"; mysql_query($sorgu); mysql_close(); echo "<center>Kullanıcı Kaydı Tamamlandı</center><br>"; include "index.php"; else: echo"<center>Lütfen tüm alanları doldurunuz!</center><br>"; include "kaydet.php"; endif; ?>
/********************************************
*************************/
gir.php
<? if( $kullanici && $sifre ): include "sabit.php";
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
468
mysql_connect($server,$user,$pass); mysql_select_db($database); $sorgu="select * from kisi where kullanici='$kullanici'"; $bul=mysql_query($sorgu); $sayi=mysql_numrows($bul); if ( $sayi == 0 ): $hata=2; mysql_close(); include "hata.php"; die(); endif; if ($sayi == 1 ): $el=mysql_result($bul,0,sifre); if ( $el != $sifre ): $hata=1; mysql_close(); include "hata.php"; die(); endif; if ( $el == $sifre ): setcookie("kim","$kullanici"); $sorgu1="update kisi set suan='1' where kullanici='$kullanici
'"; mysql_query($sorgu1); mysql_close(); @header ("Location: sayfa.php"); endif; endif; else: @header("Location: sayfa.php"); endif; ?>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
469
/********************************************
*************************/
logout.php
<? if( $kullanici && $sifre ): include "sabit.php"; mysql_connect($server,$user,$pass); mysql_select_db($database); $sorgu="select * from kisi where kullanici='$kullanici'"; $bul=mysql_query($sorgu); $sayi=mysql_numrows($bul); if ( $sayi == 0 ): $hata=2; mysql_close(); include "hata.php"; die(); endif; if ($sayi == 1 ): $el=mysql_result($bul,0,sifre); if ( $el != $sifre ): $hata=1; mysql_close(); include "hata.php"; die(); endif; if ( $el == $sifre ): setcookie("kim","$kullanici"); $sorgu1="update kisi set suan='1' where kullanici='$kullanici
'"; mysql_query($sorgu1); mysql_close(); @header ("Location: sayfa.php"); endif; endif;
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
470
else: @header("Location: sayfa.php"); endif; ?>
/********************************************
*************************/
sayfa.php
<? include "kontrol.php"; if ( $kontrol == 1 ): echo "<center>Gizli bölüm</center>"; echo "<br><br><a href=logout.php><center>logout</center>
</a>"; echo "<br><a href=sil.php><center>sil</center></a>"; else: include "hata.php"; endif; mysql_close() ?>
/********************************************
*************************/
sil.php
<? include "kontrol.php"; if ( $kontrol == 1 ): echo $ok; $sorgu="delete from kisi where kullanici='$ok'";
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
471
$islem=mysql_query($sorgu); echo "<center>ĠĢlem Tamamlandı</center>"; echo "<br><br><center><a href=index.php>Ana Sayfa</a></
center>"; else: include "hata.php"; endif; mysql_close() ?>
/********************************************
*************************/
kontrol.php
<? include"sabit.php"; $ok = $HTTP_COOKIE_VARS["kim"]; $hata = 3; mysql_connect($server,$user,$pass); mysql_select_db($database); $sorgu = "select * from kisi where kullanici='$ok' and suan='1'"; $bul = mysql_query($sorgu); $dogru = mysql_numrows($bul); if ($dogru == 1): $kontrol = 1; else: $kontrol = 0; endif; ?>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
472
/********************************************
*************************/
hata.php
<? if($hata==1): echo"<Center><Font Face=Verdana Size=1 Color=Red><b>Ha
talı ġifre...</b></font></center><br><br>"; include "index.php"; exit ; endif ; if($hata==2): echo"<Center><Font Face=Verdana Size=1 Color=Red><b>Ku
llanıcı Kayıtlı Değil...</b></font></center><br><br>"; include "index.php"; exit ; endif ; if($hata==3): echo"<Center><Font Face=Verdana Size=1 Color=Red><b>Lo
gin olmalısın...</b></font></center><br><br>"; include "index.php"; exit ; endif ; if(!($hata) or ($hata<1 or $hata>3)): echo"<Center><Font Face=Verdana Size=1 Color=Red><b>Ha
ta...</b></font></center><br><br>"; include "index.php"; exit ; endif ; ?>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
473
PHP ve GÜVENLĠK
Ġlk konularda anlatıldığı üzere internetin iletiĢim
protokolü olan TCP/IP protokolü güvenlikten daha çk verinin iletilmei amacına yönelik tasarlanmıĢtı. ĠĢte bu
yüzden web ortamında güvenlik inert yaygınlaĢtıkça büyük sorun olmaya baĢladı. Çünkü çk çeĢitli sebeplerle
internet siteleri, buları yayınlayan web sunuculara
saldırılır oldu, o da yetmez gibi web sunuculardaki we server programları, iĢletim sistemleri hedef tahtasına
kondu. Günümüzde
Merakını gidermek ve öğrenmek
Kendini test etmek
Bir yerlerden okuduğu bir yöntemi yada kodu
denemek
Yazılımı geliĢirenlere ―sizin ürününüzü kırdım, bunu
daha güvenli yapın, ben sizden daha akıllıyım‖ mesajı vermek
KiĢisel egosunu tatmin etmek
Yazılımların güvenlik açıklarına dikkati çekmek
Edindiği sisteme sızma yollarını yada önemli bilgileri para karĢılığı satmak
Rakibine ait bilgileri ele geçirmek
Gibi çok çeĢitli sebeplerle sistem güvenliğine saldırı olabilir. Üstelik sadece iyi niyetli olmayan kiĢilere karĢı
değil, ne yaptığını tam bilmeyen Web ziyaretçilerini de düĢünmek ve PHP programlarının güvenliğini arttırmak
gereklidir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
474
Internet ve iyiniyet bir arada olmaz. Size tuhaf gelsede içinde güvenlik açığı olan bir kodu yada programı ortaya
bırakırsanız birisi yada birileri bunu mutlaka kullanacaktır.
Sunucu güvenliği de son derece önemlidir ancak bunu sağlamak genellikle tasarımcının sorumluluğunda değil
hosting Ģirketinin sorumluluğundadır. Ancak sitedeki kodların ve vasa veritabanının güvenliği haliyle siteyi
tasarlayanın sorumluluğundadır.
Zararlar ne türde olabilir;
Sayfanız baĢa yerlere yönlendirilebilir
Sayfalarınız silinebilir veya değiĢtirilebilir
Sitedeki açık yardımıyla sunucu çökertilebilir
Site veritabanlarında bulunan kredi kartı
numaraları ve telefon numaraları, email adresleri
gibi özel bilgiler baĢkalarının eline geçebilir
Bunun dıĢında birde insan faktörü ile hata yapan
ziyaretçilerin hatalarının kontrol edilmesi gerekir. Mesela elektronik posta adresini yazmak isteyen kiĢi yanlıĢlıkla
@ yerine q yazabilir yada iki @ iĢaretiyle yazabilir, adresi eksik yada hatalı yazabilir. Formu eksik doldurabilir. Bu
gibi durumlarda hatayı sonradan düzeltmek zaman kaybına yol açar. Kimi zaman eksik verilmiĢ bir bilgi bu
bilgileri iĢleyecek olan diğer programda hataya yol açabilir. Bu sebeple, özellikle Form yoluyla alınan
bilgilerin kontrol edilmesi ve doğrulanması önemlidir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
475
Form doğrulama iki yerde yapılabilir. Ziyaretçi yani
istemci tarafından yada sunucu tarafında. Kullanıcı tarafındaki, yani ziyaretçiye göndereceğimiz HTML
sayfasının içinde yer alan kodlarla yapacağımız kontrol ve doğrulama sunucuya bağlantı gerekmediği için tabiî ki
hızlı çalıĢacaktır.
Kullanıcı gönder düğmesini tıkladıktan sonra çok
beklemesi gerekmez. Ancak bildiğiniz gibi HTML kodları herkesçe kolayca görülebilirler. Bu durumdan anlamamız
gereken konrol ve doğrulama iĢlemini yapan kodlarında görüntülendiğidir. Bunları inceleyen kötü nietli ve bilgili
biri kodunuzun açıklarını kullanarak zararlı kod gönderebilir. Bu kontrol iĢleminin sunucu tarafında
yapılması ise zaman, hız ve trafik geniĢliğinden kayıp demek olsada güvenlik açısından daha etkindir.
Kullanıcı her gönder düğmesinde gönder düğmesini
tıkladığında sunucu tarafı verilen kodlara göre bilgileri doğrular ve eksik kısımları bildirerek tekrar giriĢ ister. Bu
gerektiğinde 4-5 defa git-gel-doğrula iĢlemine yol açar ama sonuçta önemli olan güvenliktir.
PHP ayrıca mevcut hemen hemen bütün sunucu kullanıcı kimlik doğrulama protokolleri ile uyumludur; ve sunucu
yönetimi ile iliĢki kurularak daha karmaĢık kullanıcı kimlik doğrulama yöntemleri uygulanabilir. Bu yöntemler
arasında Secure Socket Layer (SSL) yöntemlerini, ve OpenSSL ve ModSSL teknikleri sayabiliriz.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
476
addslashes() fonksiyonu (metindeki zararlı olabilecek karakterleri etkisiz yapmak)
addslashes fonksiyonu ile metinde hacking gibi etkilere
açık kapı bırakabilecek ‗ (tektırnak), ― (çift tırnak), \ (ters slash) iĢaretleri etkisiz hale getirilebilir. Daha önce
escape karakterlerinde gördüğümüz gibi bu karakterlerin önüne ―\‖ karakteri getirilir ve etkisiz hale getirilmiĢ olur.
<?php
$str = "tuncay'ın transferi";
$a = addslashes($str); // Tuncay\'ın
transferi
?>
stripslashes () fonksiyonu (etkisizleĢtirilmiĢ kodları ilk haline döndürmek)
addslashes fonksiyonu ile metinde hacking gibi etkilere
açık kapı bırakabilecek ‗ (tektırnak), ― (çift tırnak), \ (ters slash) iĢaretleri etkisiz hale getirildiği belirtilmiĢti. Daha
önce escape karakterlerinde gördüğümüz gibi bu karakterlerin önüne ―\‖ karakteri eklenir ve etkisiz hale
getirilmiĢ olur. Ancak daha sonra bu bilgi tekrar ekrana
yazıldığında iĢ karıĢır. Ekrana ―Tuncay\'ın transferi‖ yazıldığında haliyle kullanıcı bunu tuhaf bulacaktır.
Sonuçta yapılması gereken bu bilgiyi ilk haline getirmektir. Bunu da stripslashes kullanarak yapmak
mümkündür.
<?php
$str = "tuncay'ın transferi";
$a = addslashes($str); // Tuncay\'ın
transferi
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
477
$b = stripslashes($str); // Tuncay'ın
transferi
?>
strip_tags () fonksiyonu (HTML etiketlerini metinden çıkarmak)
Bu fonksiyon ile istenmeyen HTML etketlerini bir metinden atmak mümkündür. Peki bu ne zaman
kullanıĢlı olur denilire; bir ziyaretçi defteri düĢünelim. Kullanıcı site hakkındaki düĢüncelerini yazacağı ekrana
gelip <H1>Bu site 5 para etmez. BoĢuna zaman harcamayın!</H1> yazarsa, bu bilgi site dizaynını
bozacak Ģekilde büyük baĢlık olarak görnütülenecektir. (Olumsuz reklam özelliğini saymıyoruz). Bu durumda en
uygun olay strip_tags ile etiketleri çıkartmaktır. Ancak strip_tags istenirse ikinci bir paramete ile bazı etikelerin
bırakılmasınada izin verir.
<?php
$str= "<MARQUEE><B>Selam!</B></MARQUEE>";
$a = strip_tags($str);
$b = strip_tags($str, "<B><I>");
echo $a . ―<br>‖. $b;
?>
Yukardaki kod çalıĢtırıldığında ilk echo metindeki tüm etiketleri çıkarılmıĢ halde görüntülediği halde ikinci echo
komutunda ―<b>‖ etiketinin etkisi devam etmektedir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
478
Çünkü stripslashes kullanılırken bu etiketin çıkarılmaması
istenmiĢtir
PHP ile Header Kullanımı
Bir web tarayıcı bir web sunucuya bir döküman istediği
gönderdiğinde web sunucu istenilen dökümanın yanısıra header(baĢlık) adı verilen bazı açıklayıcı ve yönlendirici
bilgiler de gönderir. Bunar aslında http protokolü ile
tanımlanmıĢ çeĢitli parametreler ve bunlara ait bilgilerdir. Örneğin kredi kartı iĢlemlerinin olduğu bir sayfanın
taraıcının önbelleğine alınmasi demek kredi kart numarasınında saklanması demektir. Bu durumda
header bilgileri kullanılarak sayfanın ön belleğe alınmaması sağlanabilir.
Http doğası gereği header bilgileri kullanılacağı zaman
kod içinde bu fonksiyondan daha önce ekrana çıktı yapılmamıĢ olmalıdır.
header() fonksiyonu-(BaĢlık bilgilerini kullanmak)
Yukarda tanımlandığı üzere baĢlık bilgilerinin kullanımını
sağlar. Komut aĢağıdaki paramerelerden birini içerebilir.
Location
Pragma
Cache-Control
Content-Encoding
Content-Language
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
479
Content-Type
Expires
Referrer
Last-Modified
User-Agent
Accept-Encoding
Accept-Language
Örnek1
<?php
header("Pragma: no-cache");
header("Cache-Control: no-cache, must revalidate");
?>
Yukardaki kullanımda safa içeriği ara bellekte
depolanmayacaktır. Bu, özellikle yüksek güvenlik gerektiren ve çok sık değiĢen siteler için gereklidir.
Örnek 2:
<?php
header("Location: http://deneme.com.tr");
?>
Yukardaki kullanımda ise header fonksiyonu kullanıcıdan
hiçbir Ģey sormadan tanımlanan URL adresine gider. Burada dikkat edilecek konu öncesinde ekrana çıktı
vermemektir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
480
Header fonksiyonunun bu kullanımına çok sık
baĢvururlur. Çünkü özellikle Ģifre korumaı sitelerde, ―parola doğru ise Ģu adrese git‖ tarzı iĢlem yapmak için
kullanılır.
Örnek :
AĢağıda görüldüğü gibi parola ve isim soran parola.php dosyası olsun. Daha sonra bu bilgileri konrolphp
dosyasında onrol edip basit bir Ģifreli giriĢ iĢlemi yaptıralım.
//Parola.php dosyası
<html>
<head>
<title> GiriĢ Form </title>
</head>
<body>
<form action="kontrol.php" method="post">
<input type="text" name="user">
<p><input type="password" name="pass">
<p><input type="submit" name="submit" value="Tamam">
</form>
</body>
</html>
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
481
Bu sayfadan alınan girdiler user ve pass adlı iki
değiĢkendir. Bu bilgileri kontrol.php dosyasında verilen değere göre test edip gidilecek adrese karar verilecekir.
<?
//kontrol.php dosyası
// gereksiz boĢluklar alınıyor
$user = trim($user);
$pass = trim($pass);
if ($user == "tuncay") {
if ($pass = "FB") {
header ("Location : OK.php");
}
} header ("Location : olmadi.php.php");
?>
Kod da kullanıcı adı ve parolanın doğru olup olmadığı kontrol edildikten sonra eğer her iki bilgi de doğru ise
OK.php adlı döküman çağrılıyor. Eğer bu bilgilerden herhangi birisi doğru değilse bu iĢlem yapılmayacak e
olmadi.php adresine gidilecektir. Yukarıdaki örnekte dikkat edilmesi gereken bir nokta vardır. header
("Location........."); kullanımı sadece kendisinden önce ekrana bir çıktı yapılmadığı durumlarda çalıĢacaktır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
482
Örneğin : echo "Öylesine bir çıktı";
header(Location : "deneme.html");
Kod parçacığı beklendiği gibi deneme.html dosyasını çağırmayacaktır. Bu kısıtlama PHP' nin zayıflığından değil
HTTP protokolünün tanımlarından kaynaklanmaktadır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
483
Bir Nesne Oluşturalım
Bir nesne oluĢturmak için önce onu tanımlamamız gerekir. Bunu PHP'nin class deyimini kullanarak
yapabiliriz. Bir nesnenin özellikleri (properties) ve metodları (methods) vardır. ġu kodu nesneler01.php
adıyla kaydedin:
<HTML>
<HEAD>
<TITLE>PHP'de Degiskenler</TITLE>
<meta http-equiv="content-type" content="text/html;
charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1254">
</HEAD>
<BODY>
<B>
<H2>
<?php
class ogrenci {
// özellikleri tanımlayalım
var $adi;
var $soyadi;
var $sinav1;
var $sinav2;
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
484
var $not;
// metodları tanımlayalım
function adi_belirle ($n) {
$this->adi = $n;
}
function soyadi_belirle ($n) {
$this->soyadi = $n;
}
function sinav1_belirle ($n) {
$this->sinav1 = $n;
}
function sinav2_belirle ($n) {
$this->sinav2 = $n;
}
function not_hesapla() {
$this->not = ($this->sinav1 + $this->sinav2)/2;
print ($this->adi. " " . $this->soyadi . " için not
ortalaması: ". $this->not);
}
}
//Buraya baĢka kodlar girecek
$ogr1 = new ogrenci();
$ogr1 -> adi_belirle("ġahika");
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
485
$ogr1 -> soyadi_belirle("Tabak");
$ogr1 -> sinav1_belirle(7);
$ogr1 -> sinav2_belirle(10);
$ogr1 -> not_hesapla();
?>
</H2>
</B>
</BODY>
</HTML>
Bu programda ogrenci adlı bir nesne tanımlıyoruz; ve daha sonra bir değiĢken adına new komutu ile bu
nesnenin bir örneğini oluĢturuyoruz. Nesnelerin yeni bir örneği veya kopyasını çıkartmak ifadeleri aslında
yaptığımızı tam anlatmıyor. Nesnenin tanımı bir adet; her new komutu ile bu nesnenin özelliklerine ve
metodlarına sahip yeni bir nesne yapmıĢ oluyoruz.
Nitekim bu iĢe insanın dilini dolayan Ġngilizce bir kelimeyle Instantiation (yeni bir varlığını oluĢturma)
deniyor. Bu örnekte, $ogr1 adlı değiĢken gerçekte, ogrenci nesnesinin tam bir örneği: içinde beĢ değiĢken
ve altı metod var. Nesneyi bir kere tanımladıktan sonra programın daha ileri aĢamalarında bu istediğimiz kadar
örneğini farklı isimler vererek oluĢturabiliriz. ġimdi Ģu satıra dikkat edelim:
$ogr1 = new ogrenci();
$ogr1 -> adi_belirle("ġahika");
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
486
Burada $ogr1'in parametrelerine nasıl değer
yazdırdığımızı görüyorsunuz. Nesnenin metodlarından biri olan adi_belirle fonksiyonuna bir değer veriyoruz:
"ġahika"; nesne oluĢturulurken yazılmıĢ olan bu fonksiyon ise aldığı değeri, kendi ait olduğu nesnenin bir
değiĢkenine kaydediyor:
function adi_belirle ($n) {
$this->adi = $n;
}
Bu ve diğer fonksiyonlarda kullandığımız "$this->" ifadesi, kendisine ulaĢtırılan değeri bir parametre olarak
kullanıyor ve "$adi" değiĢkenine yazıyor. "this" (bu) kelimesi o anda nesnenin o anda oluĢturulmakta olan
örneğine göndermede bulunur. "->" iĢlemcisini kullanarak, istediğimiz nesnenin istediğimiz metoduna
veya parametresine değer gönderebiliriz. Bir nesnenin
yeni bir örneğini oluĢturduğumuz zaman, bu örneğin bütün parametrelerini sağlamak veya bütün metodlarını
kullanmak zorunda değiliz.
Yukarıdaki örneğe göre yeni örnekler oluĢturarak en az
dört öğrencinin not ortalamasını hesabedebilir misiniz? PHP ile Web programcılığı yolunda hızlı adımlarla yol
alıyoruz. Bu bölümde gördüğümüz dizi değiĢkenler ve nesneler, Web sayfalarımızda bir çok iĢi adeta otomatik
hale getirecek unsurlar olarak kullanılacak.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
487
PRATĠK BĠLGĠLER
Resim Albümü:
Bir dizindeki tüm resimleri sırası ile önceki sonraki
Ģeklinde gösteren program örneği olarak aĢaıdaki örneği
kullanmak mümkündür. Bu Ģekli ile kullanman için kodu index.php olarak, kullandığı stil Ģablonunu ise galeri.css
adıyla bir klasöre kaydedip aynı klasöre gösterilecek resimleri de koymak yeterlidir. Kodun sadeleĢtirilmesi
mümkündür. Ayrıca kullandığı stil Ģablonunun değiĢtirilmesi sadece hayal gücünün sınırına bağlıdır.
<link rel="stylesheet" type="text/css" href="galeri.css">
<? //index.php $resim_link="index.php?no=";
$imagelist=array(); $handle=opendir('.');
while ($file = readdir($handle))
{ if(is_file($file) )
$uzun=strlen($file);$son=strlen($file)-3; {
$ext=substr($file,$son,$uzun); $ext=strtolower($ext);
if ( $ext == "jpg" || $ext == "gif" || $ext == "bmp" )
{ array_push($imagelist, "$file");
}
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
488
}
} $sayi=count($imagelist);
if ($no =="") {$no=0;} $i=$no+1;
$onceki =$no-1; $sonraki =$no+1;
if ($onceki<0) echo"
<center> <font face=verdana size=2 color=white>Resim Sayısı :
$sayi</font><br> <font face=verdana size=2 color=white>ġu An Gösterile
n : $i</font><br> <br> <img src=$imagelist[$no] border=1 class=bir><br><br
>
<a href=$resim_link$sonraki>Sonraki Resim</a> <center>
"; else if ($sonraki>=$sayi)
echo" <center>
<font face=verdana size=2 color=white> Resim Sayısı : $sayi</font><br>
<font face=verdana size=2 color=white>ġu An Gösterilen : $i</font><br> <br>
<img src=$imagelist[$no] border=1 class=bir><br><br>
<a href=$resim_link$onceki>Önceki Resim</a> <center>
";
else
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
489
echo"
<center> <font face=verdana size=2 color=white>
Resim Sayısı : $sayi</font><br> <font face=verdana size=2 color=white>ġu An Gösterile
n : $i</font><br> <br> <img src=$imagelist[$no] border=1 class=bir><br><br
> <a href=$resim_link$onceki>Önceki Resim</a> |
<a href=$resim_link$sonraki>Sonraki Resim</a>
<center> ";
?>
css dosyası galeri.css
body {
font-family: Verdana, Arial, Helvetica, sans-serif;
background: #666666;
scrollbar-arrow-color: #FFFFFF;
scrollbar-base-color: #000000;
scrollbar-face-color: #000000;
}
a.bir { font-family: Verdana; color: #FF9999; text-
decoration: none}
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
490
a.bir:hover { cursor:crosshair; font-family: Verdana; color: #99FFFF; text-decoration: underline overline}
img.bir { border: #FFFFCC; border-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-
width: 1px; border-left-width: 1px}textarea { font-family: Verdana; font-size: 10pt; color: #FFFFCC;
background-color: #666666; border: #CCFFFF; border-style: solid; border-top-width: 1px; border-right-width:
1px; border-bottom-width: 1px; border-left-width: 1px}
GiriĢ sayfası yapmak
Sayfa tanımlanan süre kadar ekranda görünür ve daha
sonra belli bir adrese gidilmesini sağlar. sitenizin niteliği
hakkında fikir verir ve ilgi çeken bir özelliği vardır:
<META HTTP-EQUIV="Refresh" CONTENT="5;URL=hedefurl.HTML">
<BODY>
<IMG width="300" height="200" alt="GiriĢ
resmi"SCR="enter.jpg">
<BODY>
Bu konuda en çok dikkat edilecek konu yüksek bekleme
sürelerinden kaçınmaktır. Yada böyle durumlarda hedefe sayfa içinde de link verilmelidir. Böylece ziyaretçi sabırlı
çıkıp beklesede linke tıklasada aynı yere gider.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
491
Sayfada Tarih Yazdırma
Konuyu baĢında beri okuyupta PHP tarih fonksiyonlarını
gördü iseniz ―o da bir Ģeymi PHP ile bunun alasını yapabiliriz‖ diyebilirsiniz. Ancak bazen PHP eriĢimi
olmadan bunu yapmak gerekebilir. Bu durumda mecburen aĢağıdaki kod gibi Javascript gerektiren bir
blok parçasını kodunuza eklemeniz gerekir.
Biraz uzun görünebilir ama, herĢeyi bir tablo içinde gösteren bu kodu, istediğiniz sayfaya dahil ederek, her
sitede tekrar tekrar kullanmanız mümkün. Ancak dikkat etmeniz gereken konu; bu kod ziyaretçinin sistem
saatini görüntüler. PHP dilindeki gibi sunucu saatini değil.
Bu kodu, yazarının adını belirten satıra yer vermek
Ģartıyla, istediğiniz gibi kullanabilir ve değiĢtirebilirsiniz. Kod içindede görebileceğiniz gibi orijinal geliĢtirici Caroly
B. Allard adlı bir webmasterdır. AĢağıdaki hali ise bir baĢka weböaster tarafından biraz değiĢtirilmiĢ halidir.
Bununla birlikte ben Ģahsen ekrana kullanıcının sistem saatini görüntülemek için bunca kod eklemeye ve
zahmete girermiyim diye sorulursa cevabım ―hayır‖ olur.
Çünkü kullanıcı cidden saati öğrenmek isterse, sağ alt
köĢeye sistem bildirim alanına bakar olur biter, o zaman
bunun için zahmete girmeye değermi düĢünmek lazım. Ancak yinede el altında olması için kod aĢağıda
görülmektedir.
<TABLE WIDTH="75%" BORDER="0" CELLSPACING="5" CELLPADDING="5">
<tr><td WIDTH="100%">
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
492
<script LANGUAGE="JavaScript">
<!-- eski browseryardan gizleyelim
// DateCal JavaScript v1.00 Copyright (c) 1998 Carolyn B. Allard
var bugun = new Date()
var gun = bugun.getDay()
var tablo
var ay = bugun.getMonth()
var tarih = bugun.getDate()
var yil = bugun.getYear()
var ay_uzun = "January"
var yil_uzun = 1900
var uzuntarih = "bugun"
if (gun == 0) {resim = "pazar.jpg"}
if (gun == 1) {resim = "pazartesi.jpg"}
if (gun == 2) {resim = "sali.jpg"}
if (gun == 3) {resim = "carsamba.jpg"}
if (gun == 4) {resim = "persembe.jpg"}
if (gun == 5) {resim = "cuma.jpg"}
if (gun == 6) {resim = "cumartesi.jpg"}
if (ay == 0) {ay_uzun = "Ocak"}
if (ay == 1) {ay_uzun = "ġubat"}
if (ay == 2) {ay_uzun = "Mart"}
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
493
if (ay == 3) {ay_uzun = "Nisan"}
if (ay == 4) {ay_uzun = "Mayıs"}
if (ay == 5) {ay_uzun = "Haziran"}
if (ay == 6) {ay_uzun = "Temmuz"}
if (ay == 7) {ay_uzun = "Ağustos"}
if (ay == 8) {ay_uzun = "Eylül"}
if (ay == 9) {ay_uzun = "Ekim"}
if (ay == 10) {ay_uzun = "Kasım"}
if (ay == 11) {ay_uzun = "Aralık"}
yil_uzun = 1900 + yil
uzuntarih = ay_uzun + " " + tarih + ", " + yil_uzun
tablo = '<TABLE WIDTH="120" BORDER="0"
CELLSPACING="2"';
tablo += 'CELLPADDING="0" HEIGHT="34">';
tablo += ' <TR>';
tablo += ' <TD WIDTH="120"
HEIGHT="34"ALIGN="center" VALIGN="bottom"
BACKGROUND="';
tablo += resim;
tablo += '"><CENTER><FONT COLOR="#003399" FACE="Arial" SIZE="-1">';
tablo += uzuntarih;
tablo += ' </FONT></CENTER></TD>';
tablo += ' </TR>';
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
494
tablo += '</TABLE>'
document.write(tablo)
// gizlemeye son-->
</script></font><</td></tr></table>
Bu kodu yazarken, en çok dikkat edilmesi gereken
bölümü, Javascript'e HTML yazdırtan son 16-17 satırıdır.; tek ve çift tırnakların yerine özellikle dikkat etmeniz
gerekir.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
495
CMS Sistemleri
Bugün web ortamında milyonlarca site hazırlanmıĢtır.
Web siteleri ilk ortaya çıktıklarında Ģirketler bir web master bulup bir site yaptırırlar ve daha sonra
gerektiğinde gene aynı webmaster siteyi günceller yada site içeriğine hiç dokunmadan yıllaca kalırdı. Bazı
Ģirketler ise daha Ģanslıydı çünkü bünyelerinde Bilgi
iĢlem birimleri bu güncelleme iĢlemini de yapardı. Ancak daha sonra site içeriklerini güncellemenin siteyi ilk kez
yapmaktan daha da önemli olduğu anlaĢıldı. Çünkü bu hem maliyetli bir iĢlemdi hem de çoğu site için sürekli dıĢ
kaynak gerekinimi demekti. Tabii birde kodlamayı bilmek gerekiyordu. Ġnsanlar bu ortamda daha kolay
güncellebilir sitelerin talebini yapmaya baĢladıklar.
Ek olarak belirtmem gerekirse; Arama motorları‘nın
güncelleme konusunda site sahiplerini deyim yerindeyse zorla koĢturması bu konuda itici bir güç olmuĢtur.
Çünkü ticari siteler için arama motorlarının üst sayfalarında yer almak için can atmaktaydı. Bunun
yoluda belliydi. Arama motorlarına reklam vermek ancak dahada önemlisi arama mortları ile dostça geçinen ve
sıkça güncellenen bir site kurmak. Arama motorlarının
kullandığı algoritmalar daha sık güncellenen siteleri daha yukarıya taĢımaya baĢladıklar ki bu da çok mantıklı bir
iĢlemdi.
Bundan hareketle site yaptıranlar FLASH animasyon
yazarlarından bile metinlerin Flash dosyası dıĢında tutulmasını ve böylece değitirilebilir olmasını istemeye
baĢladılar. Yine menüler içinde grafik dosyaları yerine uygun Ģekillerde metinler kullanılmaya baĢladı. Öyle ya
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
496
Google web ‗e her gün eklenen milyonlarca milyarlarca
sayfa ile zaten yeterince meĢgulken birde iĢi gücü bırakıp Flash yada resim dosyalarını analiz edip içindeki metinleri
bulup çıkarmaya uğraĢamazdı. Yani dağ yerinde durmuĢ, ―ben ayağınıza gelemem, eğer ziyaretçi istiyorsanız
buyurun siz gelin‖ diyordu.
Sonunda PHP dili ile site tasarlayan bazı yazılımcılar bazı
hazır site kodları ürettiler. Bu site kodlarında bir çok değerler parametrik olduğundan kolayca kurulduğu her
siteye uygun hale getiriliyordu. Ayrıca içeriğide kolayca değiĢtirmek mümkündü. Özelikle PHP dilinde geliĢtirilmiĢ
olan CMS sayısı diğer dillerden daha fazladır. Bundan PHP dilinin ve Mysql veritabanının ücretsiz sunumuĢ
olmasının yanında hosting masraflarının daha düĢük olmasının etkiside büyüktür.
Benim CMS sistemleri ile ilk tanıĢmam PHP Nuke ile oldu.
Venezuellalı bir genç olan Francesco Burzi tarafından yazılan bu CMS open source idi. Daha sonra DCP Portal
adına rastlamıĢ ve ne de çok sevinmiĢtim. Çünkü bir Türk tarafından geliĢtiriliyordu ve oldukçada popülerdi.
PHP Nuke o günler için adeta büyü etkisi yapan modüle, blok ve tema gibi kavramları da içeriyordu. Kısaca Php
Nuke için kendi modüllerinizi eklemek mümkündü. Ayrıca blok kavramı gelmiĢti. Örneğin ekranın her bir ögesi bir
blok idi. Tema kavramı ile blok kavramı sayesinde bir birinden ayrı gibi görünen yüzlerce Ģablon dosyası
oluĢturuldu. Ġnsanlar Php nuke bloklarının konumu ile ve renklerle oynayarak bir sürü hazır PHP Nuke teması
geliĢtirdiler.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
497
O günden bu güne zaman içinde onlarca CMS ile tanıĢtım
ve bir çoğunu ya demolardan yada makalelerden inceledim, bazılarını da müĢterilerime kurdum.
Bu kısmı yazarken amacım sizlere bazı CMS sistemlerinin özelliklerini öğretmek ve bir karĢılaĢtırma sunabilmek.
Ancak tamamen uzman olacağınız seviye de bir CMS anlatıldığını düĢünüyorsanız yanılıyorsunuz demektir.
Bunun kendimce sebepleri var.
Ġnternette tamamen GNU lisansı ile dağıtılan yüzlerce
CMS sistemi bulumaktadır. Size uyan bir tanesini deneye yanıla öğrenebilirsiniz.
CM Simple
CMS Made Simple
SMF
Mambo
Joomla
Php Nuke
Post Nuke
Red CMS
E107
Etomite
Bunlardan sadece bir kısmıdır.
HTML-CSS–PHP–MYSQL ve SQL Derleme : Ġbrahim Halil Kutluay- 2007-2013
498
DĠĞER SÜRÜME DAĠR NOTLAR
Bir sonraki sürümde Allah izin verirse daha çok örnek
kod ekleyerek kitabı daha iĢe yarar hale getirmeyi planlıyorum.
Kitaptaki hataları bildirecekler web sitemden bana ulaĢabilirler.
PHP kod blokların da bazı yerlerde <?php ve ?>
kullanılmamıĢtır.
Dolayısıyla kodları denemek isteyenler bu duruma dikkat
etmelidirler.
ÇalıĢmada bazı yerlerde gözden kaçan yazım hataları
olabilir, onun için sizlerin yardım ve teĢviği önemlidir.
Ġyi çalıĢmalar dilerim.