HTML-CSS-PHP MYSQL-SQL

Ebat: px
Şu sayfadan göstermeyi başlat:

Download "HTML-CSS-PHP MYSQL-SQL"

Transkript

1 HTML-CSS-PHP MYSQL-SQL İbrahim Halil Kutluay Nisan 2013

2 Ġçindekiler Ġçindekiler... 2 GĠRĠġ Kullanım Kuralları HTML DĠLĠ Bir Web Sitesi Bilinmesi Gereken Temel Bilgiler Bir web sitesi için Domain Uzantı Adları TCP / IP PORT Web Server Apache IIS Bir Web Server yazılım paketi seçerken dikkat edilmesi gereken bir kaç ilkeyi sıralayalım: Web de Gezme ĠĢlemine Genel Bir BakıĢ HTML in baģlıca özelliklerini Ģöyle sıralayabiliriz: Web Tarayıcıları Microsoft Internet Explorer Netscape Navigator Firefox Opera Google Chrome Yandex Browser Tarayıcılar Ġçin Yardımcı Programlar ve Ek Birimler.. 40 HTML Editörleri Expression Web Dreamweaver Word NVU HTML in Temel BileĢenleri

3 Etiketler (Tag) HTML Yazım Kuralları HTML Dosyasının Bölümleri Türkçe bilgi içeren bir sayfa örneği ise; <html>...</html> <head>...</head> <title>...</title> <body>...</body> Meta Etiketleri Arama Motorları Ġçin Sitemize Eklememiz Gereken Bilgiler Meta Tağlarının GeliĢmiĢ Kullanımı Sayfanın Süre AĢımını Belirtmek Bir Sayfanın Belirli Bir süre Ekranda Kalıp Otomatikman BaĢka Bir Adrese Yönlenmesini Sağlamak Türkçe Karakterleri Görüntülemek-Kod Sayfası <BODY> Etiketinin Parametreleri TrueType Fontlar-Harf GeniĢliği Serif ve Sans Serif Harfler H1,H2,H3,H4,H5,H6 BaĢlık Etiketleri <br> etiketi <p> </p> etiketi Genel Biçimlendirme Etiketleri Metni Koyu, veya Ġtalik Yazdırma HTML Dilinde Renk Kodlaması Güvenilir 216 Renk Sıralı Listeler Sırasız Listeler <HR> Etiketi ile Çizgi OluĢturma Resim ve Multimedya Dosyalarını Kullanmak Marquee ile Resim Ve Metin Kaydırma Resimleri Kullanırken Dikkat Edilecekler;

4 Video ve Ses Dosyalarının Kullanımı Tablolar BaĢlık, Satır ve Veri Etiketleri Sütun ve Satır BirleĢtirme Colspan- Rowspan Zemin - Bgcolor Tablonun geniģliği- Width Tablonun Çerçevesi - Border Hücre içindeki boģluk miktarı CELLPADDING Hücreler arası boģluk miktarı CELLSPACING Sembol ĠĢaretlerinin HTML Dilindeki KarĢılıkları Genel Sayfa Kullanım ġekilleri Çerçeveler -Frames Avantajları Dezavantajları Frame Parametreleri Frame Satırları ve Sütunları Yatay Dikey KarıĢık Frame OluĢturmak HTML de Bağlantı ya (LINK) GiriĢ HTML de Bağlantı Türleri HTTP bağlantıları: FTP bağlantıları: Haber Grupları: Elektronik Posta Bağlantısı: Dosya Bağlantıları: Diğer bağlantılar: Resimleri Link BaĢlığı Vermek Ġçin Kullanmak Resim Haritası (Image Map) ile Link Kullanımı Link Verirken Relative (göreceli) ve Absolute (mutlak) Adreslemelerin Farkları KULLANICI ĠLE ETKĠLEġĠM VE FORMLAR Form Etiketinin Alt Seçenekleri Form Elemanları Çizelgesi

5 INPUT Kullanıcının klavyeden metin girmesi için: Parola GiriĢi için: Onay Kutusu için (Check iģareti): Tekil Seçme Kutusu için (Radyo düğmesi): Listeleme Kutusundan SeĢmek Ġçin (SELECT) Uzun Metin GiriĢi Ġçin (TEXTAREA) Gönder ve Sil düğmeleri (Submit ve Reset) Tabindex URL Kodları CSS ile Biçimlendirme Teknikleri, Dinamik HTML CSS Stillerine Neden Ġhtiyaç Duyulur Cascading Style Sheets -CSS ve Kullanım ġekilleri. 121 Yerel Stil ġablonu Sayfa Ġçi Global Stil ġablonu Site Ġçi Global Stil ġablonu Birden fazla stil Ģablonu verilirse Tarayıcı ne yapar? 125 HTML içinde bölüm oluģturma (DIV) CSS ve Seçici(Selector) Kavramı ve Seçici Tipleri ĠsimlendirilmiĢ Seçiciler Sınıf Seçiciler Karma Seçiciler (Pseude Classes) ġartlı Seçiciler (Contextual Selectors ) Bir Alana Tanımlı Stillerin DıĢında Stil Uygulamak CSS Blokları ve Denetlenebilir Özellikler CSS Biçimlendirme Tablosu Font Özellikleri Ġçin CSS Kullanımı: FONT-FAMILY (Yazıtipi ailesi): FONT-STYLE(YazılıĢ ġekli): FONT-VARIANT (Yazıtipi türü): FONT-WEIGHT (Yazıtipi Koyuluğu): FONT-SIZE (Yazıtipi boyutu):

6 Renk ve Zemin Özellikleri: Metin Özellikleri: Konum (Pozisyon) Özellikleri Konum POSITION: Değerleri CSS ve Katman (Layer) Kavramı Katman Ġndeksi (Z-index): BoĢluk bırakma, Margin : Xhtml BELGE TÜRÜ Sonuç Altın Öğütler Hosting Hizmeti Alırken Web Sitesi Yaparken Site Tasarımı Adımları Bir Site Tasarlarken Bir Web Sitesinin Tutulmasını Sağlayan Etkenler Tanıtım Kullanıcı Dostu Tasarım EriĢilebilirlik Kaliteli Ġçerik Geri Besleme Php Programlama Dili Php Programlama Dili Php Dilinin GeçmiĢi Neden PHP Interaktif Web Sayfaları Hazırlamak Ġçin Yöntemler 165 PHP ve ASP KarĢılaĢtırması PHP ve Cold Fusion KarĢılaĢtırması PHP Dilinin Kapasitesi PHP Nasıl ÇalıĢır PHP Dili ve Veritabanı Programları ile ĠliĢkisi PHP Dilinin GeniĢletilebilirliği Bazı PHP Kütüphaneleri ve iģlevleri

7 PEAR (PHP Extension and Application Repository) PHP - Web Sunucusu PHP Kurulumu XAMPP APPSERV Uniform Server EasyPHP Php Öğrenmek Zormu Ġlk PHP Programımız Merhaba Dünya PHP KOD YAZIM KURALLARI Açıklama (Yorum) Satırları PHP ile Ekrana Çıktı Verme echo() fonksiyonu-(ekrana yazdırma) print() fonksiyonu (Ekrana Veri Yazma) Escape Kodlar DeğiĢken Nedir? DeğiĢken Türleri Alfanümerik DeğiĢkenlerin Ġçeriğine Dizi Olarak EriĢme Diziler (Array) Çok Boyutlu Diziler Dizi Tanımlama Kuralları Nesneler (Objects) Sabit Değerler - Constants define ("SABIT_ADI", değeri); Operatörler Aritmetik Operatörler: BirleĢik Atama Operatörleri Bir Arttırmak veya Azaltmak için Kontrol Blokları ve KarĢılatırma Operatörleri KarĢılaĢtırma Operatörleri ĠĢlem Önceliği Sıralaması if komutu

8 if-endif Kullanımı ve PHP ile HTML Kodunu Ayırma Endif switch komutu Tek KoĢula Göre Ġki Sonuç - Üçlü Operatör (Ternary Operatör) Döngü Kavramı For Döngüsü While Do Döngüsü Do While Döngüsü For.. Each Döngüsü Döngüyü Kırmak için Break Komutu Döngüyü Devam Ettirme : Continue Döngü Ġçinde Döngü Kullanımı Döngü ve Kontrol Bloklarında PHP ve HTML Ġç içe Kullanım BaĢka Bir Dosyayı Ġthal Etme include() fonsiyonu require() fonksiyonu include_once ve require_once include() ve türevlerindeki güvenlik açığı include() ile Kodun Yeniden Kullanımı HEREDOC Nedir Fonksiyon Kavramı ve Kategorilere Göre PHP Fonksiyonları DeğiĢkenlerle ĠĢlem Yapan Fonksiyonlar isset() fonksiyonu (değiģkene değer atanmıģ mı kontrol etmek) unset() fonksiyonu (değiģkeni hafızadan atmak-yok etmek) empty() (DeğiĢken boģmu) is_string(), is_integer(), is_double() fonksiyonları ile tip tespiti

9 print_r () fonksiyonu DeğiĢken Tiplerini DönüĢtürme ve DeğiĢken Tipini Öğrenme gettype() fonksiyonu (DeğiĢken tipini alma) settype() fonksiyonu (değiģekene bir tip atama). 243 Dizilerle ĠĢlem Yapan Fonksiyonlar array_merge() fonksiyonu- (Dizileri birleģtirme) array_push() fonksiyonu (Dizilere değiģken ekleme) array_shift() fonksiyonu (Dizinin ilk elemanını silme) array_slice() fonksiyonu (Diziden kopyalama) sort() ve rsort() fonksiyonları-(dizileri sıralama) asort() ve ksort() fonksiyonları-(ġliģkili dizileri sıralama) Program Durdurma Fonksiyonları exit() fonksiyonu (kodun çalıģmasını durdurmak) die() fonksiyonu (kodun çalıģmasını durdurmak) eval() fonksiyonu (kodun çalıģmasını durdurmak) Tarih ve Zamanla ĠĢlem Yapma Avantajları Dezavantajı time() fonksiyonu (Ģu anki zaman bilgisini alma). 251 microtime() fonksiyonu (Ģu anki zaman bilgisini hassas birimle alma) strtotime() fonksiyonu (Metni zaman bilgisine çevirme) date () fonksiyonu (tarih zaman bilgisini metne çevirme) mktime() fonksiyonu (sayılardan tarihi oluģturma) checkdate() fonksiyonu-tarih geçerli mi

10 setlocale() fonksiyonu (bölgesel ayarlar) Tarih Bilgilerini Türkçe Yazdırmak getdate() fonksiyonu (tarih zaman bilgisini alma) 259 Matematiksel ĠĢlemlerde Kullanılan Fonksiyonlar Ve ĠĢlevleri ceil() fonksiyonu (yukarı yuvarlama) floor() fonksiyonu (aģağı yuvarlama) round () fonksiyonu (matematiksel yuvarlama) rand() fonksiyonu (rastgele sayı üretme) mt_rand() fonksiyonu (rastgele sayı üretme) srand() ve mt_srand() fonksiyonları (ilk sayıyı vererek rastgele sayı üretmek) getrandmax() ve mt_getrandmax() fonksiyonları (Üretilebilecek en yüksek sayı) abs() fonksiyonu (mutlak değer) sqrt() fonksiyonu (karekök alma) pow() fonksiyonu (üs alma) hypot() fonksiyonu (hipotenüs hesaplama) log() fonksiyonu (logaritma) log10() fonksiyonu (logaritma) base_convert() fonksyionu (sayının tabanını değiģtirme) bindec() fonksiyonu (desimal düzene çevirme) decbin() fonksiyonu (Onluk düzenden ikilik düzene çevirme) dechex() fonksiyonu (16 lık düzene çevirme) decoct() fonksiyonu (8 lik düzene çevirme) hexdec() fonksiyonu (Hex düzeninden ikilik düzene çevirme) octdec() fonksiyonu (8 lik düzenden 2 lik düzene çevirme) max() fonksiyonu (en büyük değeri bulma)

11 min() fonksiyonu (en küçük değeri bulma) Trigonometrik fonksiyonlar sin() fonksiyonu (sinüs) cos() fonksiyonu (kosinüs) tan() fonksiyonu (tanjant) asin() fonksiyonu (arcsinüs) cos() fonksiyonu (arckosinüs) atan() fonksiyonu (arctanjant) deg2rad() fonksiyonu (açıyı radyana dönüģtürme) rad2deg() fonksiyonu (açıyı radyana dönüģtürme) Metin ĠĢleme Fonksiyonları substr() fonksiyonu (Metnin bir parçasını alma) chr() fonksiyonu (ASCII kodun karakter karģılığı) 270 ord() fonksiyonu (Karakterin ASCII kodunu bulma) strlen() fonksiyonu (Metnin uzunluğunu bulma) count_chars() fonksiyonu (Metin içinde karakterlerin tekrar etme sayısını bulma) str_word_count() fonksiyonu (Metin içindeki kelime sayısını bulma) strpos() ve stripos() fonksiyonları (Metnin bulunduğu pozisyon) strstr () ve stristr () fonksiyonları (Metnin ilk bulunduğu yer) wordwrap() fonksiyonu (Metni satırlara ayırma) explode() fonksiyonu (Metni bölümlere ayırma) implode()fonksiyonu (Metni bölümlere ayırma) strtoupper() fonksiyonu (büyük harfe çevirme) strtolower () fonksiyonu (küçük harfe çevirme)

12 ucfirst () fonksiyonu (ilk harfi büyük harfe çevirme) ucwords () fonksiyonu (kelimelerin ilk harfini büyük harfe çevirme) number_format() fonksiyonu (Rakamları ekrana biçimlendirerek yazdırmak) strcmp () fonksiyonu (iki metni karģılaģtırma) strcasecmp () fonksiyonu (iki metni karģılaģtırma) str_pad () fonksiyonu (metnin etrafını boģlukla (yada karakterle) destekleme) printf() ve sprintf() fonksiyonu (biçimlendirerek çıktı verme) parse_str() fonksiyonu (get ile alınan değiģkenleri parçalayarak bir diziye atma) Veri ġifreleme Fonksiyonları cyript() fonksiyonu (Metni verilen bir anahtara göre Ģifreleme) sha1() fonksiyonu (Metni hash algoritması ile Ģifreleme) md5() fonksiyonu (Metni MD5 algoritması ile Ģifrelem) Düzenli Ġfadeler (REGEXPS) Temel Seviye Regexpler BaĢlangıç Düzeyi Regexpler Üst Düzey Regexp Ġfadeleri En Üst Seviye (Guru ) Düzeyi Regexp Ġfadeleri preg_match() fonksiyonu (metinler eģitmi) preg_match_all() fonksiyonu ereg() fonksiyonu (dizilim arama) eregi() fonksiyonu (dizilim arama)

13 ereg_replace() fonksiyonu (dizilim arama ve değiģtirme) split() fonksiyonu (metni parçalara ayırma) sql _regcase() fonksiyonu (düzenli ifade üretme) 298 Kullanıcı Tanımlı Fonksiyonlar GeliĢtirmek Basit Bir Fonksiyon Yazalım - myecho GLOBAL ve STATĠK DEĞĠġKENLER Dizi Fonksiyonları array() fonksiyonu (değerleri diziye çevirme) count() fonksiyonu (dizinin eleman sayısını bulma) print_r () fonksiyonu (değiģken içeriğini yazdırma) var_dump () fonksiyonu (değiģken içeriğini yazdırma) Dizileri Sıra ile ĠĢlemek list() fonksiyonu each() fonksiyonu For.. Each ile dizileri iģlemek For ile dizileri iģlemek PHP ve Formlar Süper Globaller (Superglobals) Form Dizaynında Altın Kurallar Formlardan Bilgi Alma Form Verilerini ĠĢleme (Ġki dosya ile) Form Verilerini ĠĢleme POST Metodu Form Verilerini ĠĢleme (Tek dosya ile) Form Verilerini ĠĢleme POST Metodu Hesap Makinesi Programı Basit Bir ġifreli GiriĢ Sayfası Birden Fazla Sayfaya Yayılan Formlar PHP ile Posta Gönderme

14 mail() fonksiyonu PHP ile eposta göndermek Web Sayfasından Bir Siteye Dosya Yükleme (Upload) 333 PHP SERVER DEĞĠġKENLERĠ Kullanıcının Girdiği Değerlerin Doğruluğunu Kontrol Etme Windows ve Unix Dosya EriĢim Yetkilendirmesi PHP Klasör Fonksiyonları mkdir() fonksiyonu (Klasör oluģurmak) rmdir() fonksiyonu (Klasör silmek) chdir() fonksiyonu (Klasör değiģtirmek) is_dir() fonksiyonu (Dizin mi) opendir() fonksiyonu (Klasörü açmak) readdir() fonksiyonu (Klasörü okumak-listelemek) closedir() fonksiyonu (Klasörü kapatmak) PHP Dosya Fonksiyonları file_exits() fonksiyonu (Dosya var mı?) filesize() fonksiyonu (Dosya boyutunu bulma) is_file() fonsiyonu (Dosya mı ) is_readable() fonksiyonu (Dosya okunabilir mi?). 347 is_writable() fonksiyonu (Dosya yazılabilir mi? ) is_executable() fonksiyonu (Dosya çalıģtırılabilir mi? ) touch() fonksiyonu (dosya oluģturma) unlink() fonksiyonu (dosya silme) copy() fonksiyonu (dosya kopyalama) readfile() fonksiyonu (Dosyayı satır satır okumak ve ekrana yazmak) fopen () fonksiyonu (dosya açma) fgets () fonksiyonu (dosyadan satır satır okuma). 352 fseek () fonksiyonu (dosya içinde bir yere konumlanma)

15 fread () fonksiyonu (dosyadan belirli sayıda karakter okuma) fgetc () fonksiyonu (dosyadan birer birer okuma) 353 feof () fonksiyonu (dosya sonuna gelindi mi) fclose () fonksiyonu (dosyayı kapat) fputs() ve fwrite() fonksiyonu (dosyaya yazmadosyaya ekleme) flock() fonksiyonu (Kullanımdaki dosyayı kilitleme) fileadate() fonksiyonu (Dosyaya son eriģim tarihi- file access date ) filemdate() fonksiyonu (Dosyanın son değiģtirilme tarihi- file modification date) filecdate() fonksiyonu (Dosyanın oluģturulduğu tarih - file creation date) CSV Dosya Fonksiyonları fgetcsv() fonksiyonu (CSV dosyasını satır satır okuma) fputcsv() fonksiyonu (Değerleri CSV formatında yazma) KullanıĢlı Bir Örnek Kayıt Arama Öğrenci Notlarını Webde Yayınlama Basit Telefon Rehberi Basit Sözlük Basit Ziyaretçi Defteri PHP Çerez - Cookie Fonksiyonları setcookie() fonksiyonu (Çerez bırakma) Aynı sayfada birden fazla çerez bırakmak PHP Dilinde Oturum Kullanımı PHP ve MYSQL Kullanımı MySQL Nedir? Veritabanı ve Tablo Nedir

16 Mysql Tablo Tipleri Mysql Veri Tipleri Metin tipleri CHAR ve VARCHAR Farkı BLOB ve TEXT Alanlar Sayısal Veri Tipleri Tarih / Zaman Tipleri Küme Tipi Tablo Tasarlama, Key Ve Ġndex Kullanımı MYSQL i Komut Satırından Yönetmek Mysql i BaĢlatmak Komut Satırından Veritabanı OluĢturmak Komut Satırından Tablo OluĢturmak Komut Satırından Veri GiriĢi Komut Satırından Veri Sorgulama Komut satırından Bilgi DeğiĢikliği Yapmak Komut Satırından Kayıt Silmek SQL Dilinin Tarihçesi ĠliĢkisel Bir VTYS Ġçin 12 kural SQL Dilinin Bölümleri A. DDL (DATA DEFINITION LANGUAGE) KOMUTLARI B. DML (DATA MANIPULATION LANGUAGE) KOMUTLARI Veritabanı içindeki seçmek, değiģtirmek, güncellemek ve silmekle ilgili SQL deyimleridir C. DCL (DATA CONTROL LANGUAGE) KOMUTLARI SQL Komutları ve Örnekler A. DDL KOMUTLARI CREATE Komutu

17 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ı: ALTER DEYĠMĠ Daha önce yaratılmıģ nesnenin değiģtirilmesini sağlar. Örneği bir tablonun tasarımını değiģtirmek gibi ALTER TABLE ders01a ADD msn VARCHAR( 40 ) NOT NULL ; DROP DEYĠMĠ Bir nesnesin silinmesini sağlar DROP TABLE ders01a B. DML (DATA MANIPULATION LANGUAGE) KOMUTLARI SELECT DEYĠMĠ Temel Kullanımı: Parametrelerin Anlamları: AS Deyimi ile Alias Tanımlama Where Deyimi And ve Or ile Birden Fazla KoĢulun Kontrol Edilmesi 414 In ve Not In Deyimleri Like ve Not Like Deyimleri: Group By Deyimi Order By Deyimi: SELECT Ġçinde Aritmetik ĠĢlemler Aritmetik ĠĢlem Operatörleri Aggregerate fonksiyonları sum() fonksiyonu Bir sütunun toplamı

18 Bir sütuna göre bir select ifadesinin toplamını alır avg() fonksiyonu Bir sütunun ortalaması min() fonksiyonu Bir sütundaki en küçük değer 420 max() fonksiyonu Bir sütundaki en büyük değer count() fonksiyonu Bir sorguya göre dönen kayıt sayısı JOIN ĠġLEMĠ INNER JOIN LEFT JOIN RIGHT JOIN TABLOYU KENDĠSĠ ĠLE ĠLĠġKĠLENDĠRME (SELF JOIN) ĠÇĠÇE SELECT NESTED SELECTS UNION KULLANIMI EXISTS KULLANIMI C. DCL (DATA CONTROL LANGUAGE) DEYĠMLERĠ GRANT DEYİMİ GRANT CREATE DATABASE, CREATE TABLE TO ayģe SQL FONKSĠYONLARI Metinlerle ĠĢlem Yapan SQL Fonksiyonları ascii() fonksiyonu char() fonksiyonu concat() fonksiyonu length() fonksiyonu DönüĢtürme Fonksiyonları conv() fonksiyonu bin() fonksiyonu oct() fonksiyonu hex() fonksiyonu Tarihlerle ĠĢlem Yapan SQL Fonksiyonları

19 TABLOLARDA DEĞĠġĠKLĠK YAPMAK: INSERT Komutu UPDATE Komutu: DELETE DEYĠMĠ Kullanım biçimi: DELETE FROM tablo PHPMYADMIN PhpMyAdmin Kurulumu PhpMyAdmin'i ÇalıĢtırma ve Tanıma PhpMyAdmin ile Database OluĢturma PhpMyAdmin ile Tablo OluĢturma Bir Veritabanının Modelini Çıkarmak MySQL ve PHP PHP Dili Mysql Fonksiyonları Tablosu mysql_connect() deyimi(database bağlantısı) mysql_select_db() deyimi mysql_query() fonksiyonu- Mysql e sorgu göndermek mysql_numrows() fonksiyonu-sorgudan Dönen Kayıt Sayısını Bulmak mysql_result()-sorgudan Dönen Kayıtları ĠĢlemek449 Kayıtları Ekrana Listelemek DeğiĢkenleri Sorguların Ġçinde Kullanmak mysql_fetch_assoc() fonksiyonu- sorgu sonucundan bir satır almak mysql_error() fonksiyonu- MySQL hatalarını konrol etmek PHP ile Veritabanı OluĢturma Listeleme ve Silme. 453 PHP ile Tablo OluĢturma, Listeleme, Güncelleme ve Silme PHP ile Tablolara Veri GiriĢi, Listeleme, Güncelleme ve Silme

20 Örnek Uygulama: PHP ile ġifreli GiriĢ Sayfası Yapılması PHP ve GÜVENLĠK addslashes() fonksiyonu (metindeki zararlı olabilecek karakterleri etkisiz yapmak) stripslashes () fonksiyonu (etkisizleģtirilmiģ kodları ilk haline döndürmek) strip_tags () fonksiyonu (HTML etiketlerini metinden çıkarmak) PHP ile Header Kullanımı header() fonksiyonu-(baģlık bilgilerini kullanmak) Bir Nesne OluĢturalım PRATĠK BĠLGĠLER Resim Albümü: GiriĢ sayfası yapmak Sayfada Tarih Yazdırma CMS Sistemleri DĠĞER SÜRÜME DAĠR NOTLAR

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 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ı 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 gönderip yazıģmıģlığımızda oldu. Bu vesile ile bugünlerde çok sık kullanılan web sitesi olmayana kız vermiyorlar 21

22 lafını ilk kez ben bir imde 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. 22

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 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. 23

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 24

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ğlararası ağ anlamına gelen Ġngilizce Inter-networksnetwork: 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. 25

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 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 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. 26

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. 27

28 Kullanıcı örneğin 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. 28

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 29

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 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 30

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 31

32 Web Server olma özelliğini açık ara ile elinde tutmaktadır. Apache IIS Açık kaynak kodludur Bir çok iģletim sisteminde çalıģabilir (hatta bir çok sistemde zaten kurulu halde gelir) Tamamen ücretsizdir 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 32

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; 33

34 mail yazarsa? Bu yaptığınız basit ama ölümcül hata sonucu, forma girilen bu adrese, bilgisayar sisteminizdeki bütün password-parola dosyaları 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ı 34

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 35

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. 36

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. 37

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. 38

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. 39

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ı 40

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. 41

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 42

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. 43

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. 44

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 45

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> 46

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. 47

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 48

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ı" > 49

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 "> <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 :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. 50

51 <meta http-equiv = "refresh" content ="5; url= 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 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 "> 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 51

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 52

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"> 53

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 54

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> 55

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> 56

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> <OL>..</ OL> <LI> <UL>..</ UL> Kapatılana kadar her metin italik olarak yazılacaktır N 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. Liste elemanlarını belirtir 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 57

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> 58

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 59

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 # Siyah, #FFFFFF ise Beyaz rengi ifade eder. Renk Adı HEX kodu RGB kodu Black Red Gren Blue Yellow Aqua # rgb(0,0,0) #FF0000 rgb(255,0,0) #00FF00 rgb(0,255,0) #0000FF rgb(0,0,255) #FFFF00 rgb(255,255,0) #00FFFF rgb(0,255,255) Fuchsia #FF00FF rgb(255,0,255) 60

61 Gray White #C0C0C0 rgb(192,192,192) #FFFFFF rgb(255,255,255) Bunlar 16 renk temel renktir. 61

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 CC 0000FF CC 0033FF CC 0066FF CC 0099FF 00CC00 00CC33 00CC66 00CC99 00CCCC 00CCFF 00FF00 00FF33 00FF66 00FF99 00FFCC 00FFFF CC 3300FF CC 3333FF CC 3366FF CC 3399FF 33CC00 33CC33 33CC66 33CC99 33CCCC 33CCFF 62

63 33FF00 33FF33 33FF66 33FF99 33FFCC 33FFFF CC 6600FF CC 6633FF CC 6666FF CC 6699FF 66CC00 66CC33 66CC66 66CC99 66CCCC 66CCFF 66FF00 66FF33 66FF66 66FF99 66FFCC 66FFFF CC 9900FF CC 9933FF CC 9966FF CC 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 63

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 64

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> 65

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: 66

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> 67

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 kullanılır. Size kullanılır. : Çizginin geniģliğini ayarlamak için : Çizginin kalınlığını ayarlamak için 68

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> 69

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> ġ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 70

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 71

72 ıģığı hatırlayacaktır. Bu iģlem aynı etkiyi vermektedir. Bgcolor belirler. Height Width : Kayan yazıların arka plan rengini : Yazının kayacağı alanın yüksekliği : 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 72

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. 73

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> kullanımı gerekir. etiketinin 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. 74

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. 75

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> 76

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 Height Align olabilir. :Hücre geniģliği :Hücre yükselekliği :Metin yaslama yönü. Left, Right ve Center 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. 77

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 78

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. 79

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 & 80

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. 81

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ı 82

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ı 83

84 Alt bilgi telif vs alanı Üst Banner alanı Menü alanı Ġçerik alanı Alt bilgi telif vs alanı Üst Banner alanı Menü alanı 84 Kayan

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. 85

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. 86

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) 87

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 88 :Pencere boyutlarının sabit

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%> 89

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"> 90

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"> 91

92 <FRAME SRC="cer03.htm" NORESIZE SCROLLING="auto"> </FRAMESET> 92

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 93

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 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 94

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 95

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ģ 96

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=" 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=" 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. GeliĢtiriciler grubu </A> 97

98 Elektronik Posta Bağlantısı: Bazen kullanıcın bir linke tıkladığından hemen o linkteki bir adrese atmak üzere kullanıcının varsayılan e- mail programının açılması istenebilir. Örnek olarak <A HREF="mailto:webmaster@bizimweb.com.tr > 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 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 98

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=" 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=" adresi/sayfa adi.htm"><img src= dugme.jpg> </A> gibi. Tabii istenirse </A> metninden önce metin yazmakta mümkündür. <A HREF=" adresi/sayfa adi.htm"><img src= dugme.jpg> <br>link metni</a> gibi 99

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> 100

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ı sitesinin tasarlandığını, adresinde ise makaleler yayınlanacağını varsayalım. yazi1.html dosyasına link verirken yazilar/yazi1.html adresi kullanılabilir. Ancak istenirse 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 101

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. 102

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> 103

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ı Ģ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 104

105 dosyası bu bilgileri MYSQL veritabanına kayıt ediyor olsaydı ve bizde adres çubuğundan 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. 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. 105

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. 106

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 TextBo x Passwo <INPUT TYPE="text"> <INPUT TYPE="password" 107 Kullanıcının tek satırdan oluģan metin girmesi için kullanılır. Yukarıdaki gibi string ifade giriģi

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. CheckB ox <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 108

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 109

110 komut düğmesi oluģturur TextAre a <TEXTAREA> Çok satırlı metinlerin girilmesine imkan sağlayan bir kontroldür. Combo Box ListBox <SELECT size="1"> <SELECT size="n"> Kullanıcıya açılan bir listeden hazır seçenekler sunar. 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 110

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. 111

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 112

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 113

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 114

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: 115

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 116

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" <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> 117

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 118

119 ı = %FD Ġ = %DD ğ = %F0 Ğ = %D0 Ģ = %FE ġ = %DE ç = %E7 Ç = %C7 % = %25 & = %26 [ = +%5B ] = %5D { = %7B } = %7D? = %3F = = %3D 119

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 120

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) 121

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. 122

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 123

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> 124

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 125

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. 126

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 } 127

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 } 128

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 129

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 { Sayfamdaki linklerin Yazıtipi font-family:arial; arial, boyutu 11 punto, rengi font-size:11pt; mavi olsun ve altı çizili olmasın. color:blue; text-decoration:none; } a:hover{ Üzerine gelindiğinde linklerin font-family:arial; Yazıtipi arial,boyutu 11 punto, font-size:11pt; rengi kırmızı olsun ve Altı çizili color:red; olmasın. text-decoration:none; } a:visited{ font-family: font-size:11pt; color:grey; Ziyaret edilen linklerin ise arial; Yazıtipi arial, boyutu 11 punto, rengi gri olsun ayrıca altı çizili olsun. 130

131 textdecoration: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:firstletter>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: 131

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 132

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 fontfamily Tahoma, Arial Yazı tipini belirler.(arial, Verdana gibi.) 133

134 font-style Normal italic oblique Yazının normal veya sağa eğik olmasını sağlar. fontvariant 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. fontweight Normal bold bolder lighter Yazının belirler. kalınlık-inceliğini font-size METĠN Word Spacing Absolute-size (xxsmall x-small small medium large x-large xx-large) relative-size (larger smaller) px, pt, % normal <boyut:px vb.> Yazının büyüklüğünü Sözcük aralığı 134

135 Letter Spacing Text Decoratio n Vertical Alignmen t Text Transfor mation Text Alignmen t Text Indentati on Line Height RENK VE ARKAPLA normal <boyut:px vb.> None underline overline linethrough blink baseline sub super top texttop middle bottom textbottom Yüzde:200% vb. none capitalize uppercase lowercase Left right center justify Boyut Yüzde Normal <sayı> <boyut> <yüzde> 135 Harf aralığı Metin süsleme Dikey hizalama Metin dönüģtürme Metin hizalama Metin girintisi Satır yüksekliği

136 N Color Renk adı veya RGB değeri (red veya #FF0000 gibi) Renk Backgrou nd Color Backgrou nd Image Backgrou nd Repeat Backgrou nd Attachme nt Backgrou nd Position KUTU ÖZELLĠK Renk adı RGB değeri (red veya #FF0000 gibi) transparent url(images/resima di.gif) repeat repeat-x repeat-y norepeat scroll fixed yüzde boyut top center bottom left center right Arka plan rengi Arka plana yerleģtirilecek resmin adresi Arka plan resminin hangi yönde tekrarlanacağını belirler. Sayfa kaydırma çubuğuyla hareket ettirildiğinde zeminin de hareket edip etmeyeceğini belirler. Zemindeki resmin sayfa üzerinde istenilen yere yerleģtirilmesini sağlar. 136

137 LERĠ Magrin Sayısal değer. Nesnenin dıģındaki nesnelere olan aralığını belirler. Padding Sayısal değer. Doldurma Border Width Border Color Border Style Sayısal değer. Renk adı RGB değeri none dotted dashed solid double groove ridge inset outset Kenarlık geniģliği (kalınlığı) Kenarlık rengi Kenarlık stili Border border-width border-style border-color Width boyut yüzde auto Kenarlık kalınlık, style ve rengi. GeniĢlik Height boyut auto Yükseklik LĠSTE ÖZELLĠK LERĠ 137

138 List Style Type List Style Image List Style Position disc circle square decimal lower-roman upper-roman lower-alpha upper-alpha none adres none (liststyle-image: url(images/maddei mi.gif) gibi.) inside outside Listenin harflerden mi yoksa sayılardan mı oluģacağını belirler. Liste simgesi olarak resim kullanılmasını sağlar. 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 138

139 Font Özellikleri Ġçin CSS Kullanımı: FONT-FAMILY (Yazıtipi ailesi): 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.) Ģ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 139

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

141 300 ince çizgili harf, kalın çizgili harf, ç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 } 141

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: # } 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 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( } BODY { BACKGROUND: white url(/images/zemin1.gif } 142

143 P { BACKGROUND: black url(/images/zemin1.gif norepeat 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 } 143

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% } 144

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ı 145

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: 146

147 <SPAN STYLE="position:static; backgroundcolor:#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: 147

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. 148

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 149

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 } 150

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" " 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" " 151

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" " 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 152

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. 153

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ı. 154

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ı 155

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ü 156

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 157

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 nerdeyse adı bile unutulmuģ durumda, ilk arama motoru 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 158

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 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 159

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. 160

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. 161

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 civarında web sunucuya yüklü olan PHP, bu süre içinde bu sayıyı web sunucuya çıkarmıģtı. 162

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ı 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 163

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) 164

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. 165

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. 166

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. 167

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) 168

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. 169

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. 170

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. 3 Sunucu 2 HTML 4 HTML 1 Tarayıcı 2 PHP 6 HTML 3 Sunucu 5 HTML 4 PHP 1 Tarayıcı 3 Sunucu 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! 171

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 172

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 173

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 veriyö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 174

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 php_exif.dll DeğiĢik tipte protokol kullanan istemci ve sunucular (ftp,http,https,gopher vs) ile bağlantı kurabilmek için Exif bilgileri ile çalıģma (resim meta verileri) 175

176 php_fdf.dll php_gd2.dll Form Data Format eklentisi. PDF dosyalarında formlarla çalıģma 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ı 176

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 php_snmp.dll php_soap.dll php_sockets.dll php_xmlrpc.dll php_xsl.dll php_dbase.dll php_interbase.dll SSL protolü için SNMP protokolü (Simple Network Managemet Protocol) Web servisleri için Soket bağlantılar için XML ve RPC kütüphanesi. XML- RPC sunucu ve istemcileri geliģtirmek için gerekli fonksiyonlar XML dosyalarına çıkıģ formatı tanımlamak için gerekli fonksiyonlar Dbase VTYS bağlantısı Interbase VTYS bağlantısı 177

178 php_msql.dll php_mssql.dll php_mysql.dll php_mysqli.dll php_oci8.dll php_pgsql.dll php_sqlite.dll php_sybase_ct.dll php_pdo.dll php_pdo_firebird.dll php_pdo_mssql.dll php_pdo_mysql.dll php_pdo_oci.dll php_pdo_oci8.dll php_pdo_odbc.dll Msql VTYS bağlantısı Mssql VTYS bağlantısı Mysql VTYS bağlantısı Mysql VTYS bağlantısı (Nesne eriģimlidir) Oracle VTYS bağlantısı (Oracle Call Interface 8) Postgresql VTYS bağlantısı Sqlite VTYS bağlantısı Sybase VTYS bağlantısı PHP Data Object bağlantılarının kullanımı için (Database Abstraction Layer kütüphanesi) Firebird PDO bağlantısı Mssql PDO bağlantısı Mysql PDO bağlantısı Oracle PDO bağlantısı Oracle PDO bağlantısı ODBC PDO bağlantısı 178

179 php_pdo_pgsql.dll php_pdo_sqlite.dll Postgres PDO bağlantısı 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, 179

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 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. 180

181 Uniform Server Benim kiģisel olarak tercih ettiğim WAMP paketi budur. 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. 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ı. 181

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?> </html> echo ("Merhaba Dünya!"); 182

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. 183

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 $1abc $_adi $adi soyadi Doğru YanlıĢ Doğru YanlıĢ 184

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"> 185

186 </SCRIPT> </HTML> print ("Merhaba Dünya!"); 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 186

187 ?> </H1> </B> </CENTER> </BODY> </HTML> print "Merhaba Dünya!"; 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: Çoksatı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.. 187

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> 188

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 ; 189

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 ;?> 190

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 191

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: 192

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" 193

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"; 194

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: 195

196 Tamsayı (Integer): 5,124, 9834 gibi ( ile 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. 196

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. 197

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. 198

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. <?php Dizi çok boyutlu ise bunları tırnak içine alarak yazmak gerekir. $a[0] = "abc"; $a[1] = "def"; $a[1] = $f; # tek boyutlu tanımlama $a[1][0] = $f; # iki boyutlu tanımlama?> 199

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"; } } 200

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 201

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

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ı 203

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. 204

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" 205

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: 206

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 = $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. 207

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 208

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 >= büyükse veya eģitse $a <= 25 $a >= 25 YanlıĢ/False 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. 209

210 Motor 70 (yanlıģ/false) Motor 79 (doğru/true) - Trafik 70 Ġlkyardım 69 = kalır - Trafik 80 Ġlkyardım 90 = geçer 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 Or Veya sol veya sağ doğru && Ve sol ve sağ doğru And Ve sol ve sağ doğru Doğru yanlıģ = doğru Doğru yanlıģ = doğru Doğru yanlıģ = yanlıģ Doğru yanlıģ = yanlıģ Xor ġartlıveya Sadece sol veya sağ doğru Doğru yanlıģ = 210

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.! 211

212 2. ++ ve / * % < <= => > 6. == === = 7. && = += -= /= %=.= 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 212

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. 213

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!"); } 214

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 "> <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):?> 215

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. 216

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"; } } } }?> 217

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 218

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 219

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 220

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 221

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.?> } 222

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 ++; sonsuz döngüye girer. }?> // bu iģlem yapılmazsa program 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. 223

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. 224

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 225

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>"); 226

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"); 227

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; 228

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ı "; 229

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ı <?php }?> 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ı ġ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 230

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: 231

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 232

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 233

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. 234

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;?> 235

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 236

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 ); } 237

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 238

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 = ""; echo empty($isim);?> // 1 yazacak isim boģ 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>"); } 239

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. 240

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 241 $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

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 : "; 242 print "$str1<br>"; print("türü : "); print gettype( $str1 ) ; //alfanümerik/string

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 : "; 243 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.

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 "<br>"; print "<br>"; print "$pi<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) 244

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. 245

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: 246

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); 247

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); 248

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. 249

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 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 yada yada Aralık yazılması durumunu merak etmeye gerek yoktur. Tarih zamanlarla milisaniye bazında iģlem yapabiliriz. 250

251 Bir gün 24*60*60 saniye olduğundan 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 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 251

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 :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. 252

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 d a ile aynıdır ancak sonucu büyük harfle yazdırılmasını sağlar. Ġki haneli gün sayısı, tek haneli günlerin önüne sıfır konur AM-PM "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) H 24 saatlik sistemde saat (tek haneli sayıların önüne sıfır konulur) g 12 saatlik sistemde tek haneli saatlerin önüne sıfır konmadan saat

254 G 24 saatlik sistemde tek haneli saatlerin önüne sıfır konmadan saat 0 23 i Dakika 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) L Artık yıl olup olmadığına iliģkin Boolean (doğru/yanlıģ) değiģken. Artık yıl ise 1, değilse 0. m Tek hanelilerin önüne sıfır konarak ay sıra numarası Cuma 1, n Tek hanelilerin önüne sıfır konmadan ay sıra numarası 1 12 M KısaltılmıĢ ay adı Ock s Saniye 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ı

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) B Swatch internet zamanı C ISO 8601 tarih zaman bölge ayarı T09: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 : T Sunucu için bölge alanı GMT,CET,EST U Unix zaman pulu W ISO-8601 formatında haftanın numarası 1-52 Z Bölge ayarı ofseti saniye cinsinden to 43200

256 <?php print date("h:i"). "<br>"; print "dünün tarihi ". date("l", time() ). "<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. 256

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ığı 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. 257

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")]." " 258

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 January günün adı ayın adı Unix sistemlerinde Epoch biçiminde zaman bilgisi $simdi = getdate() 259

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( , 3); // $e = round( , 4); //

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 261

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. 262

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. 263

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); // print pow(10,2); // 100 print pow(10,3); // 1000 print pow(10,4); // print pow(-10, 4); // 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. 264

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); 265

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. 266

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)); 267

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! 268

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 269

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: 270

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); 271

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 272

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 = " $yeni = strstr($str, "www"); // 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 273

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. 274

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 alınarak metin parçalara ayrılır. $str1=implode(,,$bolunmus); esas //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. 275

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. 276

277 <?php $sayi = ; $a = number_format($sayi); //12,346 $b = number_format($sayi, 2); //12, $c = number_format($sayi, 3); //12, $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 "; 277

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]]) 278

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. 279

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 c d f o s DeğiĢken tamsayı olarak iģlem görür ve ikili sayı olarak döner. DeğiĢken tamsayı olarak iģlem görür ve ASCII değerinin karģılığı olan karakter olarak döner. DeğiĢken tamsayı olarak iģlem görür ve ondalık sayı olarak döner. DeğiĢken kesirli sayı olarak iģlem görür ve kesirli sayı olarak döner. DeğiĢken tamsayı olarak iģlem görür ve sekiz-tabanlı (octal) sayı olarak döner. 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). 280

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); "<br>"; 281 echo printf("150 metin olarak: %s", $sayi); echo "<br>"; printf("%% ise yüzde iģareti yazdırır"); echo "<br>"; $sayi2= ; $bicimli= number_format($sayi2, 2). "\n";

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 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( "%' s", $degisken); 282

283 ?> Burada "%' s" Ģ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) $ 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 283

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?> 284

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 285

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 f642faa3d88a9c2f162e68a79bffd6ba7 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 286

287 bunu görelim; 32 bye demek 128 bitlik Ģifreleme demektir. Peki bu algoritme bu durumda kaç değer üretebilir kadar yani e+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 287

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ģ 288

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 /[a-z]abc[0-9][0-9]/ abc EĢit değil EĢit /[a-z]abc[0-9][0-9]/ Abc99 EĢit Değil. Büyük küçük harf sorunu var

290 /[a-z]abc[0-9][0-9]/i Abc 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:

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}/ EĢit 3 rakam, bir tire(-) ve 4 rakam daha (telefon numarası gibi) /[0-9]{3}-[0-9]{2}-[0-9]{2}/ 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 291

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] \cx Geri (Backspace) karakterini bulur. 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 292

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 293

294 [[:lower:]] Herhangi bir küçük harf [[:punc:]] Herhangi bir noktalama iģareti [[:xdigit:]] Herhangi bir Hexadecimal karakter. [0-9afA-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. 294

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); 295

296 eregi() fonksiyonu (dizilim arama) ÇalıĢması yukardaki fonksiyon gibidir ancak büyük küçük harf ayrımı yapmaz. ġimdi bir örnekler adresinin doğrulamasını yapalım. Ġçinde en az 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, $ )) {?> } else { $hata = " 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 adresi girilen 296

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. 297

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] 298

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) { 299

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) { 300

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 ; 301

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 302

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; yetkisi alınıyor 303 // global değere ulaşım

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. 304

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); 305

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);?> 306

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"; } 307

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]; }?> 308

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ı 309

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 $_POST $_GET 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 ile gönderilen değerlerin tutulduğu dizi ($HTTP_GET_VARS) yerine bu dizi kullanılmalı) 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 $_FILES 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. Upload edilen tüm dosyaların tutulduğu 310

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 311

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. 312

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. 313

314 <HTML> <HEAD> <TITLE>Form</TITLE> <meta http-equiv="content-type" content="text/html; charset=iso "> <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- <INPUT TYPE=TEXT" NAME=" "><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> <b>$ </b></p>\n\n");?> 314

315 Kodu çalıģtırdığımızda aslında tüm bilgiler iletilmesine rağmen ekrana sadece Merhaba 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]; $ =$_GET[ ]; print ("Merhaba <b>$adsoyad</b>\n\n"); print ("<p> <b>$ </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. 315

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]; $ =$_POST[ ]; print ("Merhaba <b>$adsoyad</b>\n\n"); print ("<p> <b>$ </b></p>\n\n");?> 316

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 " /> <meta name="description" content="csv" /> <meta name="keywords" content="csv" /> </head> <body> <? 317

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="fontcolor:red;"> Bilgi Alma</td></tr> <tr><td> Adı</td> <td><input type="text" name="adsoyad"></td></tr> <tr><td> </td> <td><input type="text" name=" "></td></tr> <tr><td> <input type="submit" value ="Gönder"></td></tr> </table> </form> 318

319 <?} else : $adsoyad=$_get['adsoyad']; $ =$_get[' ']; echo "Merhaba $adsoyad <br> $ "; 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. 319

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 " /> <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 320

321 if (!$_POST): {?> <table border=1> <Form Action="<?$PHP_SELF?>" Method="POST"> <tr><td colspan=2 align=center style="fontcolor:red;"> Bilgi Alma</td></tr> <tr><td> Adı</td> <td><input type="text" name="adsoyad"></td></tr> <tr><td> </td> <td><input type="text" name=" "></td></tr> <tr><td> <input type="submit" value ="Gönder"></td></tr> </table> </form> <?} else : $adsoyad=$_post['adsoyad']; $ =$_post[' ']; echo "Merhaba $adsoyad <br> $ "; endif;?> </body> 321

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 "> <body> <?php if($_post) { $islem = $_POST['islem']; $sayi1 = $_POST['ilksayi']; $sayi2 = $_POST['ikincisayi']; switch($islem) { case "-": $sonuc = $sayi1-$sayi2; 322

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> 323

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ı). 324

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" 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ı, & 325

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("deneme@abc.org.tr", "Deneme", "Merhaba\nBu bir denemedir\nhoģçakalın."); Ek baģlıkları da yazarsak: Mail ("xyz@abc.org.tr", "Deneme", "Merhaba\nBu bir denemedir\nhoģçakalın.", "From: xyz@abc.org.tr\n, Reply-To: postmaster@abc.org.tr"); Ek BaĢlıkların tümünün daima çift tırnak içinde olduğuna 326

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 xyz@deneme.com 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 (xyz@deneme.com) 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: 327

328 <html> <head> <title>yorum Gönderme Formu</title> <meta http-equiv="content-type" content="text/html; charset=iso "> <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> 328

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" <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> 329

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:def@deneme.com\n"; $extra.= "Content-Type:text/plain; charset=\"iso \"\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ı 330

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 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:def@deneme.com\n"; $extra.= "Content-Type:text/plain; charset=\"iso \"\n";?> <html> $extra.= "Content-Transfer-Encoding: 8bit\n"; mail($kime, $konu, $mesaj, $extra); 331

332 <head> <meta http-equiv="content-type" content="text/html; charset=iso "> <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) 332

333 ;for win32 only ( 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 \"> </HEAD> 333

334 <?php $dizin = "files/"; $url = " 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 src=\"$url/$gonder_name\"><p>\n\n"); }?> } </BODY> 334 ("<img <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>

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/"; 335

336 $url = " $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 336

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. 337

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 yerine 01/01/2007 gibi.. Yada saat için 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. 338

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 339

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 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. 340

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!"); 341

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("."); 342

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++; 343

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); 344

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" ) ) 345

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" ); 346

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 347

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 348

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!");?> 349

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ı ); 350

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. 351

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. 352

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') ) ) { 353

354 print ("Dosya açıldı!<br>"); } else { print ("Dosya açılamadı!"); } while (!feof ($dosya)) } { fclose ($dosya);?> $satir = fgets ( $dosya, 1024 ) ; print ("$satir<br>"); Ö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 354

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ı!"); } 355

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" ) ; 356

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ı 357

358 parametre olarak vermek gerekir. Bu fonksiyon ile kullanabileceğimiz kilit türü parametreleri Ģunlardır: 1:Paylaşım imkan verir Diğer proseslerin dosyayı paylaģmalarına 2:Tam Diğer proseslerin dosya ile iģlem yapmasına engel olur 3:Serbest Örnek: <?php $adi = "/www/dosya.txt"; Dosyanın 1 veya 2 olan kilidini kaldırır $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. 358

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 );?> CSV Dosya Fonksiyonları 359 H", $islemtarihi 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

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"; 360

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'); 361

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> 362

363 <head> <title>csv arama</title> <META Http-Equiv="Pragma" Content="no-cache"> <meta http-equiv="content-type" content="text/html; charset=iso " /> <meta name="keywords" content="csv" /> </head> <body> <? if (!$_POST): {?> <Form Action="<?$PHP_SELF?>" Method="POST"> <tr><td colspan=2 align=center style="fontcolor: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 363

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) { 364

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. 365

366 Rehberin yine CSV formatında ve hazır olduğunu varsayalım; aģağıdaki örnek veriler ıģığında Ahmet; Mehmet; ö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 " /> <meta name="keywords" content="csv" /> </head> <body> <? if (!$_POST): {?> <Form Action="<?$PHP_SELF?>" Method="POST"> <tr><td colspan=2 align=center style="fontcolor:red;"> Telefon Rehberi </td></tr> <tr><td> Ġsim giriniz</td> <td><input type="text" name="isim"></td></tr> 366

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) { 367

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 368

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 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"> 369

370 <meta http-equiv="content-type" content="text/html; charset=iso " /> <meta name="keywords" content="csv" /> </head> <body> <? if (!$_POST): {?> <Form Action="<?$PHP_SELF?>" Method="POST"> <tr><td colspan=2 align=center style="fontcolor: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) { 370

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; 371

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) 372

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 '> <meta http-equiv='content-type' content='text/html; charset=windows-1254'> </HEAD> <BODY> <FORM METHOD="POST"> ACTION="<?$PHP_SELF;?>" <P><font size='3' face='verdana, Arial, Helvetica'> Defteri imzalamadan okumak için <a href='zd1mesaj.php'> burayı tıklayın</a></font></p> 373

374 <P><font size='3' face='arial, Helvetica'> Adınız, Soyadınız: <br><input TYPE="TEXT" NAME="adi"><BR> Adresiniz: <br><input TYPE="TEXT" NAME="adres"><BR> Mesajınız:<BR> <TEXTAREA NAME="mesaj" ROWS=10 COLS=30></TEXTAREA> <? } else {?> <BR><BR><BR> <INPUT TYPE="SUBMIT" VALUE="Gönder"> <INPUT TYPE="RESET" VALUE="Sıfırla"> </FORM> </BODY> </HTML> <HTML> <HEAD> <TITLE>PHP'de Ziyaretçi Defteri</TITLE> <meta http-equiv='content-type' content='text/html; charset=iso '> 374

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")) { else { $baglanti = fopen($txtdosya,'a'); } $baglanti = fopen($txtdosya,'w'); } foreach ($_POST as $key=>$deger ) { $deger<br>"; $buyugecevir = strtoupper($key); print ("$buyugecevir: $deger<br>"); $metin = "$buyugecevir: fputs($baglanti, $metin); } fputs($baglanti, date("d d M Y h:i:s")); fputs($baglanti, "<br>\n"); 375

376 fputs($baglanti, "<center><img src='nokta.gif' width=100% height=1 border=0></center>\n");?> <HTML> <HEAD> fclose($baglanti); <TITLE>PHP'de Misafir defteri</title> <meta http-equiv='"content-type' content='text/html; charset=iso '> <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> 376

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 377

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 378

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 değer,time()+istenilen sure); 379 adı, saklanacak

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."; 380

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); 381

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. 382

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();?> 383

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. 384

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 385

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 386

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 Ġsmail Kutluay Tuba ġahin 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 387

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( ) VARCHAR( ) TINYTEXT TEXT BLOB MEDIUMTEXT MEDIUMBLOB LONGTEXT LONGBLOB 0 ile 255 karakter uzunlukta sabit kayıt boyutlu metin alanı. 0 ile 255 karakter uzunlukta değiģken kayıt boyutlu metin alanı. Maksimum 255 karakterlik metin alanı Maksimum karakterlik metin alanı Maksimum karakterlik metin alanı Maksimum karakterlik metin alanı Maksimum karakterlik metin alanı Maksimum karakterlik metin alanı Maksimum 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 388

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. 389

390 TINYINT( ) -128 ile 127 arası yada 0 ile 255 arası iģaretsiz (UNSIGNED) SMALLINT( ) ile arası yada 0 ile iģaretsiz MEDIUMINT( ) ile arası yada 0 ile arası iģaretsiz INT( ) ile arası yada 0 ile arası iģaretsiz BIGINT( ) ile arası yada FLOAT DOUBLE(, ) 0 ile arası iģaretsiz Küçük boyutlu ondalıklı sayı 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. 390

391 DATE DATETIME TIMESTAMP TIME Küme Tipi ENUM ( ) YYYY-AA-GG YYYY-AA-GG SS:DD:NN YYYYAAGGSSDDNN SS:DD:NN. ENUMERATION (numaralandırma) numarayı veri olarak depolar SET tipidir.sütun gelen Enum ile aynıdır ancak veri uygun elemanların bir kaçından olauģabilir. ENUM('y','n') Enum listelerinde 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. 391

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 392

393 10 karakter uzunlukta. Tabloda 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 393

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. 394

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)) ; 395

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. 396

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" ; 397

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. 398

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 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 diyelimdediğimiz iliģkisel veritabanları vardır. DBMS (VTYS) ile 399

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 400

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 401

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 402

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ı. 403

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 404

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. 405

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), 406

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, 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. 407

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] 408

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, kayıttan sonraki ilk 10 kaydı getir 409

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, ,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. 410

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. 411

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 412

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 Liste String karģılaģtırma Bilinmeyen değerler KoĢulların birleģtirilmesi (=, >, <, >=, <>,!=,!<,!> BETWEEN ve NOT BETWEEN IN ve NOT IN LIKE ve NOT LIKE IS NULL ve IS NOT NULL AND, OR Tersini alma NOT ÖRNEK: SELECT * FROM ders01a WHERE id =1 SELECT * FROM ders01a WHERE adi = ALİ 413

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 ) 414

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% tablosundaki adı A ile baģlayanlar // Eleman Select * from eleman where adi like AL% tablosundaki adı Al ile baģlayanlar // Eleman Select * from eleman where adi like %A% adınındaki herhangi bir harf A olanlar // Tabloda 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 415

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. 416

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. 417

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: + - Çıkarma / Bölme * Çarpma Toplama 418

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 419

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 () 420

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. 421

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. 422

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ı 423

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; 424

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 425

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 426

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.. ) 427

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. 428

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(' ') =>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. 429

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 430

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, ali@rizeli.com ); 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 431

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; 432

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 < ; 433

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. 434

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 435

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, 436

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. 437

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

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. 439

440 CREATE TABLE ogrenci ( adi VARCHAR (20) not null, soyadi VARCHAR (20) not null, 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. 440

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] 441

çindekiler 01. Kurulum

çindekiler 01. Kurulum çindekiler 01. Kurulum 1 Niçin PHP Kullanmal y z? 1 Gerekli Programlar n Temin Edilmesi 2 PHP yi Temin Edelim 3 APACHE in Temin Edilmesi 3 MySQL in Temin Edilmesi 3 PHPMyAdmin in Temin Edilmesi 4 PHPed

Detaylı

Web Programlama Kursu

Web Programlama Kursu Web Programlama Kursu Bu kurs ne değildir? Neyi amaç edinmiştir? Bilgisayar Programcısı? Web Tasarımcısı? Web Programcısı? Neler öğreneceğiz? Kurs sonunda neler yapılabileceğiz? Örnek siteler Örnek Projeler

Detaylı

2-Hafta Temel İşlemler

2-Hafta Temel İşlemler 2-Hafta Temel İşlemler * Html Komutlarının Yapısı * Açıklamalar * Htm Sayfasının Oluşturulması * Temel Html Komutları * Html Sayfalarının Düzenlenmesi * Html Sayfalarının İncelenmesi Html Komutlarının

Detaylı

WEB TASARIMI. Đnternet Nedir?

WEB TASARIMI. Đnternet Nedir? ĐÇĐNDEKĐLER İÇİNDEKİLER... 1 WEB TASARIMI... 2 İnternet Nedir?... 2 HTML (Hypertext Markup Language)... 4 (Hareketli Metin İşaretleme Dili)... 4 KLASÖR VE DOSYA İSİMLERİNDE... 5 STANDART TAKILAR... 5

Detaylı

Dersin Konusu ve Amaçları: Ders P lanı: Bölüm 1: Bilgi Teknolojilerinde Temel Kavramlar

Dersin Konusu ve Amaçları: Ders P lanı: Bölüm 1: Bilgi Teknolojilerinde Temel Kavramlar Bilgi Teknolojileri ve Uygulamalarına Giriş Dersin Konusu ve Amaçları: Bu dersin amacı daha önce bilgisayar ve bilgi teknolojileri alanında herhangi bir bilgi ve/veya deneyime sahip olmayan öğrenciye bilgi

Detaylı

ÖĞRENME FAALĠYETĠ 3 ÖĞRENME FAALĠYETĠ 3

ÖĞRENME FAALĠYETĠ 3 ÖĞRENME FAALĠYETĠ 3 ÖĞRENME FAALĠYETĠ 3 AMAÇ ÖĞRENME FAALĠYETĠ 3 Bu öğrenme faaliyetiyle elektronik posta hesabınızı, e-posta yönetim yazılımlarını kullanarak yönetmeyi öğrenebileceksiniz. ARAġTIRMA Ġnternet ortamında e-posta

Detaylı

BMT 202 Web Tasarımı Bahar Dönemi. Yük. Müh. Köksal GÜNDOĞDU 1

BMT 202 Web Tasarımı Bahar Dönemi. Yük. Müh. Köksal GÜNDOĞDU 1 BMT 202 Web Tasarımı 2016 2017 Bahar Dönemi Yük. Müh. Köksal GÜNDOĞDU 1 Elektrik Elektronik ve Bilgisayar Yük. Müh. Köksal Gündoğdu http://www.ekargemuhendislik.com/k.gundogdu.html Ödevler, duyurular,

Detaylı

2. HTML Temel Etiketleri

2. HTML Temel Etiketleri 2. HTML Temel Etiketleri Bu bölümü bitirdiğinizde, HTML ve etiket kavramlarının ne olduğunu, HTML komut yapısını, Örnek bir HTML dosyasının nasıl oluşturulduğunu, Temel HTML etiketlerinin neler olduğunu,

Detaylı

Html temelleri. Ders 4

Html temelleri. Ders 4 Html temelleri Ders 4 1 Giriş World Wide Web (Kısaca web) uygun protokoller kullanarak haberleşen yazılımların çalıştırıldığı internet üzerindeki sistemlerin bir koleksiyonudur. Çoğu sistem gününüzde en

Detaylı

1.PROGRAMLAMAYA GİRİŞ

1.PROGRAMLAMAYA GİRİŞ 1.PROGRAMLAMAYA GİRİŞ Bilindiği gibi internet üzerindeki statik web sayfaları ziyaretçinin interaktif olarak web sayfasını kullanmasına olanak vermemektedir. Bu yüzden etkileşimli web sayfaları oluşturmak

Detaylı

Web Formlar ve Sayfalar Arasında Bilgi Gönderme. BATML İnternet Programcılığı 1

Web Formlar ve Sayfalar Arasında Bilgi Gönderme. BATML İnternet Programcılığı 1 Web Formlar ve Sayfalar Arasında Bilgi Gönderme BATML İnternet Programcılığı 1 Bazı web sitelerinde sayfalar arasında bilgi veya değişken göndermek gerekebilir. Gönderilen bu bilgi kullanıcı adı ve şifre

Detaylı

1.1 Web Kavramlar. 1.1.1.3 URL terimini tanımlayınız ve anlayınız.

1.1 Web Kavramlar. 1.1.1.3 URL terimini tanımlayınız ve anlayınız. 1.1 Web Kavramlar 117 Anahtar 7erim/er 1.1.1.1 Web ve Internet terimlerini tanımlayınız. Her birinin anahtar özelliklerini tanımlayınız. Web bir Internet hizmetidir. Web Internet üzerinde bağlantılı html

Detaylı

Bu işleçlerin dışında, aşağıda belirtilen karşılaştırma işleçlerinden de yararlanılır.

Bu işleçlerin dışında, aşağıda belirtilen karşılaştırma işleçlerinden de yararlanılır. 18 SQL SORGU DİLİ SQL (Structured Query Language) yapısal sorgu dili, veritabanı yönetim sistemlerinin standart programlama dili olarak bilinmektedir. SQL dilinin Access içinde sorgu pencerelerinde veya

Detaylı

ÖĞRENME-ÖĞRETME YÖNTEM VE TEKNİKLERİ. gösterip yaptırma, uygulamalı çalışma. Anlatım, soru-cevap, gösterip yaptırma, uygulamalı çalışma.

ÖĞRENME-ÖĞRETME YÖNTEM VE TEKNİKLERİ. gösterip yaptırma, uygulamalı çalışma. Anlatım, soru-cevap, gösterip yaptırma, uygulamalı çalışma. KASIM EKİM EYLÜL AY 02.11.2009 06.11.2009 26.10.2009 0.10.2009 19.10.2009 2.10.2009 12.10.2009 16.10.2009 05.10.2009 09.10.2009 28.09.2009 02.10.2009 24.09.2009 25.09.2009 09.11.2009 1.11.2009 MODÜL: İNTERNET

Detaylı

SQL Komutları (2) Uzm. Murat YAZICI

SQL Komutları (2) Uzm. Murat YAZICI SQL Komutları (2) Uzm. Murat YAZICI Sıralama Sıralama işlemi için SELECT ifadesinde ORDER BY kullanılır. Bu ifadede ASC kelimesi kullanılırsa sıralama küçükten büyüğe doğru (A-Z), DESC kullanılırsa büyükten

Detaylı

Web Site Tasarımı (Html-Css) (SD0139) Murat KARA 2017

Web Site Tasarımı (Html-Css) (SD0139) Murat KARA 2017 Web Site Tasarımı (Html-Css) (SD0139) Murat KARA 2017 1. Hafta TANIŞMA, İNTERNET, HTML İçerik (Hafta/Konu) 1. Tanışma, İnternet Nedir, Html Nedir, Temel Terim ve Kavramlar 2. İnternete erişim ve İnternet

Detaylı

İÇERİK YÖNETİM SİSTEMİ KULLANMA KILAVUZU

İÇERİK YÖNETİM SİSTEMİ KULLANMA KILAVUZU T.C. SÜLEYMAN DEMĠREL ÜNĠVERSĠTESĠ BĠLGĠ ĠġLEM DAĠRE BAġKANLIĞI İÇERİK YÖNETİM SİSTEMİ KULLANMA KILAVUZU Hazırlayanlar Mahmut ÖZDEMĠR Sezgin SERPEN Yönetim Paneli Kullanımı Sistemin yönetim paneline giriģ

Detaylı

İnternet Programcılığı

İnternet Programcılığı 1 PHP le Ver tabanı İşlemler Yaptığımız web sitelerinin daha kullanışlı olması için veritabanı sistemleri ile bağlantı kurup ihtiyaca göre verileri okuyup yazmasını isteriz. 1.1 Veritabanı Nedir? Veritabanı

Detaylı

4 Front Page Sayfası Özellikleri

4 Front Page Sayfası Özellikleri 4 Front Page Sayfası Özellikleri İsterseniz Frontpage penceresinin sağ tarafından, isterseniz araç çubuklarından faydalanarak yeni bir sayfa açın. Frontpage te çeşitli sayfa şablonları bulunmaktadır. Ancak

Detaylı

İSMET AKTAR ANADOLU TEKNİK LİSESİ BİLİŞİM TEKNOLOJİLERİ ALANI WEB PROGRAMCILIĞI DALI

İSMET AKTAR ANADOLU TEKNİK LİSESİ BİLİŞİM TEKNOLOJİLERİ ALANI WEB PROGRAMCILIĞI DALI İSMET AKTAR ANADOLU TEKNİK LİSESİ BİLİŞİM TEKNOLOJİLERİ ALANI WEB PROGRAMCILIĞI DALI WEB TASARIMI VE PROGRAMLAMA DERSİ TEMEL KAVRAMLAR Bilişim Teknolojileri Web Tasarımı ve Programlama Dersi Durhan GABRALI

Detaylı

Program AkıĢ Kontrol Yapıları

Program AkıĢ Kontrol Yapıları C PROGRAMLAMA Program AkıĢ Kontrol Yapıları Normal Ģartlarda C dilinde bir programın çalıģması, komutların yukarıdan aģağıya doğru ve sırasıyla iģletilmesiyle gerçekleģtirilir. Ancak bazen problemin çözümü,

Detaylı

Web Tasarımının Temelleri

Web Tasarımının Temelleri 1. Hafta Web Tasarımının Temelleri Öğr. Gör. Murat YAZICI www.muratyazici.com Artvin Çoruh Üniversitesi, Artvin Meslek Yüksekokulu www.artvin.edu.tr Temel Kavramlar İnternet HTML WWW HTTP, HTTPS FTP Web

Detaylı

PHP'ye Giriş Türkiye PHP Grubu - Linux Şenlikleri PHP Eğitim / Tanıtım Seminerleri Ankara, 11 Mayıs 2006 Hidayet Doğan <hdogan@hido.

PHP'ye Giriş Türkiye PHP Grubu - Linux Şenlikleri PHP Eğitim / Tanıtım Seminerleri Ankara, 11 Mayıs 2006 Hidayet Doğan <hdogan@hido. PHP'ye Giriş Türkiye PHP Grubu - Linux Şenlikleri PHP Eğitim / Tanıtım Seminerleri Ankara, 11 Mayıs 2006 Hidayet Doğan PHP Nedir? Genel kullanım amaçlı bir betik/programlama dilidir.

Detaylı

Dünyanın bilgisine açılan pencere... Ya da sadece yeni çağın eğlencesi...

Dünyanın bilgisine açılan pencere... Ya da sadece yeni çağın eğlencesi... Dünyanın bilgisine açılan pencere... Ya da sadece yeni çağın eğlencesi... Bilgisayar Ağı (Network) Nedir? Bir ana bilgisayarın denetiminde birbirlerine bağlı olarak çalışan bilgisayarların oluşturduğu

Detaylı

ÖNDER BİLGİSAYAR KURSU. Microsoft Office Kursu Eğitim İçeriği

ÖNDER BİLGİSAYAR KURSU. Microsoft Office Kursu Eğitim İçeriği ÖNDER BİLGİSAYAR KURSU Microsoft Office Kursu Eğitim İçeriği Microsoft WORD 1. PENCERE ELEMANLARI VE GÖRÜNTÜLEME BİÇİMLERİ 1.1. Genel Bilgiler 1.2. Ekran Görünümleri 1.3. Metin Sınırları ve Basımda Çıkmayan

Detaylı

Elbistan MYO Güz Dönemi Öğr.Gör. Murat KEÇECİOĞLU

Elbistan MYO Güz Dönemi Öğr.Gör. Murat KEÇECİOĞLU Elbistan MYO 2016-2017 Güz Dönemi Öğr.Gör. Murat KEÇECİOĞLU HTML Nedir? HTML, Hyper Text Markup Language sözcüklerinin baş harflerinden oluşan bir kısaltmadır ve Web in temel dilidir. Html dökümanları

Detaylı

Web Teknolojileri ve Programla

Web Teknolojileri ve Programla 12.05.2010 Dersi Özeti Kursun içeriğini özeti Alt başlıkları Proje Kurs esnasında kullanmayı planladığımı editörler HTMLe giriş Temel etiketler Notepad+ da örnekler Web Teknolojileri ve Programla Bölüm

Detaylı

Microsoft Excel. Çalışma Alanı. Hızlı Erişim Çubuğu Sekmeler Başlık Formül Çubuğu. Ad Kutusu. Sütunlar. Satırlar. Hücre. Kaydırma Çubukları

Microsoft Excel. Çalışma Alanı. Hızlı Erişim Çubuğu Sekmeler Başlık Formül Çubuğu. Ad Kutusu. Sütunlar. Satırlar. Hücre. Kaydırma Çubukları Microsoft Excel Microsoft Excel yazılımı bir hesap tablosu programıdır. Excel, her türlü veriyi (özellikle sayısal verileri) tablolar ya da listeler halinde tutma ve bu verilerle ilgili ihtiyaç duyacağınız

Detaylı

T.C. SAKARYA ÜNİVERSİTESİ ADAPAZARI MESLEK YÜKSEKOKULU WEB TABANLI VERİ TABANI UYGULAMASI YÖNLENDİRİLMİŞ ÇALIŞMA. Enes Al 1027.

T.C. SAKARYA ÜNİVERSİTESİ ADAPAZARI MESLEK YÜKSEKOKULU WEB TABANLI VERİ TABANI UYGULAMASI YÖNLENDİRİLMİŞ ÇALIŞMA. Enes Al 1027. T.C. SAKARYA ÜNİVERSİTESİ ADAPAZARI MESLEK YÜKSEKOKULU WEB TABANLI VERİ TABANI UYGULAMASI YÖNLENDİRİLMİŞ ÇALIŞMA Enes Al 1027.32121 BİLGİSAYAR PROGRAMCILIĞI DANIŞMAN: ÖĞR. GÖR. FERDA BOZKURT TEMMUZ 2012

Detaylı

Akdeniz Üniversitesi

Akdeniz Üniversitesi F. Ders Tanıtım Formu Dersin Adı Öğretim Dili Akdeniz Üniversitesi Bilgi Teknolojileri Kullanımı Türkçe Dersin Verildiği Düzey Ön Lisans ( ) Lisans (x) Yüksek Lisans( ) Doktora( ) Eğitim Öğretim Sistemi

Detaylı

Temel Bilgi Teknolojileri - I Ayrıntılı Ders İçerikleri

Temel Bilgi Teknolojileri - I Ayrıntılı Ders İçerikleri Temel Bilgi Teknolojileri - I Ayrıntılı Ders İçerikleri Bilgi Teknolojileri (IT) Kavramları, Bilgisayar Kullanımı ve Dosyaların Yönetimi, Bilgi ve İletişim HAFTA 1 1. Genel Kavramlar(Bilgisayarın tanımı,bilgi

Detaylı

İnternet ve İnternet Tarayıcıları BİLGİ VE İLETİŞİM TEKNOLOJİSİ DERS NOTU - 2

İnternet ve İnternet Tarayıcıları BİLGİ VE İLETİŞİM TEKNOLOJİSİ DERS NOTU - 2 İnternet ve İnternet Tarayıcıları BİLGİ VE İLETİŞİM TEKNOLOJİSİ DERS NOTU - 2 Ağlar ve Internet Ağ, iletişim aygıtları ve iletim ortamı yoluyla, genellikle kablosuz olarak bağlanan bilgisayar ve aygıtların

Detaylı

Internet: Tarihçe ve Kavramlar

Internet: Tarihçe ve Kavramlar Internet: Tarihçe ve Kavramlar Umut Al umutal@hacettepe.edu.tr Internet in Tarihçesi 1945 Vannevar Bush memex 1962 Licklider (MIT) Galaktik Ağ 1969 DARPA ARPANET 1972 İlk e-posta 1983 TCP-IP 1991 Gopher,

Detaylı

BİH 605 Bilgi Teknolojisi Bahar Dönemi 2015

BİH 605 Bilgi Teknolojisi Bahar Dönemi 2015 BİH 605 Bilgi Teknolojisi Bahar Dönemi 2015 Ders- 13 World Wide Web (WWW) Yrd. Doç. Dr. Burcu Can Buğlalılar Bilgisayar Mühendisliği Bölümü Bilgisayar Katmanları İçerik World Wide Web (WWW) Anlık Mesajlaşma

Detaylı

BMT 202 Web Tasarımı Bahar Dönemi. Yük. Müh. Köksal GÜNDOĞDU 1

BMT 202 Web Tasarımı Bahar Dönemi. Yük. Müh. Köksal GÜNDOĞDU 1 BMT 202 Web Tasarımı 2016 2017 Bahar Dönemi Yük. Müh. Köksal GÜNDOĞDU 1 HTML Yük. Müh. Köksal GÜNDOĞDU 2 HTML Editörleri Web sayfası oluşturmak için not defteri gibi basit bir metin düzenleme yazılımı

Detaylı

TBF 110 BİLGİSAYARDA VERİ İŞLEME ve UYGULAMALARI Ha9a- 2 - İnternet

TBF 110 BİLGİSAYARDA VERİ İŞLEME ve UYGULAMALARI Ha9a- 2 - İnternet BİLGİSAYARDA VERİ İŞLEME ve UYGULAMALARI Ha9a- 2 - İnternet 2015 2016 Akademik Yılı Öğr. Gör. Gülten Güngörmüş gulteng@baskent.edu.tr Oda No: B- 202 Öğr. Gör. Gizem Öğütcü ogutcu@baskent.edu.tr Oda No:

Detaylı

Internet Programming II

Internet Programming II Internet Programming II Elbistan Meslek Yüksek Okulu 2016 2017 Bahar Yarıyılı Öğr.Gör. Murat KEÇECĠOĞLU 1 Fonksiyonlar Değişken Kontrol Fonksiyonları isset() Fonksiyonu Parametre olarak aldığı değişken

Detaylı

İNTERNET PROGRAMLAMA II. Tanımlar

İNTERNET PROGRAMLAMA II. Tanımlar İNTERNET PROGRAMLAMA II Tanımlar WWW( World Wide Web) Dünya üzerindeki bütün bilgisayarların bağlı olduğu bir ağdır. Çoğunlukla Web olarak adlandırılır. Web üzerindeki bilgisayarlar standart protokolleri

Detaylı

WEB TASARIMININ TEMELLERİ

WEB TASARIMININ TEMELLERİ WEB TASARIMININ TEMELLERİ Öğr. Gör. M. Mutlu YAPICI Ankara Üniversitesi Elmadağ Meslek Yüksekokulu Ders İzlencesi Hafta Modüller/İçerik/Konular 1. Hafta İnternet ve WEB Tanımları Html Temel Etiketleri

Detaylı

ÖĞRENME FAALĠYETĠ 4 ÖĞRENME FAALĠYETĠ 4 4. SAYFA YAPISI

ÖĞRENME FAALĠYETĠ 4 ÖĞRENME FAALĠYETĠ 4 4. SAYFA YAPISI ÖĞRENME FAALĠYETĠ 4 AMAÇ ÖĞRENME FAALĠYETĠ 4 Bu faaliyette verilen bilgiler doğrultusunda hazırlamıģ olduğunuz belgenin özelliğine göre sayfa yapısı ve yazdırma ayarlarını hatasız yapabileceksiniz. ARAġTIRMA

Detaylı

İNTERNET VE BİLGİ AĞLARININ KULLANIMI

İNTERNET VE BİLGİ AĞLARININ KULLANIMI İNTERNET VE BİLGİ AĞLARININ KULLANIMI İnternet, birçok bilgisayar sisteminin birbirine bağlı olduğu, dünya çapında yaygın olan ve sürekli büyüyen bir iletişim ağıdır. TCP/IP (Transmission Control Protocol/Internet

Detaylı

12. Tanımlama Listeleri <dl> </dl>, <dt> </dt>, <dd> </dd>

12. Tanımlama Listeleri <dl> </dl>, <dt> </dt>, <dd> </dd> 12. Tanımlama Listeleri , , Terimler ve açıklamalarını içeren listeler oluşturmakta kullanılırlar. Bir uygulamanın komut satırı seçeneklerini listelemek ve altlarında açıklamalarını

Detaylı

Internet Programming II. Elbistan Meslek Yüksek Okulu 2014 2015 Bahar Yarıyılı

Internet Programming II. Elbistan Meslek Yüksek Okulu 2014 2015 Bahar Yarıyılı Internet Programming II Elbistan Meslek Yüksek Okulu 2014 2015 Bahar Yarıyılı Öğr. Gör. Murat KEÇECĠOĞLU 11-14 May. 2014 Form Form İşlemleri Tarayıcıdan bilgi alarak işlem gerçekleştirme FORM elemanları

Detaylı

Script. Statik Sayfa. Dinamik Sayfa. Dinamik Web Sitelerinin Avantajları. İçerik Yönetim Sistemi. PHP Nedir? Avantajları.

Script. Statik Sayfa. Dinamik Sayfa. Dinamik Web Sitelerinin Avantajları. İçerik Yönetim Sistemi. PHP Nedir? Avantajları. Script Statik Sayfa Dinamik Sayfa Dinamik Web Sitelerinin Avantajları İçerik Yönetim Sistemi PHP Nedir? Avantajları Dezavantajları Script HTML kodları arasına yerleştirilen küçük kodlardır. Web sayfalarında

Detaylı

PHP I PHP I. E. Fatih Yetkin. 26 Eylül 2011

PHP I PHP I. E. Fatih Yetkin. 26 Eylül 2011 PHP I E. Fatih Yetkin 26 Eylül 2011 Outline Temel Tanımlar HTML e Giriş PHP ye Giriş MySQL ve PHP Temel Tanımlar Web Sunucu Nedir? Teknik detaylar bir kenara bırakılacak olursa, hazırlanan web sayfasını

Detaylı

İNTERNET PROGRAMCILIĞI - II

İNTERNET PROGRAMCILIĞI - II 0 İÇİNDEKİLER Bölüm 1 PHP İle Web Programlamaya Giriş 1 Bölüm 2 PHP Kodlama Standartları 5 Bölüm 3 PHP Değişken Kullanımı 17 Bölüm 4 IF Yapısı 32 Bölüm 5 Döngüler ve Diziler 64 1 BÖLÜM 1 PHP İLE WEB PROGRAMLAMAYA

Detaylı

AĞ ve İNTERNET TCP/IP. IP Adresi İNTERNET NEDİR? Standartlar :

AĞ ve İNTERNET TCP/IP.  IP Adresi İNTERNET NEDİR? Standartlar : AĞ ve İNTERNET İNTERNET NEDİR? İnternet, birçok bilgisayar sisteminin birbirine bağlı olduğu, dünya çapında yaygın olan ve sürekli büyüyen bir iletişim ağıdır. Standartlar : TCP/IP (Transmission Control

Detaylı

Internet Programming II. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı

Internet Programming II. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı Internet Programming II Elbistan Meslek Yüksek Okulu 2015 2016 Bahar Yarıyılı Öğr. Gör. Murat KEÇECĠOĞLU 23 May. 2016 PHP Dosya İşlemleri Form yolu ile kullanıcıdan alınan bilgilerin veri tabanı yerine

Detaylı

Data Programming SQL Language. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı

Data Programming SQL Language. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı Data Programming SQL Language Elbistan Meslek Yüksek Okulu 2015 2016 Bahar Yarıyılı Öğr.Gör. Murat KEÇECĠOĞLU 15 Mar 2016 1 SQL deyimleri veritabanları üzerinde çeşitli işlemleri yerine getirirler. Veritabanından

Detaylı

Dünyanın bilgisine açılan pencere... Ya da sadece yeni çağın eğlencesi...

Dünyanın bilgisine açılan pencere... Ya da sadece yeni çağın eğlencesi... Dünyanın bilgisine açılan pencere... Ya da sadece yeni çağın eğlencesi... Bilgisayar Ağı (Network) Nedir? Bir ana bilgisayarın denetiminde birbirlerine bağlı olarak çalışan bilgisayarların oluşturduğu

Detaylı

Kullanım Kılavuzu Milli Eğitim Bakanlığı 2010

Kullanım Kılavuzu Milli Eğitim Bakanlığı 2010 Kullanım Kılavuzu Milli Eğitim Bakanlığı 2010 Bu belge BT Sınıfı Etkinliklerinde Kullanılmak Üzere Hazırlanmıştır İÇİNDEKİLER GİRİŞ... 3 ÜYE (KAYIT) OLMA... 3 YÖNETİM PANELİ İŞLEMLERİ... 5 ŞABLON AYARLARI...

Detaylı

Çerezleri (Cookie) ve Önbelleği (Cache) Temizleme

Çerezleri (Cookie) ve Önbelleği (Cache) Temizleme Çerezleri (Cookie) ve Önbelleği (Cache) Temizleme Kullandığınız tarayıcıda veya görüntülediğiniz sayfada sorun varsa, öncelikle tarayıcının önbelleğini temizlemeyi deneyin. Önbelleği temizledikten sonra

Detaylı

SAB 103 TEMEL BİLGİSAYAR KULLANIMI

SAB 103 TEMEL BİLGİSAYAR KULLANIMI SAB 103 TEMEL BİLGİSAYAR KULLANIMI DERS NOTLARI Prof.Dr. Fatih TANK Ankara Üniversitesi Uygulamalı Bilimler Fakültesi Sigortacılık ve Aktüerya Bilimleri Bölümü Prof.Dr. Fatih TANK - Temel - Ders Notları-

Detaylı

4. Bağlantı (Köprü) Oluşturma

4. Bağlantı (Köprü) Oluşturma 4. Bağlantı (Köprü) Oluşturma Bu bölümü bitirdiğinizde, HTML dosyalarında nasıl bağlantı oluşturulduğunu, Bağ etiketinin ne olduğunu, Yerel dosyalara nasıl bağlantı kurulduğunu, İnternet üzerindeki dosyalara

Detaylı

Internet Programming II. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı

Internet Programming II. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı Internet Programming II Elbistan Meslek Yüksek Okulu 2015 2016 Bahar Yarıyılı Öğr. Gör. Murat KEÇECĠOĞLU 23 May. 2016 Form Form İşlemleri Tarayıcıdan bilgi alarak işlem gerçekleştirme FORM elemanları yardımıyla

Detaylı

Arayüz Geliştirme Dokümantasyonu

Arayüz Geliştirme Dokümantasyonu Arayüz Geliştirme Dokümantasyonu Proje: İş: Müşteri: Nosab Web Sitesi Arayüz Geliştirme Aeronorm Index 1. Sayfalar 2. Renk Paleti 3. Tipografi 4. Kutu Modeli 5. Bileşenler 6. Kod ve Sayfa Yapısı 7. Responsive

Detaylı

Web Tasarımının Temelleri

Web Tasarımının Temelleri 1. Hafta Web Tasarımının Temelleri Öğr. Gör. Murat YAZICI www.muratyazici.com Artvin Çoruh Üniversitesi, Artvin Meslek Yüksekokulu www.artvin.edu.tr HTML (HyperText Markup Language) Web sayfaları hazırlamak

Detaylı

İÇERİK YÖNETİM SİSTEMİ (CMS) Bir web sitesi yayınlamak için yapılması gerekenler:

İÇERİK YÖNETİM SİSTEMİ (CMS) Bir web sitesi yayınlamak için yapılması gerekenler: İÇERİK YÖNETİM SİSTEMİ (CMS) Bir web sitesi yayınlamak için yapılması gerekenler: Yer satın alınır. İsim tescil ettirilir. Ftp ile wordpress klasörü upload edilir. Kendi bilgisayarımızda web sitesi yayınlamak

Detaylı

ÇANKAYA ÜNİVERSİTESİ WEBMAIL KULLANIM KLAVUZU

ÇANKAYA ÜNİVERSİTESİ WEBMAIL KULLANIM KLAVUZU ÇANKAYA ÜNİVERSİTESİ WEBMAIL KULLANIM KLAVUZU Üniversitemiz Webmail servisi yenilenmiş olup Roundcube webmail üzerinden servis vermeye başlamıştır. Daha önce kullanılan SquirrelMail servisi https://oldwebmail.cankaya.edu.tr/

Detaylı

TARSUS HALK EĞİTİMİ MERKEZİ VE ASO MÜDÜRLÜĞÜ

TARSUS HALK EĞİTİMİ MERKEZİ VE ASO MÜDÜRLÜĞÜ TARSUS HALK EĞİTİMİ MERKEZİ ASO MÜDÜRLÜĞÜ KULLANIMI ( İŞLETMENLİĞİ OPERATÖR) KURS PLANI BŞL : 08.03.2011 - BTŞ : 02.05.2011 Hafta içi her gün: 14.30-17 :40 ( 4 saat ) TARİH GÜN SAAT MODÜL Açılış konuşması,

Detaylı

20../20.. EĞĠTĠM-ÖĞRETĠM YILI. BĠLĠġĠM TEKNOLOJĠLERĠ WEB TASARIM VE ĠNTERNET DERS DIġI EGZERSĠZ ÇALIġMA PROGRAMI

20../20.. EĞĠTĠM-ÖĞRETĠM YILI. BĠLĠġĠM TEKNOLOJĠLERĠ WEB TASARIM VE ĠNTERNET DERS DIġI EGZERSĠZ ÇALIġMA PROGRAMI EKĠM EÜ 0../0.. EĞĠĠM-ÖĞEĠM II OKUU BĠĠġĠM EKNOOJĠEĠ WEB SIM VE ĠNENE DIġI EGZESĠZ ÇIġM POGMI Ġ ÇIġM ZMNI ÇIġM SĠ SĠ ÇIġM EĠ ĠġENECEK KONU 6.09.0.. :0-:0 saat B SINII Öğrenci seviyelerinin tespiti 8.09.0..

Detaylı

Akdeniz Üniversitesi

Akdeniz Üniversitesi F. Ders Tanıtım Formu Dersin Adı Öğretim Dili Akdeniz Üniversitesi Bilgi ve İletişim Teknolojisi Türkçe Dersin Verildiği Düzey Ön Lisans (x) Lisans ( ) Yüksek Lisans( ) Doktora( ) Eğitim Öğretim Sistemi

Detaylı

WAMP SERVER KURULUMU

WAMP SERVER KURULUMU WAMP SERVER KURULUMU Bilgisayarınızda; PHP web programlama dilini kullanarak web sayfası hazırlayacaksanız ya da PHP web programlama dili kullanılarak hazırlanmış Joomla, Wordpress, Drupal vb.. içerik

Detaylı

HTML içerik oluşturmak için düşünülen bir işaret dilidir. Örnek

HTML içerik oluşturmak için düşünülen bir işaret dilidir. Örnek STİLLER CSS NEDİR? CSS (Cascading Style Sheet) Stiller, HTML elemanlarının nasıl gösterileceğini tanımlar. Stiller HTML de karşılaşılan bazı problemleri çözmek için HTML 4.0 a eklenmiştir. HTML, web

Detaylı

2 PYTHON A GIRIŞ 13 PyCharm İle Python Projesi Oluşturma 15 Projenin Çalıştırılması 18 İlk Python Programımız 19 Açıklama Satırları 21

2 PYTHON A GIRIŞ 13 PyCharm İle Python Projesi Oluşturma 15 Projenin Çalıştırılması 18 İlk Python Programımız 19 Açıklama Satırları 21 İÇİNDEKİLER VII İÇİNDEKİLER 1 PYTHON 1 Neden Python? 2 Python Sürümleri 2 Python Kurulumu 3 Windows Üzerinde Python 3 Ubuntu Üzerinde Python 6 Komut Satırında Python Çalıştırma 6 Windows komut istemi üzerinde

Detaylı

Raptadmin 1.x.x Sürümleri için Kullanım Klavuzu

Raptadmin 1.x.x Sürümleri için Kullanım Klavuzu Raptadmin 1.x.x Sürümleri için Kullanım Klavuzu Ekim 2014 Ankara www.raptadmin.com info@raptadmin.com Giriş İşlemleri Raptadmin yönetim paneline www.alanadınız.com/admin adresini kullanarak gidebilirsiniz.

Detaylı

PHP ile İnternet Programlama

PHP ile İnternet Programlama PHP ile İnternet Programlama Doç.Dr. Gazi Üniversitesi Gazi Eğitim Fakültesi Bilgisayar ve Öğretim Teknolojileri Eğitimi Bölümü 1. BÖLÜM: Bilgisayarımızı PHP ye Hazırlamak PHP Yorumlayıcısı ve Sunucu Yazılımı

Detaylı

PHP 1. Hafta 2.Sunum

PHP 1. Hafta 2.Sunum PHP 1. Hafta 2.Sunum Hello World Bu derste görülecekler WAMP ve PHP Hosting kavramı ve bizi neden ilgilendirmediği Domain ve localhost kavramları www klasörü İlk PHP kodunun

Detaylı

E-Posta Hesabı Oluşturma

E-Posta Hesabı Oluşturma E-Posta Hesabı Oluşturma Elektronik Posta (E-posta) Nedir? Elektronik posta (e-posta) internet ortamından gönderilen dijital (elektronik) mektuptur. Bir başkasına e-posta gönderebilmemiz için öncelikle

Detaylı

9. HAFTA KBT204 İNTERNET PROGRAMCILIĞI II. Öğr.Gör. Hakan YILMAZ. hakanyilmaz@karabuk.edu.tr

9. HAFTA KBT204 İNTERNET PROGRAMCILIĞI II. Öğr.Gör. Hakan YILMAZ. hakanyilmaz@karabuk.edu.tr 9. HAFTA KBT204 İNTERNET PROGRAMCILIĞI II Öğr.Gör. Hakan YILMAZ hakanyilmaz@karabuk.edu.tr Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi 2 İçindekiler Request Nesnesinin Özellikleri

Detaylı

BTP 207 İNTERNET PROGRAMCILIĞI I. Ders 2

BTP 207 İNTERNET PROGRAMCILIĞI I. Ders 2 BTP 207 İNTERNET PROGRAMCILIĞI I Ders 2 HTML 2 Hyper Text Markup Language = Yüksek/İleri Metin İşaretleme Dili Web sayfaları oluşturmak için kullanılan içerik biçimlendirme dilidir. Yüksek/ileri metin

Detaylı

Vsp Teknoloji Son sistem güvenlik duvarlarıyla korunmaktadır, Kullanıcı bilgilerini doğru girdiğinde giriş sayfasına bağlanacaktır.

Vsp Teknoloji Son sistem güvenlik duvarlarıyla korunmaktadır, Kullanıcı bilgilerini doğru girdiğinde giriş sayfasına bağlanacaktır. Üye Girişi Vsp Teknoloji Son sistem güvenlik duvarlarıyla korunmaktadır, Kullanıcı bilgilerini doğru girdiğinde giriş sayfasına bağlanacaktır. Giriş Sayfası Sayfa ayarlarını buradan yapabilirsiniz. Anahtar

Detaylı

Internet Programming II

Internet Programming II Internet Programming II Elbistan Meslek Yüksek Okulu 2015 2016 Bahar Yarıyılı 16 May. 2016 Öğr.Gör. Murat KEÇECĠOĞLU 1 Fonksiyonlar Değişken Kontrol Fonksiyonları isset() Fonksiyonu Parametre olarak aldığı

Detaylı

Windows İşletim Sistemi

Windows İşletim Sistemi Windows İşletim Sistemi Bilgisayar (Özellikler) Bilgisayarınızın özelliklerini görüntülemek için : Masaüstünde Bilgisayar simgesine sağ tıklayarak Özellikler e tıklayın. Çıkan pencerede bilgisayarınızda

Detaylı

ÇANKIRI KARATEKİN ÜNİVERSİTESİ ZİMBRA E-POSTA SİSTEMİ KULLANICI DOKÜMANI

ÇANKIRI KARATEKİN ÜNİVERSİTESİ ZİMBRA E-POSTA SİSTEMİ KULLANICI DOKÜMANI ÇANKIRI KARATEKİN ÜNİVERSİTESİ ZİMBRA E-POSTA SİSTEMİ KULLANICI DOKÜMANI İÇİNDEKİLER GİRİŞ... 3 EPOSTA SİSTEMİNE BAĞLANMA... 3 ESKİ E-POSTLAR... 5 YENİ KİŞİ VEYA GÖREV OLUŞTURMA... 6 MESAJ YAZMA... 6 KİŞİLER...

Detaylı

12 TBT / WEB TASARIM ve PROGRAMLAMA ( Not 3 )

12 TBT / WEB TASARIM ve PROGRAMLAMA ( Not 3 ) 12 TBT / WEB TASARIM ve PROGRAMLAMA ( Not 3 ) 25.09.2017 METİN VE GÖRÜNÜM DÜZENLEME ETİKETLERİ : etiketleri dökümana başlık eklemek için kullanılır. etiketinde ki x ifadesi 1 den 6 ya kadar

Detaylı

Internet ve World Wide Web

Internet ve World Wide Web Internet ve World Wide Web Bilişim Discovering Computers Teknolojileri 2010 Temelleri 2011 Living in a Digital World Dijital Bir Dünyada Yaşamak Internet Internet, milyonlarca şirketin, devlet ve öğretim

Detaylı

<html> <head> <title>sayfa Başlığı</title> </head> <body> Bu benim ilk sayfam <b>bu metin koyu</b> </body> </html>

<html> <head> <title>sayfa Başlığı</title> </head> <body> Bu benim ilk sayfam <b>bu metin koyu</b> </body> </html> HTML'e Giriş 1. HTML dosyası nedir? HTML'in açılımı Hyper Text Markup Language (Bunun tam Türkçe'si bulunmamakla beraber "çok yere açılan metin" denebilir. Bir HTML dosyası bir text dosyası olmakla beraber

Detaylı

Temel Bilgisayar Programlama

Temel Bilgisayar Programlama BÖLÜM 11: : Birçok programda, bazı verilerin disk üzerinde saklanmasına gerek duyulur. Bütün programlama dillerinde, sabit disk sürücüsü (Hard Disk Drive, HDD) üzerindeki verileri okumak veya diske veri

Detaylı

İNTERNET PROGRAMCILIĞI DERSİ ÇALIŞMA SORULARI

İNTERNET PROGRAMCILIĞI DERSİ ÇALIŞMA SORULARI İNTERNET PROGRAMCILIĞI DERSİ ÇALIŞMA SORULARI 1) Aşağıdaki seçeneklerin hangisinde PHP kod yazımı doğru olarak verilmiştir? A) B) C).. D) 2) PHP ile hazırlanmış

Detaylı

BTP 207 İNTERNET PROGRAMCILIĞI I. Ders 1

BTP 207 İNTERNET PROGRAMCILIĞI I. Ders 1 BTP 207 İNTERNET PROGRAMCILIĞI I Ders 1 2 Dersi Veren: Doç.Dr. Nuray At Mühendislik Fakültesi, Elektrik-Elektronik Müh. Bölümü, EEM213 e-mail: nat@anadolu.edu.tr Kaynaklar: 1. E. Yaşar, T. Özseven, İnternet

Detaylı

BİLGİSAYAR 4 MOLEKÜLER BİYOLOJİ VE GENETİK BÖLÜMÜ YARD. DOÇ. DR. MEHTAP YALÇINKAYA 08.04.2011

BİLGİSAYAR 4 MOLEKÜLER BİYOLOJİ VE GENETİK BÖLÜMÜ YARD. DOÇ. DR. MEHTAP YALÇINKAYA 08.04.2011 BİLGİSAYAR 4 MOLEKÜLER BİYOLOJİ VE GENETİK BÖLÜMÜ HTML DERS NOTLARI 6. DERS YARD. DOÇ. DR. MEHTAP YALÇINKAYA 08.04.2011 HYPERLINKS - KÖPRÜ Sayfalara link (bağlantılar) oluşturmak için kullanılır.

Detaylı

ÖĞRENME FAALĠYETĠ 8 ÖĞRENME FAALĠYETĠ ÖZELLEġTĠRME

ÖĞRENME FAALĠYETĠ 8 ÖĞRENME FAALĠYETĠ ÖZELLEġTĠRME ÖĞRENME FAALĠYETĠ 8 AMAÇ ÖĞRENME FAALĠYETĠ 8 Bu faaliyette verilen bilgiler ile kelime iģlemci programının daha etkin kullanımını artıracak seçenekleri kullanabileceksiniz. ARAġTIRMA Belge özelleģtirme

Detaylı

BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜM BAŞKANLIĞI DERS TANITIM BİLGİLERİ

BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜM BAŞKANLIĞI DERS TANITIM BİLGİLERİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜM BAŞKANLIĞI DERS TANITIM BİLGİLERİ Dersin Adı Kodu Sınıf / Y.Y. Ders Saati (T+U+L) Kredi AKTS İNTERNET TEKNOLOJİLERİ BG-412 4/1 2+2+0 2+2 6 Dersin Dili : TÜRKÇE Dersin Seviyesi

Detaylı

1 RUBY HAKINDA 1 Ruby nin Gelişim Hikayesi 1 Neden Ruby? 1 Neden Bu Kadar Popüler? 2

1 RUBY HAKINDA 1 Ruby nin Gelişim Hikayesi 1 Neden Ruby? 1 Neden Bu Kadar Popüler? 2 İÇİNDEKİLER VII İÇİNDEKİLER 1 RUBY HAKINDA 1 Ruby nin Gelişim Hikayesi 1 Neden Ruby? 1 Neden Bu Kadar Popüler? 2 2 RUBY KURULUMU 3 Windows İçin Ruby Kurulumu 3 Ubuntu ve Debian İçin Ruby Kurulumu 6 Mac

Detaylı

INTERNET VE INTERNET TARAYICISI

INTERNET VE INTERNET TARAYICISI INTERNET VE INTERNET TARAYICISI HATIRLAYALIM 2 Ses kartı, ekran kartı, modem kartı gibi kartlar ) üzerine takılırlar. Aşağıdaki kartlardan hangisi bilgisayarda hem girdi hem de çıktı birimi görevini yerine

Detaylı

AEGEE-Eskişehir Online Web Yönetim Paneli ( WEBBY ) Yardım Dökümanı

AEGEE-Eskişehir Online Web Yönetim Paneli ( WEBBY ) Yardım Dökümanı AEGEE-Eskişehir Online Web Yönetim Paneli ( WEBBY ) Yardım Dökümanı Emre GÜLCAN IT Responsible & Web Admin AEGEE-Eskişehir emregulcan@gmail.com e_gulcan@hotmail.com 0535 729 55 20 1 1. YÖNETİM PANELİNE

Detaylı

WordPress ile Web Sayfası Tasarımı

WordPress ile Web Sayfası Tasarımı WordPress ile Web Sayfası Tasarımı WordPress nedir? WordPress, dünyada en çok kullanılan blog sistemlerinden biridir, açık kaynaklı ve ücretsiz olarak dağıtılmaktadır.wordpress açık kaynaklı bir yazılım

Detaylı

NECMETTİN ERBAKAN ÜNİVERSİTESİ E-POSTA YARDIM BELGESİ

NECMETTİN ERBAKAN ÜNİVERSİTESİ E-POSTA YARDIM BELGESİ Zimbra Webmail GENEL ÖZELLİKLER Zimbra yüksek performanslı bir e-posta programı olup, e-posta, adres defteri, takvim, görev listeleri ve web dokümanları gibi özelliklere sahip bir uygulamadır. e-posta

Detaylı

Çözüm Bilgisayar. Çözüm İntSite

Çözüm Bilgisayar. Çözüm İntSite Çözüm Bilgisayar Çözüm İntSite Çözüm İnternet Site Programı (intsite.exe) Firmamızca geliştirilen ve Çözüm HBYS programının ana modülü olan Hasta Takip modülünü kullanan tüm hastanelerin kullanabileceği

Detaylı

Ağ Nedir? Birden fazla bilgisayarın iletişimini sağlayan printer vb. kaynakları, daha iyi ve ortaklaşa kullanımı sağlayan yapılara denir.

Ağ Nedir? Birden fazla bilgisayarın iletişimini sağlayan printer vb. kaynakları, daha iyi ve ortaklaşa kullanımı sağlayan yapılara denir. TEMEL AĞ TANIMLARI Ağ Nedir? Birden fazla bilgisayarın iletişimini sağlayan printer vb kaynakları, daha iyi ve ortaklaşa kullanımı sağlayan yapılara denir WAN ve LAN Kavramları Bilgisayarlar ve paylaşılan

Detaylı

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Uzaktan Eğitim Uygulama ve Araştırma Merkezi JAVA PROGRAMLAMA Öğr. Gör. Utku SOBUTAY İÇERİK 2 Java Kodlarına Yorum Satırı Eklemek Java Paket Kavramı Java Kütüphane Kavramı Konsoldan Veri Çıkışı ve JOPtionPane Kütüphanesi JOptionPane Kütüphanesi Kullanarak

Detaylı

EĞİTİM-ÖĞRETİM YILI BİLİŞİM TEKNOLOJİLERİ VE YAZILIM DERSİ 6. SINIF 2. DÖNEM 2. SINAV ÇALIŞMA NOTLARI

EĞİTİM-ÖĞRETİM YILI BİLİŞİM TEKNOLOJİLERİ VE YAZILIM DERSİ 6. SINIF 2. DÖNEM 2. SINAV ÇALIŞMA NOTLARI 2015-2016 EĞİTİM-ÖĞRETİM YILI BİLİŞİM TEKNOLOJİLERİ VE YAZILIM DERSİ 6. SINIF 2. DÖNEM 2. SINAV ÇALIŞMA NOTLARI MİCROSOFT EXCEL PROGRAMI Programın Açılışı: Başlat Tüm Programlar Microsoft Office Microsoft

Detaylı

Boğaziçi Üniversitesi Bilgi İşlem Merkezi. Web Yönetimi Birimi. Drupal Kullanım Kılavuzu

Boğaziçi Üniversitesi Bilgi İşlem Merkezi. Web Yönetimi Birimi. Drupal Kullanım Kılavuzu Boğaziçi Üniversitesi Bilgi İşlem Merkezi Web Yönetimi Birimi Drupal Kullanım Kılavuzu KONULAR 1. Kullanıcı Girişi Yapma 2. Ana Menüyü Düzenleme 3. Site Logosunu Düzenleme 4. Yeni Sayfa Ekleme / Düzenleme

Detaylı

SQL PROGRAMLAMA. Bir batch, bir arada bulunan bir dizi SQL deyimidir. Batch ayıracı GO deyimidir.

SQL PROGRAMLAMA. Bir batch, bir arada bulunan bir dizi SQL deyimidir. Batch ayıracı GO deyimidir. SQL PROGRAMLAMA BATCH Bir batch, bir arada bulunan bir dizi SQL deyimidir. Batch ayıracı deyimidir. SELECT. UPDATE...... DELETE.. BATCH BATCH Özellikleri 1- Bir batch içinde bir deyimde yazım hatası olduğunda

Detaylı

Arama Sonuçlarında Üst Sıralarda Olmak. Temel SEO Çalışması

Arama Sonuçlarında Üst Sıralarda Olmak. Temel SEO Çalışması Arama Sonuçlarında Üst Sıralarda Olmak Temel SEO Çalışması 2 SEO (Search engine optimization), kısaltmasıdır. Arama motorları SEO işlemleri ile web sitelerini daha kolay bir şekilde taraması için yapılan

Detaylı

Kopya Hakkı 2005 The European Computer Driving Licence Foundation Ltd

Kopya Hakkı 2005 The European Computer Driving Licence Foundation Ltd Tüm haklar mahfuzdur. Bu yayının hiçbir kısmı ECDL Kuruluşundan izin almadan hiçbir şekilde çoğaltılamaz. Çoğaltım talepleri yayıncıya yapılmalıdır. The European Computer Driving Licence Foundation Ltd

Detaylı