SlideShare ist ein Scribd-Unternehmen logo
1 von 65
Downloaden Sie, um offline zu lesen
Temel Düzeyde MySQL
ve PHP Eğitimleri 2
MySQL ve PHP Ortamının
İncelenmesi
Bilgi Teknolojisi Eğitim Programları
Bu Çalışma Univerist Materyal geliştirme ekibi tarafından Bilgi Teknoloji-
leri Eğitimleri için derlenmiştir. Dökümanla ilgili kaynaklar makalenin so-
nunda “Kaynakça” kısmında detaylı bir şekilde belirtilmiştir.
1
4. VERİ TABANINA GİRİŞ
Bilgisayarın en önemli görevlerinden sayılan verileri saklama, verileri işleme ve gerektiğinde ise bu
verileri çağırarak kullanma, gündelik hayatımızda birçok işimizi kolaylaştırmaktadır. E-okulda notla-
rımızın ve devamsızlıklarımızın takibi, ÖSYM sınav ve puan bilgilerimiz, sizlerin kullandığı verisel
işlemlerdir. İşte, bu tür veriler ve dahası bilgisayarda bir sistem dâhilinde tutulur, çağrılır ve işlenir.
Bilgisayarda verilerle uğraşmak için programlar yapılmıştır. Bunlardan MySQL, Oracle, MS-SQL,
Access bunlardan en bilinenidir. Bu öğrenme faaliyetinde, dersimizin ilk modülü olan “Açık Kaynak
Kodla Temel Uygulamalar” modülünde kurulumu anlatılmış olan My-SQL veri tabanına erişim ve
veri tabanında temel işlemleri gerçekleştireceğiz.
4.1. MS-DOS KOMUT SATIRINDAN MYSQL VERİ TABANINA ERİŞME
MS-DOS komut sisteminden, veri tabanına erişebilmek için veri tabanımızın olduğundan emin ol-
mamız gerekmektedir. Windows işletim sistemi üzerinden Başlat-Çalıştır-cmd komutu ile MS-DOS
komut ekranını çalıştırıyoruz.
Komut satırı aşağıdaki ekran görüntüsündeyken
Komut satırına; C:wampbinmysqlmysql5.5.16binmysql –u root –h localhost –p
komutunu yazıp ENTER tuşuna basıyoruz. “Enter Password:” kısmına eğer veri tabanına erişmek
için daha önceden belirlenmiş bir şifremiz varsa bu şifreyi giriyoruz yoksa sadece ENTER tuşuna
basıyoruz. Aşağıdaki ekran görüntüsündeki gibi bir ekran karşımıza geldiğinde artık MS-DOS orta-
mında veri tabanına erişmiş bulunuyoruz ve artık komutlarla işlem yapabiliriz.
2
4.2. VERİ TABANININ ADINI ÖĞRENME
SHOW DATABASES; komutu bize var olan veri tabanlarının listesini sunar. Örnek uygulamada
olduğu gibi komut satırında buna bir bakalım.
Burada yaptığımız sorguda şu an üç tane kurulumla gelen veri tabanı olduğunu görüyoruz.
4.3. VERİ TABANI OLUŞTURMAK
Yeni bir veri tabanı oluşturmak istenirse
CREATE DATABASE VERITABANI_ADI; komutunun kullanmalıyız. şimdi mtegm adında bir veri
tabanı oluşturalım. Komutlarımızı yazıyor, en sonuna dikkat ettiğiniz gibi noktalı virgül(;) işaretini
eklemeyi unutmuyoruz.
Dikkat ettiyseniz komutun altındaki satırda komutun çalıştırılmasından sonra durum raporunu biz-
lere verdi. Query OK ibaresi komutun çalıŞmasının başarılı bir şekilde tamamlandığını ifade etmek-
tedir. Şimdi oluşan veri tabanımıza bir bakalım. Hatırlayacağınız gibi mevcut veri tabanları görme
komutumuz SHOW DATABASES; idi.
3
Var olan veri tabanı adında başka bir veri tabanı oluşturmak istersek oluşmayacağını ve hata mesajı
alacağınızı göreceksiniz.
Göründüğü üzere ERROR uyarısı verdi. Yukarıdaki database exists ibaresi veri tabanının var olduğu
anlamına gelmektedir.
4.4. VERİ TABANINI SİLME
Var olan veri tabanını silmek için DROP komutu kullanılır. Kullanırken dikkat edilmesi gereken bu
komut, bütün bilgileri ve tabloları geri getirilemez bir şekilde siler. Şimdi oluşturduğumuz mtegm veri
tabanını silelim. Komutun kullanımı şu şekildedir:
DROP DATABASE VERITABANI_ADI; Komutu çalıştırmadan önce kayıtlı veri tabanlarının listesini
görelim.
4 adet veri tabanının olduğunu gördükten sonra DROP komutumuzu çalıştırıyoruz
Yukarıdaki ekran görüntüsünde de görüldüğü gibi var olan veri tabanımızı sildik. Silme işleminden
sonra da silinip silinmediğinin kontrolünü yapmış olduk. Dört olan veri tabanı adedimizin üçe düştü-
ğünü gördük.
1.5. VERİ TABANINI SEÇME
Tablo konusuna geçmeden önce tablo oluşturmanın mantığından biraz bahsedelim. Veri tabanı iş-
lemlerinde mantık şu şekildedir:
Önce veri tabanı oluşturulur sonra da veri tabanı için tablo oluşturmak suretiyle aynı gruptaki bilgiler
bir araya toplanır. Şöyle ki bir alışveriş sitesi için veri tabanı oluşturdunuz. Veri tabanı ismi AVM
olsun. Bu veri tabanında musteriler adında bir tablo ve urunler adında başka bir tablo oluşturursak
veriler belli gruplar dâhilinde bir arada tutulmuş olur. Musteriler tablosunun altında isim, soyad, ad-
res, telefon, adres gibi müşteriye ait bilgiler tutulurken, Urunler adlı tabloda ise cinsi, fiyatı, adedi,
indirim oranı gibi ürüne ait bilgiler tutulur. Bu iki tablo ise AVM veri tabanın içinde yer alır. ġimdi bu
4
anlattıklarımızı uygulamalı olarak yapmaya çalışalım: Önce AVM adında bir veri tabanı oluşturuyo-
ruz. Sonra mevcut veri tabanlarından AVM olanı seçiyoruz. Demek ki tablo oluşturacağımız veri
tabanını önce seçmemiz gerekiyor.
Bunu da USE VERITABANI_ADI komutuyla gerçekleŞtiriyoruz.
Şu an üzerinde işlem yapılan veri tabanı AVM. ġimdi veri tabanı içinde tablo var mı yok mu bunun
kontrolünü yapalım. Bunun için de SHOW TABLE komutunu kullanıyoruz.
Görüldüğü gibi AVM veri tabanımızın içinde hiçbir tablo yok. Şimdi sıra veri tabanı içine tablo oluş-
turma bölümüne geldi.
4.6. VERİ TABANINA TABLO EKLEME
Yukarıdaki Şekilde bir tablo tanımlaması yapalım.
 Create table musteri>>MüŞteri adında bir tablo tanımlıyor.
 No integer not null>>MüŞteri numarasının tam sayı (integer) bir değer alacağını ve not null
ile boŞ geçilemeyeceğini içine muhakkak bir değer girilmesi gerektiğini,
 İsim varchar(20)>>Ġsim karakteri için 20 karakterlik bir alanın tahsis edildiğini,
 Email varchar(30)>>E-mail için 30 karakterlik bir alanın tahsis edildiğini,
 Sehir varchar(20)>>ġehir için 20 karakterlik bir alanın tahsis edildiğini belirtmek için kullanı-
lır.
Tablo oluşturma ve içine veri kaydetme işlemi başarılı bir şekilde tamamlandığına göre tablomuzun
oluşup oluşmadığını kontrol edelim. Hatırlanacağı gibi tablo kontrol komutu SHOW TABLES; idi.
Örneğimizde bunu uygulayalım:
5
Oluşturduğumuz bu tablonun içine veri değerleri girmeye sıra geldi. Veri değerlerini aşağıdaki gibi
girelim:
Query OK mesajı işlemimizin başarılı olduğunu gösteriyor. Kaydımızı tabloda görmek için sorgulama
işlemi yapalım.
4.7. TABLODAN BİLGİLERİ SORGULAMA KOMUTU
SELECT alınacak_alanlar FROM tablo_ismi; Örnek: Burada musteri tablomuzdaki bütün verileri
listeledik. Burada kullandığımız yıldız (*) tüm alanların alınacağı anlamına gelmektedir.
Şimdi başka veri girişleri de yaparak tablomuzun içeriğini zenginleştirelim.
Yukarıdaki örnekte 2 müşteriye ait verileri de tablomuza girmiş olduk.
6
Bu örneğimizde aynı isim, sıra numarası ve bilgileri kaydederek üst üste birden fazla kayıt yapabili-
riz.
Bir veri tabanında isimler ve bilgiler aynı olabilir ama sıra numaralarının farklı olması gerekmektedir.
Bu örnekte 3 sıra numarası iki defa kullanılmıştır. Bu istenilen bir kayıt biçimi değildir. Bunun sebebi
tablo tanımlaması yaparken No kısmını auto increment primary key (otomatik artan farklı değer)
olarak tanımlamak gerekmektedir.
4.8. TABLODAN KAYIT SİLME
Tablo içindeki kayıtları silmek için
DELETE FROM tablo_adı komutu kullanılmalıdır. Bazı durumlarda bütün kayıtları değil belirlediği-
miz kayıtları silmemiz söz konusudur. Bunun için ise WHERE bağlacını ve koşulu ekleriz.
Örnek: Yukarıdaki musteri tablosundan Şehri Adana olan kayıtları silelim. DELETE FROM musteri
WHERE sehir=’Adana’;
Bu örnekte AVM veri tabanı içinde bulunan musteri tablosu içindeki memleketi “Adana” olan müŞ-
terilerimizi sildik. Tablodan veri silme örneği daha değişik koşullarla da yapabiliriz.
7
Tablo içindeki tüm verileri silmek için ise TRUNCATE TABLE tablo_adi; komutunu kullanabiliriz.
Silme sonucunda tablomuzu sorguladığımızda (select * from musteri;) bize tablonun boş olduğu
(Empty) karşılığı verecektir. Konumuzun pekişmesi ve diğer konularda da kullanmak için başka bir
örnek uygulama yapalım.
Örnek: Okul veri tabanı altına ogrenciler diye bir tablo oluşturup öğrenci sınıf, isim, yaş ve cinsiyet-
lerini kaydedelim. Şablon tablomuz aşağıdaki şekilde olacaktır:
Veri tabanımız oluştu, Şimdi tablo oluşturmaya sıra geldi.
NOT: Tablo oluşturmadan önce hangi veri tabanı kullanılacağı seçilmelidir. Aksi takdirde bizim iste-
diğimiz değil o an atanmış olan veri tabanının içine tablo oluşacaktır.
CREATE TABLE ogrenci ( no int unsigned not null auto_increment primary key, sinif varc-
har(5), isim varchar(30), yas int, cinsiyet varchar(5) );
8
Şimdi oluşturduğumuz bu tabloya aşağıdaki şekilde veri girişleri gerçekleştirelim:
Verileri sorguladığımız zaman aşağıdaki şekilde bir görüntü elde etmiş oluruz.
Şimdi bu örnek üzerinde şöyle bir uygulama daha yapalım:
Şimdi de 6. öğrenciyi ekleyelim yalnız numarası “Fatma EKTİ” ile aynı olsun yani numarası 5 olacak
Şekilde veri girişi yapalım:
Burada numarası 5 olan kaydı kabul etmedi çünkü 5 numara başka bir öğrenciye aitti. Daha önceki
örnekte ise kaydı kabul etmişti. Bunun sebebi, no sütununu PRIMARY KEY olarak atamamızdan
kaynaklanmaktadır.
9
4.9. TABLO ÖZELLİKLERİNİ GÖRME
Tanımladığımız tablonun özelliklerini görmek için DESCRIBE komutu kullanılır. Bu komutun kulla-
nım şekli aşağıdaki gibidir:
DESCRIBE tablo_ismi; Oluşturduğumuz tablonun özelliklerine baktığımızda NO alanının auto_inc-
rement değer aldığını ve aynı değeri bir daha almayan anahtar veriler alacağını öğrenmiş olduk.
Aynı zamanda type kısmında veri türlerinin neler olduğunu ve kaç karakterlik tahsis yapıldığı gözük-
mektedir.
4.10. VERİ TİPLERİ
Veri tipleri ve kullanım şekillerinden aşağıdaki bilgileri bilmekte fayda var. Bunlar en çok kullanılan
veri tipleridir.
Bir veri tabanı içine birden fazla tablo eklemek mümkündür. Bu uygulamamızda “OKUL “ veri tabanı
altına eklediğimiz “ogrenci” tablosunun yanına “velibilgi” diye başka bir tablo oluşturalım.
Veli Bilgi Tablosunu oluştururken aşağıdaki tablodan faydalanabiliriz:
Create table velibilgi(no int unsigned not null auto_increment primary key, isim varchar(25),is
varchar(20),gelir int, adres varchar(60), tel int;
10
SHOW TABLES; komutu ile oluşan tabloları görebiliyoruz. Daha önceki örneğimizde “ogrenci” tab-
losunun içine bilgiler eklemiştik. Şimdi ise “velibigi” tablosu içine bilgi ekleme işlemi gerçekleştirece-
ğiz.
Yukarıdaki tabloyu kullanarak bilgi girişlerini gerçekleştirelim:
Şimdi de verileri doğru girip girmediğimizin kontrolünü yapalım. Bunun için “Select * from table;”
komutunu kullanacağız.
Görüldüğü üzere bilgileri veri tabanımıza doğru bir şekilde kaydettik.
11
4.11. TABLOYA ALAN EKLEME
Var olan bir tabloya alan ekleme ihtiyacı olabilir. Bu gibi durumlarda ise ALTER TABLE komutunu
kullanırız. Bu komutun kullanımı şu şekildedir:
ALTER TABLE tablo_adi ADD alan_adi alan_turu;
Örnek: Velibilgi tablomuza telefon alanı ekleyelim.
Burada telefon bilgilerini girmediğimiz için NULL değeri gözükmektedir.
4.12. TABLODAN ALAN SİLME
Var olan tablodan bir sütunu silmek için ise şöyle bir ifade yazarız:
ALTER TABLE tablo_adi DROP COLUMN sütun_adi;
Örnek: Velibilgi tablomuzdan telefon alanını silelim.
Yukarıda da görüldüğü gibi alanımızı başarılı bir şekilde temizlemiş olduk.
4.13. TABLO ADINI DEĞİŞTİRME
Bir veri tabanında tablo adını değiştirmek için aŞağıdaki şekilde bir yol izlenir:
ALTER TABLE mevcut_tablo_adi RENAME TO yeni_tablo_adi;
12
Komutu çalıştırdığımızda sıkıntısız bir şekilde tablo adı değişti. Biz uygulamalarımızda velibilgi tablo
adını kullanacağımız için eski ismine geri getiriyoruz. Buraya kadar yaptığımız uygulamaları bir to-
parlayacak olursak OKUL adında bir veri tabanı oluşturmuştuk. Bunun içine “ogrenci” ve “velibilgi”
adında iki tane tablo ekleyip tablolara ayrı ayrı veri girişi yaptık.
4.14. SORGULAMA OPERATÖRLERİ
Bazı durumlarda girdiğimiz verileri belli bir silsile dâhilinde çağırmanız gerekebilir. Bu gibi durum-
larda sorgulama operatörlerini kullanırız. Daha önce oluşturduğumuz örnekler üzerinde sorgulama
işlemini gerçekleştirelim.
SELECT seçme manası gelir, WHERE ise nereden alınacağını söyler. Bu komutun kullanımı şu
şekildedir: SELECT sütunlar FROM tablo_ismi WHERE koşullar;
Örnek: Velilere toplantı davetiyesi gönderilecek, veli isimleri ve adresleri gerekli, Şimdi “velibilgi”
tablomuzdan sadece velilerin ismini ve adresini çağıralım:
Örnek: Öğrencilere sosyal yardımda bulunulacak. Velisinin geliri aylık 1.250 TL’nin altında olan veli
listesini çıkartalım:
13
Sorgu yaptırdığımızda bir kaydın çıktığı görünmektedir.
4.15. KOŞULA BAĞLI SORGULAMA YAPMA
Yukarıdaki örnekte de uyguladığımız gibi WHERE parametresi koşula bağlı sorgulama işlemlerinde
kullanılır. Bu parametrenin kullanımını birkaç örnekle biraz daha pekiştirelim.
Örnek: Cinsiyeti KIZ olan öğrencilerin listesini alalım:
Örnek: Cinsiyeti KIZ olan 10A sınıf öğrencilerinin listesini alalım:
Order By ASC/DESC: Bu komut ile verileri alfabetik olarak sıralayabiliriz.
ASC: Artan-Küçükten büyüğe doğru (A-Z)
DESC: Azalan-Büyükten küçüğe doğru (Z-A) sıralama işlemi gerçekleştirir.
Örnek: Tüm öğrencileri alfabetik olarak sıralayalım (A-Z):
Şimdi de isimleri tersten (Z’den-A’ya) göre sıralayalım. Bu sefer ASC yerine DESC ifadesini kullanı-
yoruz.
14
ASC-DESC komutu sadece metinsel ifadeleri değil sayısal ifadeleri de sıralamak için kullanılır. Ör-
neğin “ velibilgi” tablosundan velilerin sosyal durumlarını öğrenmek için gelirlerine göre azdan çoğa
doğru sıralatalım:
Sorgu Sınırlama(LIMIT): LIMIT parametresi ile sıraladığımız listeye bir sınır koyabiliriz. Şöyle ki
geliri düşükten yükseğe doğru sadece 3 veli isminin listelenmesini istiyoruz.
Şimdi de sıralama alanımızı biraz daraltıp İşçi statüsünde olan velilerin gelirlerini sıralayalım:
4.16. VERİLERİ GÜNCELLEME
Var olan veri yerine başka bir veri girmek için bu komut kullanılır.
Update: Verileri güncellemek için bu komut kullanılır. Kullanımı şu şekildedir:
UPDATE tablo_ismi SET alan=’Yeni Değer’ where ‘Değişecek Kayıt’;
Örnek: Aşağıdaki tabloda 3 numaralı öğrenci Osman KOÇAK’ın isim bilgilerini güncelleyelim. KO-
ÇAK yerine KOÇ, sınıfını da 9A yerine 10A olarak ayarlayalım:
15
Şimdi komutun uygulanıŞ biçimine bir göz atalım:
4.17. HAZIR FONKSİYONLAR
Sql dilinde kullanılan hazır fonksiyonlar vardır. Bunlar işlerimizi kolaylaştırmakla beraber sorguda
bize kolaylık sağlar.
Count: Toplam Kayıt sayısını bulur.
Kullanımı: Count(Sutün_Adı) Örnek: Daha önce oluŞturduğumuz ogrenci tablosundaki kayıt sayı-
sını bulalım:
Görüldüğü gibi tablomuzda 5 kayıt bulunmuş ve listelenmiştir. Sütun olarak ilk sütundaki verileri
saydıracağız diye bir şart yoktur. İstenirse sınıf, isim, yaş, cinsiyet de saydırılabilir.
Sonuç yine aynı çıkacaktır.
Min /Max: Minimum ve maksimum değerleri bulur.
Örnek: Ogrenci tablosundaki öğrencilerden en küçük yaşı bulalım:
16
Öğrencilerden en küçük yaş 16 bulundu.
Örnek: Ogrenci tablosundaki öğrencilerden en büyük yaşı bulalım:
Öğrencilerden en yüksek yaş 18 bulundu.
Distinct: Bu fonksiyon tabloda sütun içlerindeki benzer olan verilerden sadece bir tanesini sorguya
ekler.
Bu fonksiyon için velibilgi tablomuzu kullanalım:
Yukarıdaki tabloyu incelediğimizde 2 öğretmen, 2 işçi ve 1 memur var. Bu fonksiyon, bu bilgileri
filtreleyip yalnız bir tanesini işleme sokacaktır.
Örnek: Velilerin hangi işlerle meşgul olduğunu görmek istersek
Dikkat ettiğiniz gibi bu fonksiyon tekrarlı verileri ayıklayıp birer numunelerini listeletmektedir. Bu
fonksiyonu elektronik tablolama programındaki veri filtreleme özelliğine de benzetebiliriz. SQL ko-
mut ve fonksiyonları, buraya kadar anlattıklarımızla sınırlı olmayıp daha farklı türlerde olanları mev-
cuttur.
5. PHP İLE MYSQL PROGRAMLAMA
Buraya kadar gördüğümüz üzere SQL dilini DOS komut sistemi ekranına benzer bir ekranda kodla-
yıp, veriler girip düzeltmek çok kolay bir iş değildir. Bunun için piyasada çeşitli programlar mevcuttur.
Bunların en bilinenleri MYSQL-Front ve PhpMyAdmin programlarıdır. Bu programlar, görsel olarak
bizim yaptığımız işlevleri arka planda SQL komutlarına çevirir. Bu uygulama faaliyeti içerisinde PHP
ile uyumlu çalışan PhpMyAdmin programını inceleyeceğiz.
17
5.1. VERİ TABANI PROGRAMLARIYLA ÇALIŞMA
PhpMyAdmin, PHP web programlama dili ile kodlanmış olan ve MySQL veri tabanı yönetim desteği
sağlayan bir web uygulamasıdır. Dersimizin ilk modülünde yer alan konular içerisinde kurulumunu
yapmış olduğumuz PHP+Apache+Mysql paketleri içinde yer alan PhpMyAdmin’den faydalanacağız.
Öncelikle PhpMyAdmin programımızı çalıştırmak için web tarayıcımızın adres çubuğuna http://lo-
calhost ya da 127.0.0.1 yazıyoruz. Karşımıza gelen pencereden phpMyAdmin Database Manager
seçeneğini seçiyoruz.
Resim: Appserv bilgi ekranı
5.2. YENİ BİR VERİ TABANI OLUŞTURMA
Burada veri tabanı sunucumuza bağlanıp veri tabanı işlemlerini gerçekleştireceğiz. Bazı durumlarda
yukarıdaki ekran gelmeyebilir. PhpMyAdmin’e bağlanmak için http://127.0.0.1/phpMyAdmin/ veya
http://localhost/phpMyAdmin ifadelerini adres çubuğuna girmemiz gerekebilir.
18
Resim: PhpMyAdmin ekranına giriş paneli
Gelen erişim ekranının üst kısmına kullanıcı adımızı, altına ise kurulumda kullandığımız şifreyi giri-
yoruz. Kullanıcı adı, kurulumda varsayılan (default) olarak root ayarlanmıştı. Parola ise bizim girdi-
ğimiz değer olacaktır. Görülen bu ekran bizim veri tabanı yönetim ekranımız olacaktır.
Sol tarafta veri tabanlarının listelemesi yapılabilmektedir. Veri tabanları yazan bağlantıya tıklayarak
mevcut veri tabanlarının listesi görebilir ve yeni veri tabanları oluşturabiliriz.
19
Resim: PhpMyAdmin ekranından veri tabanları görüntüsü
Yukarıdaki pencereden faydalanarak sunucuda 3 tane veri tabanı olduğunu görüyoruz. Biz de OKUL
adında yeni bir veri tabanı oluşturalım. Veri tabanının adını yazıp “Oluştur” diyoruz.
Resim: PhpMyAdmin ekranında veri tabanı oluşturma
Veri tabanı oluşturuldu. Aynı zamanda veri tabanı oluşturmak için kullanılan SQL komutunun sorgu-
suna da ekranda görebilirsiniz. Şimdi de oluşturduğumuz veri tabanı içine tablo ekleme aşamasına
sıra geldi.
Resim: PhpMyAdmin ekranında alan oluŞturma
Veri tabanımızda kullanacağımız tablo ismi ogrencibilgi olsun. Bu tablo da toplam 5 alandan oluş-
sun. Git butonuna tıkladığımızda karşımıza aşağıdaki şekilde bir tablo gelecektir:
20
Resim: PhpMyAdmin ekranında alan biçimi
Gelen bu tabloyu aşağıdaki gibi dolduralım:
Resim : PhpMyAdmin ekranında alan biçimi belirleme
Burada id (identification – Kimlik) alanını öğrenci numarası gibi düşünebiliriz. No yerine id kullandık.
Id aynı değeri almayan ve otomatik değer alan tam sayı türünde olan ifadeler için kullanacağımız
alan adımızdır. Bunun için tablomuzun Ekstra bölümünde id alanına auto_increment (otomatik de-
ğer alma) özelliği vermiş olduk. Diğer alanları da text ve varchar karakter olacak şekilde ayarlayıp
alabileceği karakter değeri olarak da belli uzunluklar tahsis ettik. Bu değerler yukarıdaki tablomuzda
gözükmektedir.
5.3. VERİ TABANI SUNUCUSUNA BAĞLANTI KURMA
Veri tabanı sunucumuza bağlanma komutu olarak mysql_connect() fonksiyonu kullanılır. Bu fonk-
siyonun kullanımı aŞağıdaki gibidir: Mysql_connect(sunucu_adi, kullanici_adi, sifre) Kullanıcı
adı ve parola veri tabanı programı kurma esnasında girdiğimiz değerlerdir. Bu fonksiyon veri tabanı
sunucumuza bağlanma komutudur. MySQL sunucusu ile bağlantı kuramazsa FALSE değerini dön-
dürür. İstenirse döndürdüğü bu değer, bir kontrol yapısı içinde kullanılarak bağlantının yapılıp yapıl-
madığı kontrol edilebilir. İlk olarak ayar.php dosyamızı oluşturup programımıza, Mysql sunucumuza
tanıtalım.
21
Oluşturduğumuz ayar dosyamızı sunucumuzun bulunduğu dizinde www klasörü içene ayar.php
olarak kaydedelim.
Resim : Ayar.php dosyasının kayıt konumu
Tarayıcımızın adres çubuğuna ilgili adresi yazıp çalıştırdığımızda ise karşımıza şu şekilde bir ekran
gelecektir:
Resim : Ayar.php dosyasını test etme -1
Buradan yaptığımız bağlantının doğru olduğu anlıyor ve bir sonraki aşamaya geçebileceğimiz so-
nucuna varıyoruz. Ayar.php dosyamızda 2, 3 ve 4 numaralı satırların değerlerinden herhangi birini
değiştirdiğimiz zaman bağlantı hatası alabiliriz. Bu değerlerden birini değiştirerek ayar.php dosya-
mızı tekrar çalıştıralım.
22
Resim : Ayar.php dosyasını test etme -2
Yanlış şifre değeri girildiğinde alınan hata yukarıdaki gibi olacaktır. Veri tabanımıza bağlantıyı sağ-
ladıktan sonra veri tabanımıza veriler girmeye sıra geldi. Öncelikle PhpMyAdmin programı ile daha
önce oluŞturduğumuz veri tabanını ve tabloyu hatırlayalım.
Veri ekleme işlemini daha hızlı gerçekleştirmek için form kullanalım. Web editörü programı kullana-
rak bu işi kolayca yapabiliriz.
Form.php dosyamızı kaydettik. ġimdi de form ile gönderilen bilgileri veri tabanına eklemeye sıra
geldi. Bunun için de Ekle.php dosyamızı oluŞturalım.
5.4. TABLOYA BİLGİ EKLEME
Form ile gönderilen bilgiler $_POST metodu ile alınmaktadır. Aldığımız bu bilgileri 3-6 satırlar ara-
sında değiŞkenlere atıp 12. satırda veri tabanına ekliyoruz.
23
12. satırda ekleme işlemi $ekle değişkeni ile kontrol edilmektedir. Insert INTO komutu ise ekleme
işlemini gerçekleştiren komuttur. Sayfamızı ekle.php olarak kaydederek buraya kadar kodları çalış-
tıralım. Adres çubuğuna http://localhost/form.php yazıp formumuzu çağırıyoruz.
Formumuzu doldurup KAYDET butonuna tıklıyoruz. Kaydet tuşundan sonra ekle.php dosyası çağ-
rılacak ve forma girdiğimiz bilgiler ekle.php yardımıyla veri tabanımıza kaydedilecektir.
Veri tabanımıza farklı üç tane daha kayıt girmek için forma geri dönelim. Toplam 4 adet kayıt girmiş
olduk ve Şimdi tarayıcımızın adres çubuğuna http://localhost/PhpMyAdmin adresini yazıp veri taba-
nına bağlanalım.
24
Resim : PhpMyAdmin penceresi
PhpMyAdmin penceresinde Gözat butonuna tıklayarak kaydettiğimiz verilere ulaşabiliyoruz.
Resim : PhpMyAdmin penceresinde kayıt listeleme
5.5. TABLODAN BİLGİLERİ OKUTMA
Veri tabanına girdiğimiz bu verileri okutmaya sıra geldi. Bunun için oku.php dosyasını oluşturuyoruz.
Yukarıdaki örneği inceleyecek olursak 3. satırda veri tabanımıza kayıtlı bilgi adedi $sor değişkenine
atılıyor. 4. satırda ise $sor değişkenini mysql_fetch_array fonksiyonu yardımı ile sorgudan dönen
değişkeni diziye atmak için kullanılıyor. Kurduğumuz while döngüsü kayıt bitinceye kadar devam
etmektedir. 6 ile 10. satır arasında dizi değerleri sırası ile değişkenlere atılmaktadır. 12 ile 17. satırda
25
ise tablo yardımıyla veri tabanından çekilen değerler ekrana yazılmaktadır. Yazma işlemi döngü
bitinceye kadar devam etmektedir. Oku.php dosyasını çalıştırdığımızda ekrana aşağıdaki gibi bir
görüntü gelecektir:
Resim: Verilerin listelenmesi (oku.php)
5.6. TABLODAN BİLGİLERİ DÜZENLEME
Girdiğimiz kayıtları düzenlemek için oku.php sayfamızda tablonun altına DÜZENLE adında bir bağ-
lantı (link) oluşturuyoruz. Bu linke ait id parametresi düzenlenecek kaydın id numarası olup Du-
zenle.php ekranına ilgili sayfayı getirecektir.
26
Burada çağrılan id değeri href=”duzenle.php?id=”<?php echo “$id”;?> değeridir. Önce duzenle.php
dosyamızı bir oluşturalım. AŞağıda düzenle.php dosyamız mevcuttur:
Tarayıcımızla “oku.php”yi çalıştırıp oradan da “DÜZENLE” linkine tıkladığımızda karşımıza düzen-
lenecek sayfa gelecektir.
Resim : Oku.php dosyası
Burada DÜZENLE linkine tıkladığımızda id değeri yardımıyla duzenle.php dosyasından ilgili kayıt
çağrılacaktır.
27
Resim : Duzenle.php dosyasını test etme
6.PHP KOD GÜVENLİĞİ VE YANLIŞ BİLİNENLER
PHP uygulamaları ve kullanılabilecek güvenlik yöntemlerine dair birçok şey yazılıp çiziliyor fakat
yanlış bilinenler ve bu yanlış kullanımlar her şeye rağmen güvenlik zafiyetlerine sebebiyet veriyor.
Bu yazıda bilinen güvenlik fonksiyonlarının yanlış kullanımlarına ve exploit edilmelerine değinece-
ğim. İlk olarak XSS zafiyetine karşı alınan önlemlerle ilgili bir şeyler anlatmaya çalışayım.
6.1.XSS (CROSS-SİTE SCRİPTİNG)
XSS zafiyetlerine karşı bilinen ve incelediğim kaynak kodlarında en çok gördüğüm şey PHP fonksi-
yonlarından htmlspecialchars. Htmlspecialchars fonksiyonu özel HTML karakterlerini fonksiyona
belirtilen veri içerisinde arar ve bulduklarını kodlayarak HTML olarak yorumlanmalarını engeller. Fa-
kat htmlspecialchars sizi her zaman korumaz. Örnek bir hatalı kullanım için aşağıdaki PHP kod
alıntısına bakabilirsiniz;
…
$user = htmlspecialchars($_GET["user"]);
echo "<a href=xss.php?user=$user title="$user">Profiliniz</a>";
…
Görüldüğü üzere htmlspecialchars kullanılmış fakat bu uygulamayı koruduğu söylenemez. Çünkü
siz burada aslında sadece kendinizi avutmuş olursunuz bu kod ile. Neden mi? user parametresine
canberk%20onmouseover=alert(/XSS/) değerini girelim ve sonucu görelim.
Resimde görüldüğü üzere browser yolladığımız değeri yorumladı ve aşağıdaki resimde göreceğiniz
üzere başarıyla onmouseover olayı gerçekleştiğinde alert fonksiyonunu çağırdı.
28
Peki neden böyle oldu, htmlspecialchars neden korumadı beni derseniz cevabı çok basit, biz gön-
derdiğimiz değerde herhangi bir html karakteri yollamadık ki denetime takılsın. Eğer tırnak ile ara-
lansaydı link bu XSS'ten bahsedemeyecektik. Maalesef bu hataya düşen birçok uygulama ile karşı-
laşabiliyoruz.
Yapılan bir diğer hata ise platforma güvenerek kod yazmak. Nasıl olsa platform bana bir şeyler
sağlıyor fikriyatı ile magic_quotes_gpc'nin verdiği güven ile kod yazmakta uygulamanın çuvallama-
sına sebep olabiliyor. Bu örnekte magic_quote_gpc'nin desteğini arkasına almış bir uygulama ile
karşı karşıyayız.
...
echo "<a href="xss.php?user=$user" title="$user">Profiliniz</a>";
...
Tamam her şey çok güzel gözüküyor, çift tırnak kullanmışız, magic_quotes_gpc'de açık, daha ne
isteriz? Tabikide saldırganın canberk"%20onmouseover=alert(/XSS/)%09 değerini girmesini isteriz.
Yollanan değerde tek çift tırnak var o da bir öncekinin kapanmasını sağladı ve magic_quotes_gpc'ye
rağmen browser çift tırnak içindeki veriyi xss.php?user=canberk olarak algıladı ve yine bize izin
verdi. Ferruh Mavituna'nın 5.sayıda yazdığı “Web Uygulamalarında Güvenli Platform Seçimi” yazı-
sını hatırlamakta fayda var. *1+
6.2.SQL INJECTİON
SQL Injection zafiyetlerine maruz kalan web uygulamalarında karşılaştığım en büyük hatalardan
biriside mysql_real_escape_string (mres) fonksiyonuna karşı duyulan inanılmaz güven. İlk XSS ör-
neğinde olduğu gibi sorguya gelen veriyi çift tırnak ile çevrelemeden sadece mres'e güvenerek yo-
luna devam eden birçok web uygulaması var ve ne zaman bu tip bug'ları avlasam geliştiricisine
detaylıca açıklıyorum ve “ama mres fonksiyonundan geçirdim...” gibisinden ortak cevaplar alıyorum.
Aşağıdaki örneği bir inceleyelim.
...
$id = mysql_real_escape_string($_GET["id"]);
29
$query = mysql_query("SELECT * FROM tblUsers WHERE `userId`= $id ORDER BY userName");
...
Bu kodun güvenli olduğunu iddia eden birçok geliştirici bulabilirsiniz, çünkü inandıkları(!), öğrendik-
leri(!) kaynaklar bazı şeyleri üstü kapalı işlediği için hiçbir zaman hatayı neden yaptığını anlayama-
yacaktır.
Normal şartlarda uygulama aşağıdaki gibi bir cevap dönmektedir.
Biz bu açığı msre'ye rağmen exploit edebiliriz. Aynen aşağıda yaptığım gibi.
Kullandığım hiçbir karakter msre'ye takılmadı ve başarıyla exploit edilebildi. Bu hataya düşen birçok
uygulama bulmak mümkün.
Bu örnektede aldığımız veriyi tırnak işaretleri ile çevrelemek en mantıklı çözüm olacaktır. Yalnız
kullandığımı tırnak işaretinede dikkat etmek şart. Mesela msre ` (left quote) karakteri için herhangi
bir kaçırma işlemi uygulamıyor. Aldığınız parametreyi veri değilde alan olarak kullanacağınız zaman
left-quote karakterini kullanabilirsiniz fakat bu da güvenlik sorunu doğuracaktır. Aşağıdaki örneğe
bir bakın;
...
$table = mysql_real_escape_string($_GET["table"]);
$query = mysql_query("SELECT * FROM `$table` WHERE `userId`=1");
...
Veri çekilecek olan tablo adını kullanıcıdan almak(!) her ne kadar güvenli gibi dursada msre left-
quote'lara izin verdiği için güvenli olmayacaktır. İşin kötü yanı ise sorgunuzda kullanıcı tarafından
sağlanan tablo adı, kolon adı gibi verileri tırnak işaretleri ile kullanamıyor olmanızdır. Bahsettiğim
durumu exploit etmek için,
tblUsers`+where+`userId`=1+and+2=9+union+select+1,version(),0x4343--%09x
değeri yollamak bizi sonuca götürecektir.
30
6.3.FILE INCLUSION
Her ne kadar biraz geç gelen yama (6 yıl sonra!) NULL byte ile file inclusion yapmayı tarihe gömmüş
olsada, bir gerçek var ki insanlar hala güncelleme yapmadan eski PHP versiyonları kullanıyorlar ve
geliştiriciler hala bir şekilde FI zafiyetleri bırakıyorlar. FI zafiyeti bırakmak istemeyen geliştiricilerin
en çok düştüğü hatalardan biriside kullanıcıdan aldığı değeri file_exists fonksiyonu ile denetleyerek
include etmesi. Yine güzel bir örnek hazırladım.
...
$file = $_GET["file"];
if(file_exists("includes/$file")) {
include "includes/".$file;
}
...
file_exists fonksiyonuna gelecek olası ../../../../etc/issue değeride gerçekten dosya sisteminde varol-
duğu için fonksiyonu true değeri dönecektir.
En çok karşılaşılan 3 zafiyeti ve bu zafiyetlere karşı ezbere alınan önlemlerin nasıl atlatılacağına
kısaca değindim, daha yaratıcı bir çok zafiyet gerçek uygulamalarda mevcut ve birilerinin onları av-
lamasını beklemekte. Yapılan yanlışlarla ilgili olarakta en temel sorun web güvenliğini anlamadan
önlem almaya çalışmaktır. Güvenli kodlamalar.
7. FORM İŞLEMLERİ
Formların internet siteleri üstündeki etkisini ve kullanım yöntemlerini anlayabilmek için öncelikle sta-
tik ve dinamik siteler arasındaki farkı iyi kavramak gerekir. O zaman öncelikle kısaca statik ve dina-
mik site kavramlarına bir bakalım.
Genel bir bakış açısıyla web siteleri iki kategoride incelenebilir. Bunlar, durağan ve etkileşimli web
siteleridir. Durağan, diğer bir ifade ile statik web siteleri web sayfalarının hazırlandıktan sonra hiçbir
değişime uğramayan ve sadece tek taraflı bilgi akışının olduğu sayfalardır. Bilgi, web sayfası sunu-
cusundan sayfayı ziyaret eden internet tarayıcısına, diğer bir ifade ile istemciye doğrudur. Site ta-
mamen siteyi oluşturan kişi tarafından düzenlenebilir.
31
İkinci web sitesi çeşidi ise, günümüzde yaygın olarak kullanılan dinamik (etkileşimli) web siteleridir.
Dinamik sitelerde kullanıcı etkileşimi ön plandadır. Web sayfalarına yeni içerikler eklenebilir, var
olanlar güncellenebilir ya da silinebilir. Dinamik web sitelerinde, bilgi, web sayfası sunucusundan
sayfayı ziyaret eden tarayıcıya olabileceği gibi tarayıcıdan web sayfası sunucusuna doğru da olabi-
lir.
Dinamik bir web sitesi, her kullanıcı için ya da her ziyarette özel olarak oluşturulabilir. Dünya üzerin-
deki her kullanıcı, bir siteye kendi kullanıcı adıyla girdiğinde diğer kullanıcılardan farklı bir içeriğe
erişebilir. Bu farklı içerik, web sitesinin renkleri, teması, müzikleri, sitedeki yetki derecesi vb. şeklinde
olabilir. Günümüz internetindeki popüler siteler dinamik sitelerdir.
Dinamik web sitelerini hazırlamada en çok kullanılan yapı formlardır. HTML formları çeşitli kontrolleri
içeren ve ziyaretçi tarafından değiştirilebilen yapılardır. Formların içerdiği kontrol yapıları şunlardır;
buttonlar (button, submit, reset),
 checkbox,
 radio,
 text,
 hidden,
 password,
 textarea,
 select,
 option,
 file,
 image.
7.1. FORM OLUŞTURMA
Bir HTML formu <form> etiketi ile başlar ve </form> etiketi ile sonlanır. Bu etiketler arasına yerleşti-
rilen kontrol yapılarıyla formumuzu oluşturmuş oluruz. HTML formları çeşitli görevleri yerine getir-
mek için kullanılabilir. Örneğin anketler, yorum bölümleri, kullanıcı üyelik bölümleri, forumlar, sosyal
paylaşım sitelerindeki video paylaşımı, resim paylaşımı ya da paylaşılanların beğenilmesi, derece-
lendirilmesi vb.
<form> etiketinin üç temel özelliği form oluşturmak için önemlidir.
 action: Formdaki bilgilerin gönderileceği url adresi.
 method: Bilginin gönderilme yöntemi.POST yada GET yöntemlerine sahiptir. Değer atanma-
dığı durumlarda GET yöntemi kullanılır. İleri konularda kullanımlarına değinilecektir.
 name: Formun ismidir. Bu özelliğe değer verirken PHP’nin değişken kurallarına uymak ge-
rekir.
32
PHP’de değişken ismi verirken boşluk ya da özel karakter kullanamadığımızı hatırlayınız.
Örnek:
<form action= "url_adresi" method= "get name’’= "form_ismi"></form>
Form etiketi bir formun oluşabilmesi için önemlidir fakat form kontrol yapıları olmadan anlamlı bir
form oluşturmuş olmayız.
7.2. FORM KONTROL YAPILARINI KULLANMA
HTML formlarının etkin bir şekilde kullanılması kontrol yapıları ile mümkündür. Kontrol yapıları sa-
yesinde amaca uygun formlar oluşturulabilir ve internet kullanıcılarının kullanımına sunulabilir. Kont-
rol yapıları sahip oldukları çeşitlilikle kullanıcıların kolay ve anlaşılabilir bir şekilde formları kullan-
malarını sağlamaktadır.
Formlarda kullanılan kontrol yapıları oluşturulurken her kontrolün sahip olduğu “name” özelliği var-
dır. Name özelliği formlardan gelen bilgi elde edilirken kullanılmaktadır.
Form kontrol yapıları aşağıda kullanımları ile listelenmiştir.
7.2.1. <input> Kullanımı
Genel amaçlı bir form etiketidir. Sonlandırıcı etiketi yoktur. Girdi türü type öğesinde belirtilerek farklı
girdilerin alınmasını sağlar.
33
Örnek:
7.2.2. <textarea> Kullanımı
Formumuza uzun metinler yazmak için kullanılmaktadır. Örneğin adres bilgisi ya da yorum girişi için
kullanılabilecek bir form elemanıdır.
<textarea rows="5" cols="20" name="adres"></textarea> şeklinde kullanılır.
<textarea> ile kullanılan;
7.2.3. <select> ve <option> Kullanımı
Formlarımızda seçim kutuları oluşturmak için kullanılan yapılardır. Örneğin bir şehir seçimi için kul-
lanılabilir.<select> ve <option> kullanılırken “name” özelliğinin <select> etiketi içerisinde “value”
özelliğinin ise <option> içerisinde kullanılması gerekmektedir.
<select name="sehir">
<option value="Ankara">Ankara</option>
<option value="İstanbul">İstanbul </option>
<option value="Samsun">Samsun</option>
</select>
7.3. POST VE GET METODU İLE FORMLARDAN BİLGİ ALMAK
PHP'nin en güçlü özelliklerinden biri HTML formlarına yaklaşım biçimidir. Bilinmesi gereken ilk
önemli durum, form içindeki tüm elemanların PHP tarafından aktif olarak . kullanılabilir olacağıdır.
34
Formların veri aktarabilmeleri için iki ayrı yöntem vardır. Bunlar POST ve GET yöntemleridir. Dola-
yısı ile PHP’de formlardan gelen bilgileri almanın da iki yöntemi vardır. Bunlar;$_POST,$_GET yön-
temleridir.
7.3.1. GET Metodu
GET metodu ile veriler iletildiğinde forma girilen tüm bilgiler adres satırında URL’ye eklenerek iletilir.
Örnek:
Aşağıda ‘form_get_1.html’ dosyasına dikkat edilirse herhangi bir PHP kodu içermemektedir. Bu-
nunla birlikte bu dosyada bulunan form bir PHP dosyasına yönlendirilmektedir.
‘formu_isle_1.php’ isimli dosya ise kendisine GET metodu kullanılarak gönderilen bilgileri alıp ek-
rana yazmak için hazırlanmış bir PHP dosyasıdır. Formdan gelen bilgiler $_GET değişkeni kullanı-
larak alınmaktadır.
Örnekte formu_isle_1.php’ sayfasının tarayıcı görünümüne dikkat edilecek olursa adres çubuğunda
bilginin URL’ye nasıl eklendiğini görebiliriz. Burada bilgilerin eklenme işini gerçekleştiren yapı HTML
<form> etiketidir. URL adresinden sonra “?” kullanılarak bilgi ekleme işlemi gerçekleşmiştir. Bilgiler,
değişken_ismi=değer şeklinde eklenmiş ve her yeni bilgi “&” işareti ile peşi sıra eklenmiştir.
35
HTML formlarında bu tür bilgiler <a>….</a> etiketi kullanılarak da oluşturulabilmektedir. Bu işlem
“URL sorgu cümlesi oluşturmak” olarak adlandırılabilir.
Yukarıdaki örneğin <a>etiketi ile oluşturulması şu şekildedir;
<a href=“formu_isle_1.php?isim=Hakan&yas=33”>URL Sorgu Cümlesi</a> URL sorgu cümleleri
çoğunlukla bir yazının devamını okumak için devamını okuyun linklerinde karşımıza çıkmaktadır.
Örnek:
Formdan gönderilen iki sayının toplamını ekrana yazan örneği hazırlayalım. PHP değişkenleri olan
$_GET ve $_POST değişkenleri bütün veri türlerini taşıyabilir.
36
GET yöntemi kullanılarak oluşturulan formlar çoğunlukla basit formlardır. Karmaşık formlarda ço-
ğunlukla POST metodu tercih edilir.
7.3.2. POST Metodu
POST metodu formlarda bilgiyi taşıma yöntemlerinden bir diğeridir. GET metodunun aksine bilgi
taşınırken URL adresinde görünmez. Bu yönüyle POST metodunun daha güvenilir olduğunu söyle-
yebiliriz. Ayrıca POST metodunda bilginin taşınması esnasında bir sınırlama yoktur.
POST metodunun kullanımı GET ile bezerdir. Oluşturulan formun “method” özelliği POST yapılarak
formun bu yöntemi kullanarak veriyi göndermesi sağlanır. PHP tarafında ise $_GET dizi değişkeni
yerine $_POST dizi değişkeni kullanılır.
Örnek:
Aşağıda ‘form_post_1.html’ dosyası ‘formu_isle_1.php’ isimli dosyaya yönlendirilmiştir.
‘formu_isle_1.php’ isimli dosya ise kendisine POST metodu kullanılarak gönderilen bilgileri alıp ek-
rana yazmak için hazırlanmış bir PHP dosyasıdır. Formdan gelen bilgiler $_POST değişkeni kulla-
nılarak alınmaktadır.
Notice: Undefinedindex:
Eğer php sayfanızda yukarıdaki hata mesajını ve hata satırını görüyorsanız bunun anlamı şudur:
$_GET yada $_POST dizi değişkenleri içine yazdığınız index isimleri bulunamadı. Formdan gelen
kontrol yapılarına verilen isimleri kontrol ediniz.
37
38
Örnek:
Bu örneğimizde POST metodu kullanılarak farklı form kontrol elemanlarından bilgi elde edilecektir.
‘form_post_2.html’ dosyasında Cinsiyet ve Yabancı Dil sırasıyla “radio” ve “checkbox” özelliğini ta-
şıyan form kontrolleridir.
Cinsiyet için kullanılan iki farklı “radio” özelliğindeki form kontrollerinin “name” özellikleri aynıdır. Bu-
nun anlamı iki farklı değerden sadece bir tanesinin ‘formu_isle_2.php’ dosyasına iletilecektir.
Yabancı Dil için kullanılan üç “checkbox” özelliğindeki form kontrollerinin “name” özellikleri de aynı-
dır. Farklı olarak “[ ]” (köşeli parantez) işaretleri eklenmiştir. Bunun anlamı, verilen isim üzerinden
değerler dizi olarak gönderilecektir. ‘formu_isle_2.php’ dosyasında ise diğerlerinden farklı olarak fo-
reach döngüsü kullanılarak dizi değişken içinden istenilen değerler elde edilecektir.
39
‘form_post_2.html’ dosyasında kullanılan iki kontrol nesnesi olan “reset” ve “submit” özelliğindeki
butonlara isim verilmemiştir. Bunun nedeni, PHP sayfasında elde edilmeyecek olan kontrol nesne-
lerine isim vermeye gerek yoktur.
40
Örnek:
Bu örneğimizde form yoluyla resim yükleme (upload) işlemi gerçekleştireceğiz. Resim yükleme iş-
lemi için diğer formlardan farklı olarak <form> etiketinin “enctype” özelliğinin “multipart/form-data”
olarak atanması gerekiyor. Bu atama ile birlikte formumuz MIME standartlarına uygun bütün dosya-
ların yüklemesini yapabilecektir.
Multipurpose Internet Mail Extensions (Çok amaçlı İnternet Posta Eklentileri); E-posta uygulama-
ları aracılığıyla gönderilecek olan iletiye çeşitli türdeki içeriği eklemek için kullanılan bir İnternet stan-
dardıdır.
Örneğimizdeki diğer bir fark ise “Resim Dosyası” alanı için oluşturulan “input” form kontrolünün
“type” özelliği “file” olarak atanmasıdır. Bu sayede kullanıcılar tarayıcıda “Gözat” (Browse) düğmesi
sayesinde forma istedikleri dosyayı gönderebileceklerdir.
Bu örnekte, resim dosyası olarak yükleme yapılacağı belirlendiği için, ‘form_isle_3.php’ dosyasında
yüklenen resim bir ‘img’etiketinin ‘src’ özelliğine atanarak resmin tarayıcıda gözükmesi sağlanmak-
tadır.
‘form_post_3.html’ dosyasında “Gözat” düğmesi tıklanarak bilgisayarımızda bulunan her hangi bir
dosyanın forma iliştirilmesi mümkün olmaktadır.
Formlara girilen bilgilerin kontrol edilmesi çok önemli bir konudur. Örneğin yukarıda Gözat düğmesi
kullanılarak bir resim dosyası yerine farklı bir formatta dosya yüklemesi yapılsaydı örnek istenildiği
gibi çalışmazdı. Dosyanın yüklenmesi gerçekleşirdi. Bununla birlikte ‘img’ etiketine bir resim dosyası
yolu verilmediğinden istenildiği gibi çalışmamış olurdu.
41
Örneğimizdeki dosyanın $_FILES özelliklerine şu kodla erişebiliriz.
<?php
foreach($_FILES[‘dosya’] as $anahtar=>$deger)
echo “$anahtar=>$deger<br />”;
?>
Yukarıdaki kodun ekrandaki karşılığı şu şekilde olacaktı.
name=>kizkulesi.jpg type=>image/jpeg tmp_name=>D:xampptmpphp7BA3.tmp error=>0
size=>56647
Formdan gelen dosyanın sunucuya kopyalanması işlemi için ‘copy’ komutu kullanılmaktadır. Copy
komutunun kullanımı şu şekildedir:
copy ( string $kaynak , string $hedef [, resource $bağlam ] )
 $kaynak dosyanın kaynak yolunu,
 $hedef ise dosyanın kopyalanacağı adresi belirler.
42
‘form_isle_3.php’ dosyasında kullanılan $_FILES dizi değişkeni küresel bir değişkendir. Formdan
gelen dosyanın elde edilmesi için kullanılmaktadır. $_FILES dizi değişkeninin sahip olduğu değerler
şunlardır:
 name: Dosyanın ismi
 type: Dosyanın türü.
 tmp_name: Kaynak dosyanın kopyasının yolu.
 error: Aktarım esnasındaki hata kodu.
 size: Dosyanın boyutu.
43
‘form_isle_3.php’ dosyasını görüntüleyen kaynak görüntüsü incelendiğinde resmin <img> etiketinin
‘src’ özelliğine bakıldığında resmin isminin olduğu görülecektir. Tarayıcıda görüntülenen resim su-
nucuya kopyalanan resimdir.
7.4. KULLANICIDAN GELEN BİLGİ VE GÜVENLİK
PHP’ de yazılmış bir uygulamanın en zayıf noktası, dilin kendisinde olan bir sorun değil, yazılan
uygulamanın bazı varsayımlara dayanarak güvenliği göz önünde bulundurmamasıdır.
Kod yazarken her zaman yazdıklarınızı dikkatlice inceleyip, kullanıcıdan gelen bilgilerin doğru ve
tam şekilde denetlenip onaylandığına emin olmanız gerekir. Kullanıcıdan gelen bilgiyi alıp işleme
koyduğunuz her durumda kendinize şu soruları sorabilirsiniz:
 Bu betik (kod ya da script) benim istemediğim dosyalara erişim, değişiklik veya silme imkanı
veriyor mu?
 Beklenmeyen bir bilgi geldiğinde de istenilen işlem yapılacak mı?
 Bu betik başka bir amaç için kullanılabilir mi?
 Bu betik, sistemde var olan başka betiklerle birlikte kötü amaçlı kullanılabilir mi?
 Yapılan işlemler daha sonra inceleme amacıyla kayda alınacak mı?
Yaptığınız projenin uygunluğuna göre kod yazmadan önce ve yazarken bu soruları sık sık kendinize
sormanız, proje bittiğinde değerlendirme yapıp değişiklikler yapmanızdan çok daha faydalı olacaktır.
Bu sayede proje tasarımını güvenlik düşünülerek yapmış olacak ve daha sonra güvenlik dolayısıyla
ciddi değişiklikler yapma zorunluluğunuz ortadan kalkacaktır. Güvenliğe vereceğiniz öncelikli önem,
daha sonra yapacağınız ve güvenliği riske atacak değişikliklerden çok daha faydalıdır.
Belirtilen bir değişkenin değerini, kaynağı veya geçerliliği bozacağını düşündüğünüz register_glo-
bals, magic_quotes ve benzeri ayarları kapatmanız iyi olabilir. Hata bildirim kipi 'error_repor-
ting(E_ALL)' kullanımı, aynı zamanda uyarıları da göstereceği için kodunuzda sorun olup olmadığı
hakkında daha iyi bilgi verebilir.
PHP’ de tip denetim yapısı katı değildir ve bu güvenlik sorunlarını tetiklemektedir. Uygulamanızda
değişken tiplerinin neler olduğunu bilmek ve mantıksal olarak kullanıcıdan gelen değişkenlerin tü-
rünü bilmek birçok durumda hataları ortadan kaldırabilir.
PHP’de kullanılabilecek çok sayıda tip tanımlama fonksiyonu vardır. Bu fonksiyonlardan bazıları
is_int, is_array, is_bool, is_null, is_float, is_numeric vb. dir.
44
Örnek:
Formlardan gelen bilgiler her zaman beklenen doğru bilgiler olmayabilir. Bazen istenmeyen bilgi-
lerde formlarla birlikte gönderilebilir. Bu bilgiler sayfalarımızın istenildiği gibi görünmesini engelleye-
bilir. Hatta çok daha ciddi problemler çıkmasına sebep olabilir.
‘htmlspecialchars’ fonksiyonu verilen metin içerisindeki HTML etiketlerinin işaretlere dönüştürülme-
sini sağlar.
Aşağıdaki örnekte POST yöntemi kullanılarak gönderilen bilgiler ‘htmlspecialchars’ fonksiyonu kul-
lanılarak HTML karakter dönüşümleri yapılmaktadır.
45
HTML karakter dönüşümü yapılmış olarak görüntülenen internet sayfasının kaynak kodu aşağıda
olduğu gibidir. Görüldüğü gibi HTML için özel anlamı olan ‘<’, ‘>’ işaretleri ‘htmlspecialchars’ fonksi-
yonu sayesinde sırasıyla ‘&lt;’, ‘‘&gt;’özel karakterlerine dönüştürülmüştür.
Aşağıdaki örnekte foreach döngüleri ile GET ve POST metotları ile gelen bütün değişkenlerin HTML
etiketlerinin dönüştürülmesi sağlanır.
8. DÜZENLİ İFADELER
Bilgisayar dünyasının Türkçe adıyla düzenli ifadeler, İngilizcesi ile regular expressions, konusu
bütün programlama dillerinde karşımıza çıkmaktadır. Her programlama dilinin düzenli ifadeler için
kullandığı farklı fonksiyonları bulunmaktadır. Bununla birlikte düzenli ifadelerde kullanılan söz dizileri
(desen, örüntü, İngilizce karşılığı patterns) ve bu söz dizelerini oluşturan işaret ve kurallar çok ben-
zerdir.
8.1. DÜZENLİ İFADE NEDİR?
Belirlenen kurallara uyan söz dizilerine düzenli ifade denir. En yaygın kullanıldığı şekliyle örnek ve-
rerek konuyu açalım. Bir form oluşturduğumuzu ve bu formda e-posta alanı olduğunu varsayalım.
Form gönderildiğinde giriş yapılan e-postanın gerçek olup olmadığını düzenli ifadeleri kullanarak
basit bir söz dizisi ile öğrenebiliriz.
46
Ya da bir metin içerisinde “PHP Matematik Fonksiyonları” ifadesini aradığımızı varsayalım. Bu ifa-
denin bulunması için PHP’de birçok fonksiyon (strstr, strpos vb.) kullanabiliriz. Bununla birlikte ben-
zer ifadelerin tümünü görmek istiyorsak ne yapmalıyız?
Örneğin “PHP Metin Fonksiyonları”, “PHP Tarih ve Saat Fonksiyonları” ifadelerini ve bunlara ben-
zeyen fakat aklımıza gelmeyen ifadelerin tamamını arama sonucunda görmek istiyorsak düzenli
ifadeler kullanabiliriz. Kısacık bir söz dizisiyle istediğimizi elde etmeyi sağlar.
2.1.1. Kullanım Amaçları
*Nasıl yazıldığını tam olarak bilmediğimiz bir sözcüğü aratabiliriz.
Örneğin, bir makalede "entrepreneurship" sözcüğünü bulmak istiyorsak, ancak ne şekilde yazıldı-
ğından emin değilsek, ilk ve son birkaç karakterini verip aratabiliriz.
*Bir metnin içindeki, özel bir forma uyan parçaları bulabiliriz.
Örneğin, düz bir metin içindeki tüm URL'leri (İnternet adreslerini), yalnızca ana yapıyı tarif ederek,
teker teker ayıklayabiliriz. (http:// ile başlayan ve arada noktalar içeren sözcükler)
*Aldığımız bir metnin, belli bir yapıya uyup uymadığını kontrol edebiliriz.
Örneğin, kullanıcılardan e-posta adresi girmelerini istediğimiz bir web sayfasında, metin kutusuna
girilen yazının geçerli bir e-posta adresi olabilecek formatta olup olmadığına bakabiliriz. (@ işareti
içerecek, belli karakterlerden oluşacak, ikinci blokta en az bir nokta olacak vs)
*Belli formatta aldığımız bir veriyi, istediğimiz başka bir formata çevirebiliriz.
Örneğin, bir XML belgesinden kopyaladığımız veriyi, kendi uygulamamızda kullanmamız için bir
PHP dizisi (array) haline getirebiliriz.
8.2. SÖZ DİZİSİ
En basit düzenli ifadeler, tek bir karakterden oluşur. Harfler, rakamlar, noktalama işaretleri gibi pek
çok karakter, kendisiyle eşleşen düzenli ifadelerdir. Yani, bir metinde a karakterini arıyorsak, girme-
miz gereken düzenli ifade, doğal olarak a karakteridir. Ancak, bazı karakterler, düzenli ifadelerin söz
dizisinde özel anlamlar ifade eder. Bu özel karakterler,  . * [ ] ^ $ sembolleridir. Aradığımız karakter,
bu özel karakterlerden bir tanesiyse, başına  karakteri koyarak, özel anlam içermesini engelleyebi-
liriz. Örneğin, bir metin içinde nokta karakterlerini bulmak istiyorsak, girmemiz gereken düzenli ifade
nokta
( .) değil ( . ) olmalıdır.
Düzenli ifadelerin, bazı özel sembollerle bir araya gelmesi sonucu, daha güçlü ve karmaşık düzenli
ifadeler elde edilir. Aşağıdaki tablolar, düzenli ifadelerin nasıl elde edildiğini açıklar:
47
8.2.1. Söz Dizisinde Kullanılan Özel Karakterler
Aşağıdaki tabloları bir anda anlamak mümkün olmayacaktır. Bu aşamada düzenli ifadeler için
PHP’de kullanılan preg_match fonksiyonunun kullanımına bakıp aşağıdaki tabloda verilen örnekleri
deneyerek ilerlemek işlerimizi kolaylaştıracaktır. Bu şekilde adım adım düzenli ifadeler konusunu
anlamak mümkün olacaktır.
Dikkat edilmesi gereken önemli bir nokta, söz dizileri oluşturulurken iki aynı simge arasına yazılma-
lıdırlar. Örneğin; /Bafra/ yada -Bafra- yada @Bafra@ gibi.
48
49
8.2.2. Söz Dizilerinde Görünmez (non-printing) Karakterleri Yakalamak
Bunu da şöyle izah edebiliriz: Örneğin bir metin yazarken satır sonuna geldiğinizde enter tuşuna
bastınız ve alt satıra geçtiniz. Oysa görünürde o noktaya basılmış herhangi bir karakter yoktur. As-
lında tam tersine sizin metin editörünüz o noktaya sizin göremeyeceğiniz bir karakteri, yani yeni satır
(newline) karakterini basmıştır. İşte aşağıda listesini verdiğimiz buna benzer görünmez karakterleri
yakalamak için yine  ters bölü anahtarını kullanmalısınız.
50
8.2.3. Söz Dizilerinde Geniş Aralıkları İçeren Karakter Setleri
Aşağıdaki karakter setleri rakam, harf ya da beyaz boşluk(enter, tab vb.) gibi geniş karakter grupla-
rını tanımlamak için kullanılır.
8.2.4. Söz Dizilerinde Sınırları Yakalamak
Düzenli ifadelerde kullanılan özel karakterlerden bazıları bir ifade ya da kelimenin sınırlarını belirle-
mek için olanıdır. Ama bu kullanımın diğerlerinden belirgin bir farkı vardır. O da aşağıda listesi veri-
len karakterlerin aslında fiziksel bir karşılıklarının olmayışıdır.
51
8.2.5. Yer Değiştirme
Bazı durumlarda arama işlemine ek olarak, bulunan söz dizisi örneğinin yer değiştirmesi de gereke-
bilir. Bu işlem için düzenli ifadelerin temel tanımına ait olmayıp, gelişmiş bir özellik olan bellek kulla-
nımı gereklidir.
Bu özellik kullanıldığında ifade gücü Tip – 3 dillerinin üzerine çıkar. Arama örüntüsü içinde ‘(‘ ile
başlayıp, ‘)’ ile biten parçalara yer değiştirme işleminde, 1 gibi numaralı bir yazmaç (register) ile
referansta bulunulur.(13)
8.3. PHP’DE DÜZENLİ İFADELER
PHP 5.3.0 sürümü ile birlikte düzenli ifadeler yaklaşımında değişikliğe gitmiştir. Bu sürümden önce
kullandığı POSIX standardını bırakarak PCRE standardına geçmiştir.
8.3.1. PHP’de Düzenli İfadeler İçin Kullanılan Fonksiyonlar
PHP’de kullanılan ve bizim bu modülde üzerinde duracağımız PCRE fonksiyonları preg_match ve
preg_replace’tir. Bütün PCRE fonksiyonları için http://www.php.net/manual/tr/ref.pcre.php adresini
ziyaret edebilirsiniz.
*preg_match ( string $soz_dizisi , string $metin)
52
$soz_dizisi ile belirtilen düzenli ifadeyi eşleştirmek için $metin içinde arama yapar.Eşleşme var ise
TRUE, yok ise FALSE değeri döner. Fonksiyona ait üç tane daha değer (parametre) vardır. Bunların
kullanılması zorunlu olmadığı için burada yer vermedik.
Şimdi düzenli ifadeler konumuzdan uzaklaşmadan adım adım düzenli ifadeleri kullanarak nasıl söz
dizileri oluşturacağımıza bir bakalım.
Basit bir örnekle başlayalım.
Örneğin “PHP ile Düzenli İfadeler” metni içinde “PHP” ifadesini arayalım.
Görüldüğü gibi istenilen söz dizisi metin içeresinde olduğundan preg_match fonksiyonu TRUE de-
ğerini döndürür ve ekrana “Eşleşme sağlandı.” mesajı çıkar.
Söz dizisini oluştururken PHP ifadesini “/” karakteri ile başlatıp sonlandırdık. Fonksiyonumuzun
doğru çalışabilmesi için bu gerekliydi.
Yukarıdaki örnekte metin içerisinde PHP ifadesi geçtiği sürece sonuç hep aynı olacak ve ekrana
“Eşleşme sağlandı.” mesajı çıkacaktır. Örneğin “PHP ile Düzenli İfadeler”, “Düzenli İfadeler ve PHP”,
“PHP öğreniyorum!”, “Bugünlerde PHP uygulamaları geliştiriyorum.”
Yukarıdaki örnekte aramanın büyük ve küçük harfe duyarlı olması için söz dizisini şu şekilde düzen-
lememiz yeterli olacaktır. /php/i
Şimdi bazı özel karakterler kullanarak arama sonuçlarını daraltalım.
Örnek:
53
Örnek:
Düzenli ifadeler için pratik bir örnek yapalım. Örneğimizde bir form oluşturup, form ile birlikte hem
söz dizisini hem de metni preg match fonksiyonuna gönderelim. Böylece bütün söz dizilerini tek bir
form üzerinden kontrol etmemiz mümkün olacaktır.
echo fonksiyonu içerisine yazılmış olan $_POST değişkenlerinin indexlerinin tek tırnak ya da çift
tırnak kullanılmadan yazıldığına dikkat edelim. Aynı zamanda echo fonksiyonunun doğru çalışabil-
mesi için $_POST değişkeni içinde tek tırnak karakteri olmamalı ya da ’ şeklinde kullanılmalı.
error_reporting(0; kod satırının PHP’de hata mesajlarını tarayıcıya göndermediğini hatırlayalım.
*preg_replace ( string $soz_dizisi , string $yeni_ifade, string $metin)
54
$soz_dizisi ile belirtilen düzenli ifadeyi eşleştirmek için $metin içinde arama yapar. Yapılan arama
sonucunda eşleşenlerin hepsi yeni ifade ile değiştirilir.
Örnek:
Bir ifade içinde “Bay” olarak geçen kelimeleri “Bayan” olarak değiştiren örneği yapınız.
Örnek:
Verilen ifade içinde http:// söz dizisini http_ ile değiştiren örnek.
55
Örnek:
‘preg_replace’ fonksiyonu kullanarak bir metinde olan <h1></h1> etiketini yazıdan çıkarmak.
Örnek:
‘preg_replace’ fonksiyonunu kullanarak bir metinde olan <h1></h1> etiketini yerine <u></u> etiketi
eklemek
56
9. OTURUM YÖNETİMİ
Oturum, bir kullanıcının bir web sitesini ziyaret etme sürecidir, diyebiliriz. Başka bir tanım ile, bilgi-
sayarınızın başına geçip tarayıcınızı çalıştırdığınız, web’ de sörf yaptığınız ve daha sonra tarayıcı-
nızı kapattığınız zaman arasında kalan süreç bir oturumdur.
Oturum Yönetimi kavramının gelişmesi internet sitelerinin ziyaretçilerine daha iyi, hızlı ve özgün
hizmet verebilmeleri ile ilgilidir. Amaç elde edilmiş verilerin kaybedilmeden kullanıcı yararına kulla-
nılması. ve kullanıcıların istek ve yönelimlerini tespit ederek siteyi en etkin bir şekilde kullanmalarını
sağlamaktır.
9.1. ÇEREZLER
İnternet sayfalarını gezerken sıkça karşılaştığımız kavramlardan biri olan Türkçe ismiyle çerezler
İngilizcesi ile cookies, kullanıcıyı ayırt etmenin en etkili yollarından biridir. Belki de bütün internet
siteleri ziyaretçileri hakkında bir takım bilgiler toplarlar. Kimi zaman bu bilgileri veri tabanına kimi
zaman ise kullanıcıların kendi bilgisayarlarına kaydederler.
Çerezler, internet sitelerinin kullanıcı bilgisayarına yerleştirdiği küçük boyutta dosyalardır. Tarayıcı-
nın bir sayfayı açtığı her tekrarda internet siteleri çerezlerini tekrar gönderir.
9.1.1. Çerezlerin Kullanım Yerleri
Çerezler, web sayfası ile bilgisayarımız arasındaki referansımızdır. Daha önce girdiğimiz bir web
sayfasına girişlerimiz çerezler sayesinde kaydedilebilir. Daha sonra aynı sayfaya girmemiz halinde
girdiğimiz sayfa bizi tanır, bize kimi referans bilgileri verir, sayfayı daha sonra ziyaret ettiğimizde bu
referans bilgileri web sayfasına otomatik olarak iletilir.
Çerezler çeşitli amaçlarla kullanılabilirler. Örnek verecek olursak bunlardan biri anket formlarıdır.
Anket formlarında oy kullandığınızda web sitesi bu durumu bir çerezle bilgisayarınıza kaydedebilir.
Siteyi tekrar ziyaret ettiğinizde anket sayfası bilgisayarınızdaki çerezleri kullanarak anket kullandı-
ğınızı tespit eder ve anketi tekrar kullanmanızı önler.
Bir başka örnek de üyelik sistemleridir. Üyelik sistemlerinde de çerezler anket sistemlerinde olduğu
gibi kullanılır. Sayfaya girişin bir kullanıcı adı ve şifre ile mümkün olduğunu varsayalım. Sayfaya üye
olduktan sonra kullanıcı adı ve şifre ile giriş yapılır. Kullanıcı adı ve şifre çerez ile kaydedilir. Daha
sonra bu internet sitesi aynı bilgisayardan tekrar ziyaret edildiğinde çerez bilgileri okunur. Kullanıcı
adı ve şifre çerezlerden alınarak kullanıcı oturum sayfası açılır. Aslında çerezler çok daha fazla
işlemde kullanılır.
9.1.2. PHP ile Çerezler
PHP HTTP çerezlerini destekler. Çerezler, uzak tarayıcıda veri saklamayı ve böylece geri dönen
kullanıcılar hakkında veri takibi yapmayı sağlar. Çerezleri, setcookie()işlevleri ile atayabilirsiniz. Çe-
rezler, HTTP başlığının birer parçasıdır, bu yüzden tarayıcıya bir veri göndermeden önce setcookie()
işlevini çağırmalısınız.
*Setcookie fonksiyonu
57
Kullanımı : setcookie (string $isim [, string $değer [, int $zaman_aşımı = 0 [, string $yol [, string
$alan [, bool $güvenlik = false [, bool $sadece_http = false ]]]]]] )
 $isim: Çerezin ismi.
 $deger:Çerezin değeri. Bu değer istemcinin bilgisayarında saklanır. Bu bakımdan çerezlerde
güvenlik ihlaline konu bilgiler saklamayın. İsim değiştirgesinde 'çerezim' ismini kullandığınız
varsayımıyla, bu çerezin değerini $_COOKIE['çerezim'] değişkeni ile alabilirsiniz.
 $zaman_aşımı: Çerezin zaman aşımına uğrama süresi. Değer bir Unix zaman damgasıdır.
Başka bir deyişle time() işlevinden dönen değere çerezin zaman aşımına uğrayacağı süreyi
saniye cinsinden eklemek suretiyle bulacağınız değerdir. Ayrıca, mktime() işlevini de kulla-
nabilirsiniz. time()+60*60*24*30 ile çerez 30 gün sonra zaman aşımına uğrar. Burada 0 atanır
veya bir şey belirtilmezse, çerez oturumun sonunda (tarayıcı kapandığında) zaman aşımına
uğrar.
 $yol: Çerezin üzerinde etkin olacağı sunucudaki yol. '/' belirtilirse çerez alanın tamamında
kullanılabilir olacaktır. Eğer '/isim1/' belirtilirse, çerez sadece /isim1/ dizininde ve /isim1/isim2/
gibi alt dizinlerde kullanılabilir olacaktır. Ön tanımlı değer çerezin atandığı içinde bulunulan
dizindir.
 $alan: Çerezin kullanılabileceği alan. Çerezi mesela.dom ve alt alanlarında kullanılabilir yap-
mak için değer olarak '.mesela.dom' belirtmelisiniz. Değer olarak, 'belge.mesela.dom' belirti-
lirse çerez sadece belge alt alanında kullanılabilir olacaktır.
 $guvenlik: Çerezin istemciye güvenli bir HTTPS bağlantısı üzerinden aktarılması gerektiğini
belirtmek için kullanılır. TRUE belirtildiği takdirde, çerez sadece güvenli bağlantı mevcutsa
gönderilecektir. FALSE ön tanımlı değerdir.
 $sadece_http: TRUE olduğu takdirde çerez sadece HTTP protokolü üzerinden erişilebilir
olacaktır. Yani çerez, JavaScript gibi betik dilleri tarafından erişilebilir olmayacaktır. Bu ayar-
lama, kimlik hırsızlığı riskini etkin şekilde azaltmaya yardımcı olabilir.
58
Örnek:
Örnekte <html> etiketinden önce setcookie kullanılmıştır. Bunun sebebi setcookie fonksiyonu
ile çerez oluştururken sayfaya herhangi bir bilgi gönderimi yapılmadan önce fonksiyon kullanılmalı-
dır.
Yukarıdaki cookie02.php sayfası ziyaret edildiğinde ekranda “test değeri” yazacaktır.
Yukarıdaki örnekte cookie01.php fonksiyonu şu şekilde düzenlenirse çereze zaman aşım süresi ek-
lenmiş olur. “time()” fonksiyonunun 60*60*24 ile çarpılması zaman olarak bir günü ifade eder.
“time()” fonksiyonu o anki zaman damgasını saniye cinsinden elde eder. Diğer ifadelerde 60 saniye,
60 dakika ve 24 saati ifade eder. Bu sayıların çarpımı bir günün saniye karşılığını verir.
setcookie(“test_cerezi”,$deger, time() + (60*60*24))
Çerez isimleri dizi isimleri olabilir. Böylece siz PHP betiğinizde bu çerezler için dizi kullanırken, kul-
lanıcının sisteminde bunlar ayrı ayrı çerezler olarak saklanırlar. Tek bir çereze çok sayıda isim ve
değer atamak için “explode” işlevini kullanabilirsiniz.
Örnek:
Şimdi de çerezleri kullanarak oturum yönetimi yapalım.
59
Yukarıda birinci dosya olan oturum_ac.php dosyası ile kullanıcı girişi yapılır. Bu aşamadan sonra
sayfa1.php dosyası açıldığında kullanıcı adı ve şifre ile çerez karşılaştırılır. Eğer yanlış ise sayfa
exit() fonksiyonu ile sonlandırılır. Değilse sayfa açılmaya devam edilir. Bu aşamada site içinde başka
bir sayfaya geçilmek istenirse kullanıcı adı ve şifrenin URL sorgu cümlesi ile taşınarak
(sayfa2.php?kullanici=ahmet&sifre=12345) her sayfanın başında çerezler ile karşılaştırılması ge-
rekir. Karşılaştırma için kullanılacak if cümlesi ise şu şekilde olmalı.
60
<?php
if ( $_COOKIE['kullanici']!=$_GET['kullanici'] and $_COOKIE['sifre']!= ]!=$_GET[sifre]){
echo "Şifreyi yanlış girdiniz...";
exit();
}
?>
‘exit’ fonksiyonu sayfanın çalışmasını sonlandırır.
Çerezlerle oturum yönetimi PHP oturum yönetimi kullanılmadan çok zayıf olacaktır. Oturum açmak
için tarayıcılar zaten “Kullanıcı adı ve şifre kaydedilsin mi?” şeklinde soru sormaktadır. Bu soruya
evet dediğinizde o sitenin kullanıcı adı ve şifresi çerezler yoluyla kaydedilmektedir. Bundan sonra-
sında PHP oturumu açılarak hem sayfalar arası geçişler çok daha kolay olur hem de çok sayıda
oturumla ilgili verileri saklama imkânı olur.
9.2. PHP’DE SESSİON (OTURUM YÖNETİMİ)
PHP'deki oturum desteği, belli bir veriyi sonraki erişimlerden korumak için kullanılır. Böylece daha
özelleştirilmiş uygulamalar oluşturabilir ve sitenizi daha fonksiyonel yapabilirsiniz.
Sitenize gelen her ziyaretçiye eşsiz bir kimlik atanır, buna oturum kimliği (session_id) diyoruz. Bu
kimlik istemci tarafından bir çerezde ya da doğrudan URL üzerinde saklanır.
Oturum desteği, internet sayfalarının çok sayıda (sayısı yazılımcıya bağlı) değişkeni oturuma kay-
detmenize izin verir. Böylece bir oturumun başlaması ile birlikte bütün değerler sayfalar arası geçiş-
lerde korunur.
PHP’de oturum yönetimi için kullanılan pek çok fonksiyon vardır. Bu modülde session_start() ve
session_destroy()fonksiyonları konu edilecektir. Aynı zamanda $_SESSION küresel değişkeni de
modülde konu edilecektir.
9.2.1. Session Kullanım Yerleri
Oturumun açılması ile birlikte çok sayıda değişkeni sayfalar arasında kullanabilmek, kullanıcıların
tarayıcı kapatılana kadar site üyelik bilgilerinin aktif olarak kullanılabilmesini sağlar. E-posta sistem-
leri, üyelik gerektiren sistemler bu yöntemi kullanırlar
E-ticaret sistemleri oturum yönetimi sayesinde müşterinin kişisel bilgilerinin yanında aktif oturumdaki
alış-verişlerini oturum değişkenleri ile birlikte taşır. Buna yaygın olarak alış-veriş sepeti denmektedir.
session_start() fonksiyonu
session_start() bir oturumu ya oluşturur ya da GET, POST veya çerez gibi bir istek üzerinden akta-
rılan oturum kimliğine istinaden eski bir oturumu geçerli oturum haline getirir. Oturum başarıyla baş-
latılabilmişse TRUE aksi takdirde FALSE döner.
Oturumun başlaması ile birlikte oturum değişkenlerinin tanımlanması mümkün olur. Oturum değiş-
kenleri $_SESSION dizi değişkeninde tanımlanır. Örneğin; $_SESSION[‘kullanici’] = ’ahmet’ gibi.
61
Oturum değişkenlerinin sayfalar arasında kaybolmadan dolaşabilmesi için session_start
fonksiyonunun sayfaya hiçbir HTML değeri gönderilmeden önce başlatılması gerekir.
‘Bu uygulamalar yaygın olarak veri tabanları ile birlikte kullanılır. Üye giriş sayfasında kullanıcı adı
ve şifre bölümü olur. Kullanıcının girdiği bilgiler veri tabanında doğrulanır. Eğer doğrulanma gerçek-
leşmişse oturum başlatılır ve oturum değişkenleri oluşturulmaya başlanır. Eğer bilgiler onaylanmaz
ise kullanıcı giriş sayfasına yönlendirilir.
session_destroy() fonksiyonu
session_destroy() işlevi geçerli oturumla ilişkilendirilmiş tüm veriyi yok eder. Kullanımı için aşağıdaki
örneği inceleyiniz.
Örnek:
session01.php dosyası ile oturum açılmış ve kullanıcı ile eposta adlı iki küresel oturum değişkeni
tanımlanmıştır.
3.Sayfa linki ile birlikte sayfa session03.php’ye yönlendirilmiştir. Bu sayfada yer alan oturum sonlan-
dırma linkinde oturum sonlandırma işlemi için URL cümlesi oluşturulmuştur. Bu linke tıklanınca
62
$_GET üstünden sayfaya oturumu kapatma değeri gönderilmiş, session03.php dosyası 3. satırında
yer alan session_destroy fonksiyonu ile oturum sonlandırılmış ve bütün oturum değişkenleri silin-
miştir.
63
Oturum devam ederken bir oturum değişkenini silmek için unset() fonksiyonu kullanılır. Ör-
neğin; unset($_SESSION[‘eposta’]) gibi.
64
Kaynakça
http://web.adu.edu.tr/panel/lesson/PHP.pdf
http://zafer.co/files/phpileoop.pdf
http://webguvenligi.org/dergi/PHPKodGuvenligiVeYanlisBilinenl
er-Aralik2010-CanberkBolat.pdf
http://www.sahinbeyoglu.com/Uploads/1274188635-php.pdf
http://www.serkanaksu.net/dersler/bpr253/ip02_php_degiskenler.pdf
http://80.251.40.59/ankara.edu.tr/demircan/apache_php_mysql_Y
DMA.pdf
http://suhagokalp.com/wp-
content/uploads/2015/03/PHPWebSiteYapimi.pdf
http://www.megep.meb.gov.tr/mte_program_modul/moduller_pdf/A
%C3%A7%C4%B1k%20Kaynak%20Kodla%20Temel%20Uygulama
lar.pdf
http://www.megep.meb.gov.tr/mte_program_modul/moduller_pd
f/A%C3%A7%C4%B1k%20Kaynak%20Kodla%20Form%20%C
4%B0%C5%9Flemleri%20Ve%20Oturum%20Y%C3%B6netimi
.pdf
http://www.megep.meb.gov.tr/mte_program_modul/moduller_pdf/A
%C3%A7%C4%B1k%20Kaynak%20Kodla%20Veri%20Taban%C4
%B1%20%C4%B0%C5%9Flemleri.pdf

Weitere ähnliche Inhalte

Was ist angesagt?

Adli Bilişim ve Adli Bilişim Araçları
Adli Bilişim ve Adli Bilişim AraçlarıAdli Bilişim ve Adli Bilişim Araçları
Adli Bilişim ve Adli Bilişim AraçlarıAhmet Gürel
 
Temel Linux Kullanımı ve Komutları
Temel Linux Kullanımı ve KomutlarıTemel Linux Kullanımı ve Komutları
Temel Linux Kullanımı ve KomutlarıAhmet Gürel
 
Bilişim Suçlarında IP Adres Analizi
Bilişim Suçlarında IP Adres AnaliziBilişim Suçlarında IP Adres Analizi
Bilişim Suçlarında IP Adres AnaliziBGA Cyber Security
 
[오픈소스컨설팅]Ansible overview
[오픈소스컨설팅]Ansible overview[오픈소스컨설팅]Ansible overview
[오픈소스컨설팅]Ansible overviewOpen Source Consulting
 
Sızma Testlerinde Armitage Kullanımı
Sızma Testlerinde Armitage KullanımıSızma Testlerinde Armitage Kullanımı
Sızma Testlerinde Armitage KullanımıBGA Cyber Security
 
Arp protokolu ve guvenlik zafiyeti
Arp  protokolu ve guvenlik zafiyetiArp  protokolu ve guvenlik zafiyeti
Arp protokolu ve guvenlik zafiyetiBGA Cyber Security
 
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 1, 2, 3
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 1, 2, 3Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 1, 2, 3
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 1, 2, 3BGA Cyber Security
 
INTERNET VE YEREL AĞ SIZMA TESTLERİ
INTERNET VE YEREL AĞ SIZMA TESTLERİ INTERNET VE YEREL AĞ SIZMA TESTLERİ
INTERNET VE YEREL AĞ SIZMA TESTLERİ BGA Cyber Security
 
Uygulamalı Ağ Güvenliği Eğitimi Lab Çalışmaları
Uygulamalı Ağ Güvenliği Eğitimi Lab ÇalışmalarıUygulamalı Ağ Güvenliği Eğitimi Lab Çalışmaları
Uygulamalı Ağ Güvenliği Eğitimi Lab ÇalışmalarıBGA Cyber Security
 
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 7, 8, 9
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 7, 8, 9Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 7, 8, 9
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 7, 8, 9BGA Cyber Security
 
Openstack live migration
Openstack live migrationOpenstack live migration
Openstack live migrationymtech
 
Siber Sigorta Nedir? Nasıl Yapılır?
Siber Sigorta Nedir? Nasıl Yapılır?Siber Sigorta Nedir? Nasıl Yapılır?
Siber Sigorta Nedir? Nasıl Yapılır?BGA Cyber Security
 
Glusterfs 파일시스템 구성_및 운영가이드_v2.0
Glusterfs 파일시스템 구성_및 운영가이드_v2.0Glusterfs 파일시스템 구성_및 운영가이드_v2.0
Glusterfs 파일시스템 구성_및 운영가이드_v2.0sprdd
 
SSH Tünelleme ile İçerik Filtreleyicileri Atlatmak
SSH Tünelleme ile İçerik Filtreleyicileri AtlatmakSSH Tünelleme ile İçerik Filtreleyicileri Atlatmak
SSH Tünelleme ile İçerik Filtreleyicileri AtlatmakBGA Cyber Security
 
Ankus 제품소개서
Ankus 제품소개서Ankus 제품소개서
Ankus 제품소개서onycom1
 

Was ist angesagt? (20)

EXPLOIT POST EXPLOITATION
EXPLOIT POST EXPLOITATIONEXPLOIT POST EXPLOITATION
EXPLOIT POST EXPLOITATION
 
Adli Bilişim ve Adli Bilişim Araçları
Adli Bilişim ve Adli Bilişim AraçlarıAdli Bilişim ve Adli Bilişim Araçları
Adli Bilişim ve Adli Bilişim Araçları
 
Temel Linux Kullanımı ve Komutları
Temel Linux Kullanımı ve KomutlarıTemel Linux Kullanımı ve Komutları
Temel Linux Kullanımı ve Komutları
 
Bilişim Suçlarında IP Adres Analizi
Bilişim Suçlarında IP Adres AnaliziBilişim Suçlarında IP Adres Analizi
Bilişim Suçlarında IP Adres Analizi
 
[오픈소스컨설팅]Ansible overview
[오픈소스컨설팅]Ansible overview[오픈소스컨설팅]Ansible overview
[오픈소스컨설팅]Ansible overview
 
Sızma Testlerinde Armitage Kullanımı
Sızma Testlerinde Armitage KullanımıSızma Testlerinde Armitage Kullanımı
Sızma Testlerinde Armitage Kullanımı
 
Kesif ve Zafiyet Tarama
Kesif ve Zafiyet TaramaKesif ve Zafiyet Tarama
Kesif ve Zafiyet Tarama
 
Arp protokolu ve guvenlik zafiyeti
Arp  protokolu ve guvenlik zafiyetiArp  protokolu ve guvenlik zafiyeti
Arp protokolu ve guvenlik zafiyeti
 
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 1, 2, 3
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 1, 2, 3Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 1, 2, 3
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 1, 2, 3
 
INTERNET VE YEREL AĞ SIZMA TESTLERİ
INTERNET VE YEREL AĞ SIZMA TESTLERİ INTERNET VE YEREL AĞ SIZMA TESTLERİ
INTERNET VE YEREL AĞ SIZMA TESTLERİ
 
Uygulamalı Ağ Güvenliği Eğitimi Lab Çalışmaları
Uygulamalı Ağ Güvenliği Eğitimi Lab ÇalışmalarıUygulamalı Ağ Güvenliği Eğitimi Lab Çalışmaları
Uygulamalı Ağ Güvenliği Eğitimi Lab Çalışmaları
 
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 7, 8, 9
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 7, 8, 9Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 7, 8, 9
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 7, 8, 9
 
10 Adımda Sızma Testleri
10 Adımda Sızma Testleri10 Adımda Sızma Testleri
10 Adımda Sızma Testleri
 
Openstack live migration
Openstack live migrationOpenstack live migration
Openstack live migration
 
Siber Sigorta Nedir? Nasıl Yapılır?
Siber Sigorta Nedir? Nasıl Yapılır?Siber Sigorta Nedir? Nasıl Yapılır?
Siber Sigorta Nedir? Nasıl Yapılır?
 
Glusterfs 파일시스템 구성_및 운영가이드_v2.0
Glusterfs 파일시스템 구성_및 운영가이드_v2.0Glusterfs 파일시스템 구성_및 운영가이드_v2.0
Glusterfs 파일시스템 구성_및 운영가이드_v2.0
 
Kablosuz Ağlarda Güvenlik
Kablosuz Ağlarda GüvenlikKablosuz Ağlarda Güvenlik
Kablosuz Ağlarda Güvenlik
 
SSH Tünelleme ile İçerik Filtreleyicileri Atlatmak
SSH Tünelleme ile İçerik Filtreleyicileri AtlatmakSSH Tünelleme ile İçerik Filtreleyicileri Atlatmak
SSH Tünelleme ile İçerik Filtreleyicileri Atlatmak
 
Ankus 제품소개서
Ankus 제품소개서Ankus 제품소개서
Ankus 제품소개서
 
Metasploit El Kitabı
Metasploit El KitabıMetasploit El Kitabı
Metasploit El Kitabı
 

Andere mochten auch

Gestalt Yaklaşımı
Gestalt YaklaşımıGestalt Yaklaşımı
Gestalt YaklaşımıUniverist
 
Zaman ve Toplantı Yönetimi E-Eğitimi
Zaman ve Toplantı Yönetimi E-EğitimiZaman ve Toplantı Yönetimi E-Eğitimi
Zaman ve Toplantı Yönetimi E-EğitimiUniverist
 
Yaşam Yönetimi
Yaşam YönetimiYaşam Yönetimi
Yaşam YönetimiUniverist
 
İleri Düzeyde Microsoft Excel E-Eğitimi
İleri Düzeyde Microsoft Excel E-Eğitimiİleri Düzeyde Microsoft Excel E-Eğitimi
İleri Düzeyde Microsoft Excel E-EğitimiUniverist
 
Temel Düzeyde Microsoft PowerPoint E-Eğitimi
Temel Düzeyde Microsoft PowerPoint E-EğitimiTemel Düzeyde Microsoft PowerPoint E-Eğitimi
Temel Düzeyde Microsoft PowerPoint E-EğitimiUniverist
 
Yaşam ve İnsan
Yaşam ve İnsanYaşam ve İnsan
Yaşam ve İnsanUniverist
 
Beni Dinle Anla
Beni Dinle AnlaBeni Dinle Anla
Beni Dinle AnlaUniverist
 
İleri Düzeyde Microsoft PowerPoint E-Eğitimi
İleri Düzeyde Microsoft PowerPoint E-Eğitimiİleri Düzeyde Microsoft PowerPoint E-Eğitimi
İleri Düzeyde Microsoft PowerPoint E-EğitimiUniverist
 
Bireysel Motivasyon Teknikleri
Bireysel Motivasyon TeknikleriBireysel Motivasyon Teknikleri
Bireysel Motivasyon TeknikleriUniverist
 
Gizli İkna Taktikleri
Gizli İkna TaktikleriGizli İkna Taktikleri
Gizli İkna TaktikleriUniverist
 
Aktif Yaşam Araştırmaları
Aktif Yaşam AraştırmalarıAktif Yaşam Araştırmaları
Aktif Yaşam AraştırmalarıUniverist
 
C++ Programlamaya Giriş E-Eğitimi
C++ Programlamaya Giriş E-EğitimiC++ Programlamaya Giriş E-Eğitimi
C++ Programlamaya Giriş E-EğitimiUniverist
 
Temel Düzeyde Microsoft Excel E-Eğitimi
Temel Düzeyde Microsoft Excel E-EğitimiTemel Düzeyde Microsoft Excel E-Eğitimi
Temel Düzeyde Microsoft Excel E-EğitimiUniverist
 
Temel Düzeyde Microsoft Word E-Eğitimi
Temel Düzeyde Microsoft Word E-EğitimiTemel Düzeyde Microsoft Word E-Eğitimi
Temel Düzeyde Microsoft Word E-EğitimiUniverist
 
İleri Düzeyde Photoshop E-Eğitimi
İleri Düzeyde Photoshop E-Eğitimiİleri Düzeyde Photoshop E-Eğitimi
İleri Düzeyde Photoshop E-EğitimiUniverist
 
HTML Giriş E-Eğitimi
HTML Giriş E-EğitimiHTML Giriş E-Eğitimi
HTML Giriş E-EğitimiUniverist
 
İkna Mühendisliği
İkna Mühendisliğiİkna Mühendisliği
İkna MühendisliğiUniverist
 
Android'e Giriş Eğitimleri 2_2
Android'e Giriş Eğitimleri 2_2Android'e Giriş Eğitimleri 2_2
Android'e Giriş Eğitimleri 2_2Univerist
 
Stratejik Pazarlama E- Eğitimi
Stratejik Pazarlama E- EğitimiStratejik Pazarlama E- Eğitimi
Stratejik Pazarlama E- EğitimiUniverist
 

Andere mochten auch (20)

Gestalt Yaklaşımı
Gestalt YaklaşımıGestalt Yaklaşımı
Gestalt Yaklaşımı
 
Zaman ve Toplantı Yönetimi E-Eğitimi
Zaman ve Toplantı Yönetimi E-EğitimiZaman ve Toplantı Yönetimi E-Eğitimi
Zaman ve Toplantı Yönetimi E-Eğitimi
 
Yaşam Yönetimi
Yaşam YönetimiYaşam Yönetimi
Yaşam Yönetimi
 
İleri Düzeyde Microsoft Excel E-Eğitimi
İleri Düzeyde Microsoft Excel E-Eğitimiİleri Düzeyde Microsoft Excel E-Eğitimi
İleri Düzeyde Microsoft Excel E-Eğitimi
 
Temel Düzeyde Microsoft PowerPoint E-Eğitimi
Temel Düzeyde Microsoft PowerPoint E-EğitimiTemel Düzeyde Microsoft PowerPoint E-Eğitimi
Temel Düzeyde Microsoft PowerPoint E-Eğitimi
 
Yaşam ve İnsan
Yaşam ve İnsanYaşam ve İnsan
Yaşam ve İnsan
 
Beni Dinle Anla
Beni Dinle AnlaBeni Dinle Anla
Beni Dinle Anla
 
İleri Düzeyde Microsoft PowerPoint E-Eğitimi
İleri Düzeyde Microsoft PowerPoint E-Eğitimiİleri Düzeyde Microsoft PowerPoint E-Eğitimi
İleri Düzeyde Microsoft PowerPoint E-Eğitimi
 
Bireysel Motivasyon Teknikleri
Bireysel Motivasyon TeknikleriBireysel Motivasyon Teknikleri
Bireysel Motivasyon Teknikleri
 
Çoklu Zeka
Çoklu ZekaÇoklu Zeka
Çoklu Zeka
 
Gizli İkna Taktikleri
Gizli İkna TaktikleriGizli İkna Taktikleri
Gizli İkna Taktikleri
 
Aktif Yaşam Araştırmaları
Aktif Yaşam AraştırmalarıAktif Yaşam Araştırmaları
Aktif Yaşam Araştırmaları
 
C++ Programlamaya Giriş E-Eğitimi
C++ Programlamaya Giriş E-EğitimiC++ Programlamaya Giriş E-Eğitimi
C++ Programlamaya Giriş E-Eğitimi
 
Temel Düzeyde Microsoft Excel E-Eğitimi
Temel Düzeyde Microsoft Excel E-EğitimiTemel Düzeyde Microsoft Excel E-Eğitimi
Temel Düzeyde Microsoft Excel E-Eğitimi
 
Temel Düzeyde Microsoft Word E-Eğitimi
Temel Düzeyde Microsoft Word E-EğitimiTemel Düzeyde Microsoft Word E-Eğitimi
Temel Düzeyde Microsoft Word E-Eğitimi
 
İleri Düzeyde Photoshop E-Eğitimi
İleri Düzeyde Photoshop E-Eğitimiİleri Düzeyde Photoshop E-Eğitimi
İleri Düzeyde Photoshop E-Eğitimi
 
HTML Giriş E-Eğitimi
HTML Giriş E-EğitimiHTML Giriş E-Eğitimi
HTML Giriş E-Eğitimi
 
İkna Mühendisliği
İkna Mühendisliğiİkna Mühendisliği
İkna Mühendisliği
 
Android'e Giriş Eğitimleri 2_2
Android'e Giriş Eğitimleri 2_2Android'e Giriş Eğitimleri 2_2
Android'e Giriş Eğitimleri 2_2
 
Stratejik Pazarlama E- Eğitimi
Stratejik Pazarlama E- EğitimiStratejik Pazarlama E- Eğitimi
Stratejik Pazarlama E- Eğitimi
 

Ähnlich wie Temel Düzeyde MySQL ve PHP Eğitimleri 2

İleri Seviye T-SQL Programlama - Chapter 03
İleri Seviye T-SQL Programlama - Chapter 03İleri Seviye T-SQL Programlama - Chapter 03
İleri Seviye T-SQL Programlama - Chapter 03Cihan Özhan
 
İleri Seviye T-SQL Programlama - Chapter 05
İleri Seviye T-SQL Programlama - Chapter 05İleri Seviye T-SQL Programlama - Chapter 05
İleri Seviye T-SQL Programlama - Chapter 05Cihan Özhan
 
Sql, Sql Injection ve Sqlmap Kullanımı
Sql, Sql Injection ve Sqlmap KullanımıSql, Sql Injection ve Sqlmap Kullanımı
Sql, Sql Injection ve Sqlmap KullanımıBGA Cyber Security
 
Stored procedure
Stored procedureStored procedure
Stored procedureoktaygokgol
 
Veri̇ tabani oluşturma ve yapilandirma
Veri̇ tabani oluşturma ve yapilandirmaVeri̇ tabani oluşturma ve yapilandirma
Veri̇ tabani oluşturma ve yapilandirmaoktaygokgol
 
kullanıcı tanımlı fonksiyonlar
kullanıcı tanımlı fonksiyonlarkullanıcı tanımlı fonksiyonlar
kullanıcı tanımlı fonksiyonlaroktaygokgol
 
8.hafta yusuf dinçer
8.hafta yusuf dinçer8.hafta yusuf dinçer
8.hafta yusuf dinçeroktaygokgol
 
İleri Seviye T-SQL Programlama - Chapter 13
İleri Seviye T-SQL Programlama - Chapter 13İleri Seviye T-SQL Programlama - Chapter 13
İleri Seviye T-SQL Programlama - Chapter 13Cihan Özhan
 
İleri Seviye T-SQL Programlama - Chapter 02
İleri Seviye T-SQL Programlama - Chapter 02İleri Seviye T-SQL Programlama - Chapter 02
İleri Seviye T-SQL Programlama - Chapter 02Cihan Özhan
 
Stimulsoft Report Rapor Tasarimi Yapmak
Stimulsoft Report Rapor Tasarimi YapmakStimulsoft Report Rapor Tasarimi Yapmak
Stimulsoft Report Rapor Tasarimi YapmakMustafa BÜKÜLMEZ
 

Ähnlich wie Temel Düzeyde MySQL ve PHP Eğitimleri 2 (20)

İleri Seviye T-SQL Programlama - Chapter 03
İleri Seviye T-SQL Programlama - Chapter 03İleri Seviye T-SQL Programlama - Chapter 03
İleri Seviye T-SQL Programlama - Chapter 03
 
Access 2013 Hafta 2
Access 2013 Hafta 2Access 2013 Hafta 2
Access 2013 Hafta 2
 
İleri Seviye T-SQL Programlama - Chapter 05
İleri Seviye T-SQL Programlama - Chapter 05İleri Seviye T-SQL Programlama - Chapter 05
İleri Seviye T-SQL Programlama - Chapter 05
 
Sql, Sql Injection ve Sqlmap Kullanımı
Sql, Sql Injection ve Sqlmap KullanımıSql, Sql Injection ve Sqlmap Kullanımı
Sql, Sql Injection ve Sqlmap Kullanımı
 
SQL Injection
SQL InjectionSQL Injection
SQL Injection
 
Veritabanı Sunusu - 1
Veritabanı Sunusu - 1Veritabanı Sunusu - 1
Veritabanı Sunusu - 1
 
Sql Server 2.hafta
Sql Server 2.haftaSql Server 2.hafta
Sql Server 2.hafta
 
Sunu
SunuSunu
Sunu
 
Mysql1
Mysql1Mysql1
Mysql1
 
Stored procedure
Stored procedureStored procedure
Stored procedure
 
Veri̇ tabani oluşturma ve yapilandirma
Veri̇ tabani oluşturma ve yapilandirmaVeri̇ tabani oluşturma ve yapilandirma
Veri̇ tabani oluşturma ve yapilandirma
 
Pivot Unpivot
Pivot UnpivotPivot Unpivot
Pivot Unpivot
 
kullanıcı tanımlı fonksiyonlar
kullanıcı tanımlı fonksiyonlarkullanıcı tanımlı fonksiyonlar
kullanıcı tanımlı fonksiyonlar
 
8.hafta yusuf dinçer
8.hafta yusuf dinçer8.hafta yusuf dinçer
8.hafta yusuf dinçer
 
İleri Seviye T-SQL Programlama - Chapter 13
İleri Seviye T-SQL Programlama - Chapter 13İleri Seviye T-SQL Programlama - Chapter 13
İleri Seviye T-SQL Programlama - Chapter 13
 
MS Access 2013
MS Access 2013MS Access 2013
MS Access 2013
 
Recep proje 5
Recep proje 5Recep proje 5
Recep proje 5
 
İleri Seviye T-SQL Programlama - Chapter 02
İleri Seviye T-SQL Programlama - Chapter 02İleri Seviye T-SQL Programlama - Chapter 02
İleri Seviye T-SQL Programlama - Chapter 02
 
Hayrettin kunuk
Hayrettin kunukHayrettin kunuk
Hayrettin kunuk
 
Stimulsoft Report Rapor Tasarimi Yapmak
Stimulsoft Report Rapor Tasarimi YapmakStimulsoft Report Rapor Tasarimi Yapmak
Stimulsoft Report Rapor Tasarimi Yapmak
 

Mehr von Univerist

Kariyer Yapma Yöntemleri
Kariyer Yapma YöntemleriKariyer Yapma Yöntemleri
Kariyer Yapma YöntemleriUniverist
 
İşletmelerde İnsan Kaynakları Yönetimi
İşletmelerde İnsan Kaynakları Yönetimiİşletmelerde İnsan Kaynakları Yönetimi
İşletmelerde İnsan Kaynakları YönetimiUniverist
 
Stratejik Yönetimin Faydaları
Stratejik Yönetimin FaydalarıStratejik Yönetimin Faydaları
Stratejik Yönetimin FaydalarıUniverist
 
Sertifika Eğitimi Zorunluluğu
Sertifika Eğitimi ZorunluluğuSertifika Eğitimi Zorunluluğu
Sertifika Eğitimi ZorunluluğuUniverist
 
6 Sigma Yöntemi
6 Sigma Yöntemi6 Sigma Yöntemi
6 Sigma YöntemiUniverist
 
Yaşam Koçuyla Daha Kolay Bir Hayat
Yaşam Koçuyla Daha Kolay Bir HayatYaşam Koçuyla Daha Kolay Bir Hayat
Yaşam Koçuyla Daha Kolay Bir HayatUniverist
 
Yaşam Koçuyla Çözüm Olun
Yaşam Koçuyla Çözüm OlunYaşam Koçuyla Çözüm Olun
Yaşam Koçuyla Çözüm OlunUniverist
 
Yaşam Koçuyla Çevrenizi Eğitin
Yaşam Koçuyla Çevrenizi EğitinYaşam Koçuyla Çevrenizi Eğitin
Yaşam Koçuyla Çevrenizi EğitinUniverist
 
Vizyonunuz Hedeflerinizi Oluştursun
Vizyonunuz Hedeflerinizi OluştursunVizyonunuz Hedeflerinizi Oluştursun
Vizyonunuz Hedeflerinizi OluştursunUniverist
 
Sürdürülebilir ve Tatmin Edici Başarıya Ulaşmak için 10 Adım
Sürdürülebilir ve Tatmin Edici Başarıya Ulaşmak için 10 AdımSürdürülebilir ve Tatmin Edici Başarıya Ulaşmak için 10 Adım
Sürdürülebilir ve Tatmin Edici Başarıya Ulaşmak için 10 AdımUniverist
 
Koçluk Hizmetiyle Değişim
Koçluk Hizmetiyle DeğişimKoçluk Hizmetiyle Değişim
Koçluk Hizmetiyle DeğişimUniverist
 
Koçluk Hizmetiyle 10 Kat Fazla Sevgiye Sahip Olun
Koçluk Hizmetiyle 10 Kat Fazla Sevgiye Sahip OlunKoçluk Hizmetiyle 10 Kat Fazla Sevgiye Sahip Olun
Koçluk Hizmetiyle 10 Kat Fazla Sevgiye Sahip OlunUniverist
 
Kelimelerinizi Güçlendirin
Kelimelerinizi GüçlendirinKelimelerinizi Güçlendirin
Kelimelerinizi GüçlendirinUniverist
 
Bir Yaşam Koçu İle Çalışmanın 6 Faydası
Bir Yaşam Koçu İle Çalışmanın 6 FaydasıBir Yaşam Koçu İle Çalışmanın 6 Faydası
Bir Yaşam Koçu İle Çalışmanın 6 FaydasıUniverist
 
İsteğiniz Hayata Kavuşmak İçin Yapmanız Gereken 25 Şey
İsteğiniz Hayata Kavuşmak İçin Yapmanız Gereken 25 Şeyİsteğiniz Hayata Kavuşmak İçin Yapmanız Gereken 25 Şey
İsteğiniz Hayata Kavuşmak İçin Yapmanız Gereken 25 ŞeyUniverist
 
Bir Koçla Çalışın
Bir Koçla ÇalışınBir Koçla Çalışın
Bir Koçla ÇalışınUniverist
 
Beyniniz Haklı Olmaya Bağımlı
Beyniniz Haklı Olmaya BağımlıBeyniniz Haklı Olmaya Bağımlı
Beyniniz Haklı Olmaya BağımlıUniverist
 
Personel,Özlük İşleri ve Bordrolama-5
Personel,Özlük İşleri ve Bordrolama-5Personel,Özlük İşleri ve Bordrolama-5
Personel,Özlük İşleri ve Bordrolama-5Univerist
 
Personel,Özlük İşleri ve Bordrolama-6
Personel,Özlük İşleri ve Bordrolama-6Personel,Özlük İşleri ve Bordrolama-6
Personel,Özlük İşleri ve Bordrolama-6Univerist
 

Mehr von Univerist (20)

Kariyer Yapma Yöntemleri
Kariyer Yapma YöntemleriKariyer Yapma Yöntemleri
Kariyer Yapma Yöntemleri
 
İşletmelerde İnsan Kaynakları Yönetimi
İşletmelerde İnsan Kaynakları Yönetimiİşletmelerde İnsan Kaynakları Yönetimi
İşletmelerde İnsan Kaynakları Yönetimi
 
Stratejik Yönetimin Faydaları
Stratejik Yönetimin FaydalarıStratejik Yönetimin Faydaları
Stratejik Yönetimin Faydaları
 
Sertifika Eğitimi Zorunluluğu
Sertifika Eğitimi ZorunluluğuSertifika Eğitimi Zorunluluğu
Sertifika Eğitimi Zorunluluğu
 
E Sertifika
E SertifikaE Sertifika
E Sertifika
 
6 Sigma Yöntemi
6 Sigma Yöntemi6 Sigma Yöntemi
6 Sigma Yöntemi
 
Yaşam Koçuyla Daha Kolay Bir Hayat
Yaşam Koçuyla Daha Kolay Bir HayatYaşam Koçuyla Daha Kolay Bir Hayat
Yaşam Koçuyla Daha Kolay Bir Hayat
 
Yaşam Koçuyla Çözüm Olun
Yaşam Koçuyla Çözüm OlunYaşam Koçuyla Çözüm Olun
Yaşam Koçuyla Çözüm Olun
 
Yaşam Koçuyla Çevrenizi Eğitin
Yaşam Koçuyla Çevrenizi EğitinYaşam Koçuyla Çevrenizi Eğitin
Yaşam Koçuyla Çevrenizi Eğitin
 
Vizyonunuz Hedeflerinizi Oluştursun
Vizyonunuz Hedeflerinizi OluştursunVizyonunuz Hedeflerinizi Oluştursun
Vizyonunuz Hedeflerinizi Oluştursun
 
Sürdürülebilir ve Tatmin Edici Başarıya Ulaşmak için 10 Adım
Sürdürülebilir ve Tatmin Edici Başarıya Ulaşmak için 10 AdımSürdürülebilir ve Tatmin Edici Başarıya Ulaşmak için 10 Adım
Sürdürülebilir ve Tatmin Edici Başarıya Ulaşmak için 10 Adım
 
Koçluk Hizmetiyle Değişim
Koçluk Hizmetiyle DeğişimKoçluk Hizmetiyle Değişim
Koçluk Hizmetiyle Değişim
 
Koçluk Hizmetiyle 10 Kat Fazla Sevgiye Sahip Olun
Koçluk Hizmetiyle 10 Kat Fazla Sevgiye Sahip OlunKoçluk Hizmetiyle 10 Kat Fazla Sevgiye Sahip Olun
Koçluk Hizmetiyle 10 Kat Fazla Sevgiye Sahip Olun
 
Kelimelerinizi Güçlendirin
Kelimelerinizi GüçlendirinKelimelerinizi Güçlendirin
Kelimelerinizi Güçlendirin
 
Bir Yaşam Koçu İle Çalışmanın 6 Faydası
Bir Yaşam Koçu İle Çalışmanın 6 FaydasıBir Yaşam Koçu İle Çalışmanın 6 Faydası
Bir Yaşam Koçu İle Çalışmanın 6 Faydası
 
İsteğiniz Hayata Kavuşmak İçin Yapmanız Gereken 25 Şey
İsteğiniz Hayata Kavuşmak İçin Yapmanız Gereken 25 Şeyİsteğiniz Hayata Kavuşmak İçin Yapmanız Gereken 25 Şey
İsteğiniz Hayata Kavuşmak İçin Yapmanız Gereken 25 Şey
 
Bir Koçla Çalışın
Bir Koçla ÇalışınBir Koçla Çalışın
Bir Koçla Çalışın
 
Beyniniz Haklı Olmaya Bağımlı
Beyniniz Haklı Olmaya BağımlıBeyniniz Haklı Olmaya Bağımlı
Beyniniz Haklı Olmaya Bağımlı
 
Personel,Özlük İşleri ve Bordrolama-5
Personel,Özlük İşleri ve Bordrolama-5Personel,Özlük İşleri ve Bordrolama-5
Personel,Özlük İşleri ve Bordrolama-5
 
Personel,Özlük İşleri ve Bordrolama-6
Personel,Özlük İşleri ve Bordrolama-6Personel,Özlük İşleri ve Bordrolama-6
Personel,Özlük İşleri ve Bordrolama-6
 

Temel Düzeyde MySQL ve PHP Eğitimleri 2

  • 1. Temel Düzeyde MySQL ve PHP Eğitimleri 2 MySQL ve PHP Ortamının İncelenmesi Bilgi Teknolojisi Eğitim Programları Bu Çalışma Univerist Materyal geliştirme ekibi tarafından Bilgi Teknoloji- leri Eğitimleri için derlenmiştir. Dökümanla ilgili kaynaklar makalenin so- nunda “Kaynakça” kısmında detaylı bir şekilde belirtilmiştir.
  • 2. 1 4. VERİ TABANINA GİRİŞ Bilgisayarın en önemli görevlerinden sayılan verileri saklama, verileri işleme ve gerektiğinde ise bu verileri çağırarak kullanma, gündelik hayatımızda birçok işimizi kolaylaştırmaktadır. E-okulda notla- rımızın ve devamsızlıklarımızın takibi, ÖSYM sınav ve puan bilgilerimiz, sizlerin kullandığı verisel işlemlerdir. İşte, bu tür veriler ve dahası bilgisayarda bir sistem dâhilinde tutulur, çağrılır ve işlenir. Bilgisayarda verilerle uğraşmak için programlar yapılmıştır. Bunlardan MySQL, Oracle, MS-SQL, Access bunlardan en bilinenidir. Bu öğrenme faaliyetinde, dersimizin ilk modülü olan “Açık Kaynak Kodla Temel Uygulamalar” modülünde kurulumu anlatılmış olan My-SQL veri tabanına erişim ve veri tabanında temel işlemleri gerçekleştireceğiz. 4.1. MS-DOS KOMUT SATIRINDAN MYSQL VERİ TABANINA ERİŞME MS-DOS komut sisteminden, veri tabanına erişebilmek için veri tabanımızın olduğundan emin ol- mamız gerekmektedir. Windows işletim sistemi üzerinden Başlat-Çalıştır-cmd komutu ile MS-DOS komut ekranını çalıştırıyoruz. Komut satırı aşağıdaki ekran görüntüsündeyken Komut satırına; C:wampbinmysqlmysql5.5.16binmysql –u root –h localhost –p komutunu yazıp ENTER tuşuna basıyoruz. “Enter Password:” kısmına eğer veri tabanına erişmek için daha önceden belirlenmiş bir şifremiz varsa bu şifreyi giriyoruz yoksa sadece ENTER tuşuna basıyoruz. Aşağıdaki ekran görüntüsündeki gibi bir ekran karşımıza geldiğinde artık MS-DOS orta- mında veri tabanına erişmiş bulunuyoruz ve artık komutlarla işlem yapabiliriz.
  • 3. 2 4.2. VERİ TABANININ ADINI ÖĞRENME SHOW DATABASES; komutu bize var olan veri tabanlarının listesini sunar. Örnek uygulamada olduğu gibi komut satırında buna bir bakalım. Burada yaptığımız sorguda şu an üç tane kurulumla gelen veri tabanı olduğunu görüyoruz. 4.3. VERİ TABANI OLUŞTURMAK Yeni bir veri tabanı oluşturmak istenirse CREATE DATABASE VERITABANI_ADI; komutunun kullanmalıyız. şimdi mtegm adında bir veri tabanı oluşturalım. Komutlarımızı yazıyor, en sonuna dikkat ettiğiniz gibi noktalı virgül(;) işaretini eklemeyi unutmuyoruz. Dikkat ettiyseniz komutun altındaki satırda komutun çalıştırılmasından sonra durum raporunu biz- lere verdi. Query OK ibaresi komutun çalıŞmasının başarılı bir şekilde tamamlandığını ifade etmek- tedir. Şimdi oluşan veri tabanımıza bir bakalım. Hatırlayacağınız gibi mevcut veri tabanları görme komutumuz SHOW DATABASES; idi.
  • 4. 3 Var olan veri tabanı adında başka bir veri tabanı oluşturmak istersek oluşmayacağını ve hata mesajı alacağınızı göreceksiniz. Göründüğü üzere ERROR uyarısı verdi. Yukarıdaki database exists ibaresi veri tabanının var olduğu anlamına gelmektedir. 4.4. VERİ TABANINI SİLME Var olan veri tabanını silmek için DROP komutu kullanılır. Kullanırken dikkat edilmesi gereken bu komut, bütün bilgileri ve tabloları geri getirilemez bir şekilde siler. Şimdi oluşturduğumuz mtegm veri tabanını silelim. Komutun kullanımı şu şekildedir: DROP DATABASE VERITABANI_ADI; Komutu çalıştırmadan önce kayıtlı veri tabanlarının listesini görelim. 4 adet veri tabanının olduğunu gördükten sonra DROP komutumuzu çalıştırıyoruz Yukarıdaki ekran görüntüsünde de görüldüğü gibi var olan veri tabanımızı sildik. Silme işleminden sonra da silinip silinmediğinin kontrolünü yapmış olduk. Dört olan veri tabanı adedimizin üçe düştü- ğünü gördük. 1.5. VERİ TABANINI SEÇME Tablo konusuna geçmeden önce tablo oluşturmanın mantığından biraz bahsedelim. Veri tabanı iş- lemlerinde mantık şu şekildedir: Önce veri tabanı oluşturulur sonra da veri tabanı için tablo oluşturmak suretiyle aynı gruptaki bilgiler bir araya toplanır. Şöyle ki bir alışveriş sitesi için veri tabanı oluşturdunuz. Veri tabanı ismi AVM olsun. Bu veri tabanında musteriler adında bir tablo ve urunler adında başka bir tablo oluşturursak veriler belli gruplar dâhilinde bir arada tutulmuş olur. Musteriler tablosunun altında isim, soyad, ad- res, telefon, adres gibi müşteriye ait bilgiler tutulurken, Urunler adlı tabloda ise cinsi, fiyatı, adedi, indirim oranı gibi ürüne ait bilgiler tutulur. Bu iki tablo ise AVM veri tabanın içinde yer alır. ġimdi bu
  • 5. 4 anlattıklarımızı uygulamalı olarak yapmaya çalışalım: Önce AVM adında bir veri tabanı oluşturuyo- ruz. Sonra mevcut veri tabanlarından AVM olanı seçiyoruz. Demek ki tablo oluşturacağımız veri tabanını önce seçmemiz gerekiyor. Bunu da USE VERITABANI_ADI komutuyla gerçekleŞtiriyoruz. Şu an üzerinde işlem yapılan veri tabanı AVM. ġimdi veri tabanı içinde tablo var mı yok mu bunun kontrolünü yapalım. Bunun için de SHOW TABLE komutunu kullanıyoruz. Görüldüğü gibi AVM veri tabanımızın içinde hiçbir tablo yok. Şimdi sıra veri tabanı içine tablo oluş- turma bölümüne geldi. 4.6. VERİ TABANINA TABLO EKLEME Yukarıdaki Şekilde bir tablo tanımlaması yapalım.  Create table musteri>>MüŞteri adında bir tablo tanımlıyor.  No integer not null>>MüŞteri numarasının tam sayı (integer) bir değer alacağını ve not null ile boŞ geçilemeyeceğini içine muhakkak bir değer girilmesi gerektiğini,  İsim varchar(20)>>Ġsim karakteri için 20 karakterlik bir alanın tahsis edildiğini,  Email varchar(30)>>E-mail için 30 karakterlik bir alanın tahsis edildiğini,  Sehir varchar(20)>>ġehir için 20 karakterlik bir alanın tahsis edildiğini belirtmek için kullanı- lır. Tablo oluşturma ve içine veri kaydetme işlemi başarılı bir şekilde tamamlandığına göre tablomuzun oluşup oluşmadığını kontrol edelim. Hatırlanacağı gibi tablo kontrol komutu SHOW TABLES; idi. Örneğimizde bunu uygulayalım:
  • 6. 5 Oluşturduğumuz bu tablonun içine veri değerleri girmeye sıra geldi. Veri değerlerini aşağıdaki gibi girelim: Query OK mesajı işlemimizin başarılı olduğunu gösteriyor. Kaydımızı tabloda görmek için sorgulama işlemi yapalım. 4.7. TABLODAN BİLGİLERİ SORGULAMA KOMUTU SELECT alınacak_alanlar FROM tablo_ismi; Örnek: Burada musteri tablomuzdaki bütün verileri listeledik. Burada kullandığımız yıldız (*) tüm alanların alınacağı anlamına gelmektedir. Şimdi başka veri girişleri de yaparak tablomuzun içeriğini zenginleştirelim. Yukarıdaki örnekte 2 müşteriye ait verileri de tablomuza girmiş olduk.
  • 7. 6 Bu örneğimizde aynı isim, sıra numarası ve bilgileri kaydederek üst üste birden fazla kayıt yapabili- riz. Bir veri tabanında isimler ve bilgiler aynı olabilir ama sıra numaralarının farklı olması gerekmektedir. Bu örnekte 3 sıra numarası iki defa kullanılmıştır. Bu istenilen bir kayıt biçimi değildir. Bunun sebebi tablo tanımlaması yaparken No kısmını auto increment primary key (otomatik artan farklı değer) olarak tanımlamak gerekmektedir. 4.8. TABLODAN KAYIT SİLME Tablo içindeki kayıtları silmek için DELETE FROM tablo_adı komutu kullanılmalıdır. Bazı durumlarda bütün kayıtları değil belirlediği- miz kayıtları silmemiz söz konusudur. Bunun için ise WHERE bağlacını ve koşulu ekleriz. Örnek: Yukarıdaki musteri tablosundan Şehri Adana olan kayıtları silelim. DELETE FROM musteri WHERE sehir=’Adana’; Bu örnekte AVM veri tabanı içinde bulunan musteri tablosu içindeki memleketi “Adana” olan müŞ- terilerimizi sildik. Tablodan veri silme örneği daha değişik koşullarla da yapabiliriz.
  • 8. 7 Tablo içindeki tüm verileri silmek için ise TRUNCATE TABLE tablo_adi; komutunu kullanabiliriz. Silme sonucunda tablomuzu sorguladığımızda (select * from musteri;) bize tablonun boş olduğu (Empty) karşılığı verecektir. Konumuzun pekişmesi ve diğer konularda da kullanmak için başka bir örnek uygulama yapalım. Örnek: Okul veri tabanı altına ogrenciler diye bir tablo oluşturup öğrenci sınıf, isim, yaş ve cinsiyet- lerini kaydedelim. Şablon tablomuz aşağıdaki şekilde olacaktır: Veri tabanımız oluştu, Şimdi tablo oluşturmaya sıra geldi. NOT: Tablo oluşturmadan önce hangi veri tabanı kullanılacağı seçilmelidir. Aksi takdirde bizim iste- diğimiz değil o an atanmış olan veri tabanının içine tablo oluşacaktır. CREATE TABLE ogrenci ( no int unsigned not null auto_increment primary key, sinif varc- har(5), isim varchar(30), yas int, cinsiyet varchar(5) );
  • 9. 8 Şimdi oluşturduğumuz bu tabloya aşağıdaki şekilde veri girişleri gerçekleştirelim: Verileri sorguladığımız zaman aşağıdaki şekilde bir görüntü elde etmiş oluruz. Şimdi bu örnek üzerinde şöyle bir uygulama daha yapalım: Şimdi de 6. öğrenciyi ekleyelim yalnız numarası “Fatma EKTİ” ile aynı olsun yani numarası 5 olacak Şekilde veri girişi yapalım: Burada numarası 5 olan kaydı kabul etmedi çünkü 5 numara başka bir öğrenciye aitti. Daha önceki örnekte ise kaydı kabul etmişti. Bunun sebebi, no sütununu PRIMARY KEY olarak atamamızdan kaynaklanmaktadır.
  • 10. 9 4.9. TABLO ÖZELLİKLERİNİ GÖRME Tanımladığımız tablonun özelliklerini görmek için DESCRIBE komutu kullanılır. Bu komutun kulla- nım şekli aşağıdaki gibidir: DESCRIBE tablo_ismi; Oluşturduğumuz tablonun özelliklerine baktığımızda NO alanının auto_inc- rement değer aldığını ve aynı değeri bir daha almayan anahtar veriler alacağını öğrenmiş olduk. Aynı zamanda type kısmında veri türlerinin neler olduğunu ve kaç karakterlik tahsis yapıldığı gözük- mektedir. 4.10. VERİ TİPLERİ Veri tipleri ve kullanım şekillerinden aşağıdaki bilgileri bilmekte fayda var. Bunlar en çok kullanılan veri tipleridir. Bir veri tabanı içine birden fazla tablo eklemek mümkündür. Bu uygulamamızda “OKUL “ veri tabanı altına eklediğimiz “ogrenci” tablosunun yanına “velibilgi” diye başka bir tablo oluşturalım. Veli Bilgi Tablosunu oluştururken aşağıdaki tablodan faydalanabiliriz: Create table velibilgi(no int unsigned not null auto_increment primary key, isim varchar(25),is varchar(20),gelir int, adres varchar(60), tel int;
  • 11. 10 SHOW TABLES; komutu ile oluşan tabloları görebiliyoruz. Daha önceki örneğimizde “ogrenci” tab- losunun içine bilgiler eklemiştik. Şimdi ise “velibigi” tablosu içine bilgi ekleme işlemi gerçekleştirece- ğiz. Yukarıdaki tabloyu kullanarak bilgi girişlerini gerçekleştirelim: Şimdi de verileri doğru girip girmediğimizin kontrolünü yapalım. Bunun için “Select * from table;” komutunu kullanacağız. Görüldüğü üzere bilgileri veri tabanımıza doğru bir şekilde kaydettik.
  • 12. 11 4.11. TABLOYA ALAN EKLEME Var olan bir tabloya alan ekleme ihtiyacı olabilir. Bu gibi durumlarda ise ALTER TABLE komutunu kullanırız. Bu komutun kullanımı şu şekildedir: ALTER TABLE tablo_adi ADD alan_adi alan_turu; Örnek: Velibilgi tablomuza telefon alanı ekleyelim. Burada telefon bilgilerini girmediğimiz için NULL değeri gözükmektedir. 4.12. TABLODAN ALAN SİLME Var olan tablodan bir sütunu silmek için ise şöyle bir ifade yazarız: ALTER TABLE tablo_adi DROP COLUMN sütun_adi; Örnek: Velibilgi tablomuzdan telefon alanını silelim. Yukarıda da görüldüğü gibi alanımızı başarılı bir şekilde temizlemiş olduk. 4.13. TABLO ADINI DEĞİŞTİRME Bir veri tabanında tablo adını değiştirmek için aŞağıdaki şekilde bir yol izlenir: ALTER TABLE mevcut_tablo_adi RENAME TO yeni_tablo_adi;
  • 13. 12 Komutu çalıştırdığımızda sıkıntısız bir şekilde tablo adı değişti. Biz uygulamalarımızda velibilgi tablo adını kullanacağımız için eski ismine geri getiriyoruz. Buraya kadar yaptığımız uygulamaları bir to- parlayacak olursak OKUL adında bir veri tabanı oluşturmuştuk. Bunun içine “ogrenci” ve “velibilgi” adında iki tane tablo ekleyip tablolara ayrı ayrı veri girişi yaptık. 4.14. SORGULAMA OPERATÖRLERİ Bazı durumlarda girdiğimiz verileri belli bir silsile dâhilinde çağırmanız gerekebilir. Bu gibi durum- larda sorgulama operatörlerini kullanırız. Daha önce oluşturduğumuz örnekler üzerinde sorgulama işlemini gerçekleştirelim. SELECT seçme manası gelir, WHERE ise nereden alınacağını söyler. Bu komutun kullanımı şu şekildedir: SELECT sütunlar FROM tablo_ismi WHERE koşullar; Örnek: Velilere toplantı davetiyesi gönderilecek, veli isimleri ve adresleri gerekli, Şimdi “velibilgi” tablomuzdan sadece velilerin ismini ve adresini çağıralım: Örnek: Öğrencilere sosyal yardımda bulunulacak. Velisinin geliri aylık 1.250 TL’nin altında olan veli listesini çıkartalım:
  • 14. 13 Sorgu yaptırdığımızda bir kaydın çıktığı görünmektedir. 4.15. KOŞULA BAĞLI SORGULAMA YAPMA Yukarıdaki örnekte de uyguladığımız gibi WHERE parametresi koşula bağlı sorgulama işlemlerinde kullanılır. Bu parametrenin kullanımını birkaç örnekle biraz daha pekiştirelim. Örnek: Cinsiyeti KIZ olan öğrencilerin listesini alalım: Örnek: Cinsiyeti KIZ olan 10A sınıf öğrencilerinin listesini alalım: Order By ASC/DESC: Bu komut ile verileri alfabetik olarak sıralayabiliriz. ASC: Artan-Küçükten büyüğe doğru (A-Z) DESC: Azalan-Büyükten küçüğe doğru (Z-A) sıralama işlemi gerçekleştirir. Örnek: Tüm öğrencileri alfabetik olarak sıralayalım (A-Z): Şimdi de isimleri tersten (Z’den-A’ya) göre sıralayalım. Bu sefer ASC yerine DESC ifadesini kullanı- yoruz.
  • 15. 14 ASC-DESC komutu sadece metinsel ifadeleri değil sayısal ifadeleri de sıralamak için kullanılır. Ör- neğin “ velibilgi” tablosundan velilerin sosyal durumlarını öğrenmek için gelirlerine göre azdan çoğa doğru sıralatalım: Sorgu Sınırlama(LIMIT): LIMIT parametresi ile sıraladığımız listeye bir sınır koyabiliriz. Şöyle ki geliri düşükten yükseğe doğru sadece 3 veli isminin listelenmesini istiyoruz. Şimdi de sıralama alanımızı biraz daraltıp İşçi statüsünde olan velilerin gelirlerini sıralayalım: 4.16. VERİLERİ GÜNCELLEME Var olan veri yerine başka bir veri girmek için bu komut kullanılır. Update: Verileri güncellemek için bu komut kullanılır. Kullanımı şu şekildedir: UPDATE tablo_ismi SET alan=’Yeni Değer’ where ‘Değişecek Kayıt’; Örnek: Aşağıdaki tabloda 3 numaralı öğrenci Osman KOÇAK’ın isim bilgilerini güncelleyelim. KO- ÇAK yerine KOÇ, sınıfını da 9A yerine 10A olarak ayarlayalım:
  • 16. 15 Şimdi komutun uygulanıŞ biçimine bir göz atalım: 4.17. HAZIR FONKSİYONLAR Sql dilinde kullanılan hazır fonksiyonlar vardır. Bunlar işlerimizi kolaylaştırmakla beraber sorguda bize kolaylık sağlar. Count: Toplam Kayıt sayısını bulur. Kullanımı: Count(Sutün_Adı) Örnek: Daha önce oluŞturduğumuz ogrenci tablosundaki kayıt sayı- sını bulalım: Görüldüğü gibi tablomuzda 5 kayıt bulunmuş ve listelenmiştir. Sütun olarak ilk sütundaki verileri saydıracağız diye bir şart yoktur. İstenirse sınıf, isim, yaş, cinsiyet de saydırılabilir. Sonuç yine aynı çıkacaktır. Min /Max: Minimum ve maksimum değerleri bulur. Örnek: Ogrenci tablosundaki öğrencilerden en küçük yaşı bulalım:
  • 17. 16 Öğrencilerden en küçük yaş 16 bulundu. Örnek: Ogrenci tablosundaki öğrencilerden en büyük yaşı bulalım: Öğrencilerden en yüksek yaş 18 bulundu. Distinct: Bu fonksiyon tabloda sütun içlerindeki benzer olan verilerden sadece bir tanesini sorguya ekler. Bu fonksiyon için velibilgi tablomuzu kullanalım: Yukarıdaki tabloyu incelediğimizde 2 öğretmen, 2 işçi ve 1 memur var. Bu fonksiyon, bu bilgileri filtreleyip yalnız bir tanesini işleme sokacaktır. Örnek: Velilerin hangi işlerle meşgul olduğunu görmek istersek Dikkat ettiğiniz gibi bu fonksiyon tekrarlı verileri ayıklayıp birer numunelerini listeletmektedir. Bu fonksiyonu elektronik tablolama programındaki veri filtreleme özelliğine de benzetebiliriz. SQL ko- mut ve fonksiyonları, buraya kadar anlattıklarımızla sınırlı olmayıp daha farklı türlerde olanları mev- cuttur. 5. PHP İLE MYSQL PROGRAMLAMA Buraya kadar gördüğümüz üzere SQL dilini DOS komut sistemi ekranına benzer bir ekranda kodla- yıp, veriler girip düzeltmek çok kolay bir iş değildir. Bunun için piyasada çeşitli programlar mevcuttur. Bunların en bilinenleri MYSQL-Front ve PhpMyAdmin programlarıdır. Bu programlar, görsel olarak bizim yaptığımız işlevleri arka planda SQL komutlarına çevirir. Bu uygulama faaliyeti içerisinde PHP ile uyumlu çalışan PhpMyAdmin programını inceleyeceğiz.
  • 18. 17 5.1. VERİ TABANI PROGRAMLARIYLA ÇALIŞMA PhpMyAdmin, PHP web programlama dili ile kodlanmış olan ve MySQL veri tabanı yönetim desteği sağlayan bir web uygulamasıdır. Dersimizin ilk modülünde yer alan konular içerisinde kurulumunu yapmış olduğumuz PHP+Apache+Mysql paketleri içinde yer alan PhpMyAdmin’den faydalanacağız. Öncelikle PhpMyAdmin programımızı çalıştırmak için web tarayıcımızın adres çubuğuna http://lo- calhost ya da 127.0.0.1 yazıyoruz. Karşımıza gelen pencereden phpMyAdmin Database Manager seçeneğini seçiyoruz. Resim: Appserv bilgi ekranı 5.2. YENİ BİR VERİ TABANI OLUŞTURMA Burada veri tabanı sunucumuza bağlanıp veri tabanı işlemlerini gerçekleştireceğiz. Bazı durumlarda yukarıdaki ekran gelmeyebilir. PhpMyAdmin’e bağlanmak için http://127.0.0.1/phpMyAdmin/ veya http://localhost/phpMyAdmin ifadelerini adres çubuğuna girmemiz gerekebilir.
  • 19. 18 Resim: PhpMyAdmin ekranına giriş paneli Gelen erişim ekranının üst kısmına kullanıcı adımızı, altına ise kurulumda kullandığımız şifreyi giri- yoruz. Kullanıcı adı, kurulumda varsayılan (default) olarak root ayarlanmıştı. Parola ise bizim girdi- ğimiz değer olacaktır. Görülen bu ekran bizim veri tabanı yönetim ekranımız olacaktır. Sol tarafta veri tabanlarının listelemesi yapılabilmektedir. Veri tabanları yazan bağlantıya tıklayarak mevcut veri tabanlarının listesi görebilir ve yeni veri tabanları oluşturabiliriz.
  • 20. 19 Resim: PhpMyAdmin ekranından veri tabanları görüntüsü Yukarıdaki pencereden faydalanarak sunucuda 3 tane veri tabanı olduğunu görüyoruz. Biz de OKUL adında yeni bir veri tabanı oluşturalım. Veri tabanının adını yazıp “Oluştur” diyoruz. Resim: PhpMyAdmin ekranında veri tabanı oluşturma Veri tabanı oluşturuldu. Aynı zamanda veri tabanı oluşturmak için kullanılan SQL komutunun sorgu- suna da ekranda görebilirsiniz. Şimdi de oluşturduğumuz veri tabanı içine tablo ekleme aşamasına sıra geldi. Resim: PhpMyAdmin ekranında alan oluŞturma Veri tabanımızda kullanacağımız tablo ismi ogrencibilgi olsun. Bu tablo da toplam 5 alandan oluş- sun. Git butonuna tıkladığımızda karşımıza aşağıdaki şekilde bir tablo gelecektir:
  • 21. 20 Resim: PhpMyAdmin ekranında alan biçimi Gelen bu tabloyu aşağıdaki gibi dolduralım: Resim : PhpMyAdmin ekranında alan biçimi belirleme Burada id (identification – Kimlik) alanını öğrenci numarası gibi düşünebiliriz. No yerine id kullandık. Id aynı değeri almayan ve otomatik değer alan tam sayı türünde olan ifadeler için kullanacağımız alan adımızdır. Bunun için tablomuzun Ekstra bölümünde id alanına auto_increment (otomatik de- ğer alma) özelliği vermiş olduk. Diğer alanları da text ve varchar karakter olacak şekilde ayarlayıp alabileceği karakter değeri olarak da belli uzunluklar tahsis ettik. Bu değerler yukarıdaki tablomuzda gözükmektedir. 5.3. VERİ TABANI SUNUCUSUNA BAĞLANTI KURMA Veri tabanı sunucumuza bağlanma komutu olarak mysql_connect() fonksiyonu kullanılır. Bu fonk- siyonun kullanımı aŞağıdaki gibidir: Mysql_connect(sunucu_adi, kullanici_adi, sifre) Kullanıcı adı ve parola veri tabanı programı kurma esnasında girdiğimiz değerlerdir. Bu fonksiyon veri tabanı sunucumuza bağlanma komutudur. MySQL sunucusu ile bağlantı kuramazsa FALSE değerini dön- dürür. İstenirse döndürdüğü bu değer, bir kontrol yapısı içinde kullanılarak bağlantının yapılıp yapıl- madığı kontrol edilebilir. İlk olarak ayar.php dosyamızı oluşturup programımıza, Mysql sunucumuza tanıtalım.
  • 22. 21 Oluşturduğumuz ayar dosyamızı sunucumuzun bulunduğu dizinde www klasörü içene ayar.php olarak kaydedelim. Resim : Ayar.php dosyasının kayıt konumu Tarayıcımızın adres çubuğuna ilgili adresi yazıp çalıştırdığımızda ise karşımıza şu şekilde bir ekran gelecektir: Resim : Ayar.php dosyasını test etme -1 Buradan yaptığımız bağlantının doğru olduğu anlıyor ve bir sonraki aşamaya geçebileceğimiz so- nucuna varıyoruz. Ayar.php dosyamızda 2, 3 ve 4 numaralı satırların değerlerinden herhangi birini değiştirdiğimiz zaman bağlantı hatası alabiliriz. Bu değerlerden birini değiştirerek ayar.php dosya- mızı tekrar çalıştıralım.
  • 23. 22 Resim : Ayar.php dosyasını test etme -2 Yanlış şifre değeri girildiğinde alınan hata yukarıdaki gibi olacaktır. Veri tabanımıza bağlantıyı sağ- ladıktan sonra veri tabanımıza veriler girmeye sıra geldi. Öncelikle PhpMyAdmin programı ile daha önce oluŞturduğumuz veri tabanını ve tabloyu hatırlayalım. Veri ekleme işlemini daha hızlı gerçekleştirmek için form kullanalım. Web editörü programı kullana- rak bu işi kolayca yapabiliriz. Form.php dosyamızı kaydettik. ġimdi de form ile gönderilen bilgileri veri tabanına eklemeye sıra geldi. Bunun için de Ekle.php dosyamızı oluŞturalım. 5.4. TABLOYA BİLGİ EKLEME Form ile gönderilen bilgiler $_POST metodu ile alınmaktadır. Aldığımız bu bilgileri 3-6 satırlar ara- sında değiŞkenlere atıp 12. satırda veri tabanına ekliyoruz.
  • 24. 23 12. satırda ekleme işlemi $ekle değişkeni ile kontrol edilmektedir. Insert INTO komutu ise ekleme işlemini gerçekleştiren komuttur. Sayfamızı ekle.php olarak kaydederek buraya kadar kodları çalış- tıralım. Adres çubuğuna http://localhost/form.php yazıp formumuzu çağırıyoruz. Formumuzu doldurup KAYDET butonuna tıklıyoruz. Kaydet tuşundan sonra ekle.php dosyası çağ- rılacak ve forma girdiğimiz bilgiler ekle.php yardımıyla veri tabanımıza kaydedilecektir. Veri tabanımıza farklı üç tane daha kayıt girmek için forma geri dönelim. Toplam 4 adet kayıt girmiş olduk ve Şimdi tarayıcımızın adres çubuğuna http://localhost/PhpMyAdmin adresini yazıp veri taba- nına bağlanalım.
  • 25. 24 Resim : PhpMyAdmin penceresi PhpMyAdmin penceresinde Gözat butonuna tıklayarak kaydettiğimiz verilere ulaşabiliyoruz. Resim : PhpMyAdmin penceresinde kayıt listeleme 5.5. TABLODAN BİLGİLERİ OKUTMA Veri tabanına girdiğimiz bu verileri okutmaya sıra geldi. Bunun için oku.php dosyasını oluşturuyoruz. Yukarıdaki örneği inceleyecek olursak 3. satırda veri tabanımıza kayıtlı bilgi adedi $sor değişkenine atılıyor. 4. satırda ise $sor değişkenini mysql_fetch_array fonksiyonu yardımı ile sorgudan dönen değişkeni diziye atmak için kullanılıyor. Kurduğumuz while döngüsü kayıt bitinceye kadar devam etmektedir. 6 ile 10. satır arasında dizi değerleri sırası ile değişkenlere atılmaktadır. 12 ile 17. satırda
  • 26. 25 ise tablo yardımıyla veri tabanından çekilen değerler ekrana yazılmaktadır. Yazma işlemi döngü bitinceye kadar devam etmektedir. Oku.php dosyasını çalıştırdığımızda ekrana aşağıdaki gibi bir görüntü gelecektir: Resim: Verilerin listelenmesi (oku.php) 5.6. TABLODAN BİLGİLERİ DÜZENLEME Girdiğimiz kayıtları düzenlemek için oku.php sayfamızda tablonun altına DÜZENLE adında bir bağ- lantı (link) oluşturuyoruz. Bu linke ait id parametresi düzenlenecek kaydın id numarası olup Du- zenle.php ekranına ilgili sayfayı getirecektir.
  • 27. 26 Burada çağrılan id değeri href=”duzenle.php?id=”<?php echo “$id”;?> değeridir. Önce duzenle.php dosyamızı bir oluşturalım. AŞağıda düzenle.php dosyamız mevcuttur: Tarayıcımızla “oku.php”yi çalıştırıp oradan da “DÜZENLE” linkine tıkladığımızda karşımıza düzen- lenecek sayfa gelecektir. Resim : Oku.php dosyası Burada DÜZENLE linkine tıkladığımızda id değeri yardımıyla duzenle.php dosyasından ilgili kayıt çağrılacaktır.
  • 28. 27 Resim : Duzenle.php dosyasını test etme 6.PHP KOD GÜVENLİĞİ VE YANLIŞ BİLİNENLER PHP uygulamaları ve kullanılabilecek güvenlik yöntemlerine dair birçok şey yazılıp çiziliyor fakat yanlış bilinenler ve bu yanlış kullanımlar her şeye rağmen güvenlik zafiyetlerine sebebiyet veriyor. Bu yazıda bilinen güvenlik fonksiyonlarının yanlış kullanımlarına ve exploit edilmelerine değinece- ğim. İlk olarak XSS zafiyetine karşı alınan önlemlerle ilgili bir şeyler anlatmaya çalışayım. 6.1.XSS (CROSS-SİTE SCRİPTİNG) XSS zafiyetlerine karşı bilinen ve incelediğim kaynak kodlarında en çok gördüğüm şey PHP fonksi- yonlarından htmlspecialchars. Htmlspecialchars fonksiyonu özel HTML karakterlerini fonksiyona belirtilen veri içerisinde arar ve bulduklarını kodlayarak HTML olarak yorumlanmalarını engeller. Fa- kat htmlspecialchars sizi her zaman korumaz. Örnek bir hatalı kullanım için aşağıdaki PHP kod alıntısına bakabilirsiniz; … $user = htmlspecialchars($_GET["user"]); echo "<a href=xss.php?user=$user title="$user">Profiliniz</a>"; … Görüldüğü üzere htmlspecialchars kullanılmış fakat bu uygulamayı koruduğu söylenemez. Çünkü siz burada aslında sadece kendinizi avutmuş olursunuz bu kod ile. Neden mi? user parametresine canberk%20onmouseover=alert(/XSS/) değerini girelim ve sonucu görelim. Resimde görüldüğü üzere browser yolladığımız değeri yorumladı ve aşağıdaki resimde göreceğiniz üzere başarıyla onmouseover olayı gerçekleştiğinde alert fonksiyonunu çağırdı.
  • 29. 28 Peki neden böyle oldu, htmlspecialchars neden korumadı beni derseniz cevabı çok basit, biz gön- derdiğimiz değerde herhangi bir html karakteri yollamadık ki denetime takılsın. Eğer tırnak ile ara- lansaydı link bu XSS'ten bahsedemeyecektik. Maalesef bu hataya düşen birçok uygulama ile karşı- laşabiliyoruz. Yapılan bir diğer hata ise platforma güvenerek kod yazmak. Nasıl olsa platform bana bir şeyler sağlıyor fikriyatı ile magic_quotes_gpc'nin verdiği güven ile kod yazmakta uygulamanın çuvallama- sına sebep olabiliyor. Bu örnekte magic_quote_gpc'nin desteğini arkasına almış bir uygulama ile karşı karşıyayız. ... echo "<a href="xss.php?user=$user" title="$user">Profiliniz</a>"; ... Tamam her şey çok güzel gözüküyor, çift tırnak kullanmışız, magic_quotes_gpc'de açık, daha ne isteriz? Tabikide saldırganın canberk"%20onmouseover=alert(/XSS/)%09 değerini girmesini isteriz. Yollanan değerde tek çift tırnak var o da bir öncekinin kapanmasını sağladı ve magic_quotes_gpc'ye rağmen browser çift tırnak içindeki veriyi xss.php?user=canberk olarak algıladı ve yine bize izin verdi. Ferruh Mavituna'nın 5.sayıda yazdığı “Web Uygulamalarında Güvenli Platform Seçimi” yazı- sını hatırlamakta fayda var. *1+ 6.2.SQL INJECTİON SQL Injection zafiyetlerine maruz kalan web uygulamalarında karşılaştığım en büyük hatalardan biriside mysql_real_escape_string (mres) fonksiyonuna karşı duyulan inanılmaz güven. İlk XSS ör- neğinde olduğu gibi sorguya gelen veriyi çift tırnak ile çevrelemeden sadece mres'e güvenerek yo- luna devam eden birçok web uygulaması var ve ne zaman bu tip bug'ları avlasam geliştiricisine detaylıca açıklıyorum ve “ama mres fonksiyonundan geçirdim...” gibisinden ortak cevaplar alıyorum. Aşağıdaki örneği bir inceleyelim. ... $id = mysql_real_escape_string($_GET["id"]);
  • 30. 29 $query = mysql_query("SELECT * FROM tblUsers WHERE `userId`= $id ORDER BY userName"); ... Bu kodun güvenli olduğunu iddia eden birçok geliştirici bulabilirsiniz, çünkü inandıkları(!), öğrendik- leri(!) kaynaklar bazı şeyleri üstü kapalı işlediği için hiçbir zaman hatayı neden yaptığını anlayama- yacaktır. Normal şartlarda uygulama aşağıdaki gibi bir cevap dönmektedir. Biz bu açığı msre'ye rağmen exploit edebiliriz. Aynen aşağıda yaptığım gibi. Kullandığım hiçbir karakter msre'ye takılmadı ve başarıyla exploit edilebildi. Bu hataya düşen birçok uygulama bulmak mümkün. Bu örnektede aldığımız veriyi tırnak işaretleri ile çevrelemek en mantıklı çözüm olacaktır. Yalnız kullandığımı tırnak işaretinede dikkat etmek şart. Mesela msre ` (left quote) karakteri için herhangi bir kaçırma işlemi uygulamıyor. Aldığınız parametreyi veri değilde alan olarak kullanacağınız zaman left-quote karakterini kullanabilirsiniz fakat bu da güvenlik sorunu doğuracaktır. Aşağıdaki örneğe bir bakın; ... $table = mysql_real_escape_string($_GET["table"]); $query = mysql_query("SELECT * FROM `$table` WHERE `userId`=1"); ... Veri çekilecek olan tablo adını kullanıcıdan almak(!) her ne kadar güvenli gibi dursada msre left- quote'lara izin verdiği için güvenli olmayacaktır. İşin kötü yanı ise sorgunuzda kullanıcı tarafından sağlanan tablo adı, kolon adı gibi verileri tırnak işaretleri ile kullanamıyor olmanızdır. Bahsettiğim durumu exploit etmek için, tblUsers`+where+`userId`=1+and+2=9+union+select+1,version(),0x4343--%09x değeri yollamak bizi sonuca götürecektir.
  • 31. 30 6.3.FILE INCLUSION Her ne kadar biraz geç gelen yama (6 yıl sonra!) NULL byte ile file inclusion yapmayı tarihe gömmüş olsada, bir gerçek var ki insanlar hala güncelleme yapmadan eski PHP versiyonları kullanıyorlar ve geliştiriciler hala bir şekilde FI zafiyetleri bırakıyorlar. FI zafiyeti bırakmak istemeyen geliştiricilerin en çok düştüğü hatalardan biriside kullanıcıdan aldığı değeri file_exists fonksiyonu ile denetleyerek include etmesi. Yine güzel bir örnek hazırladım. ... $file = $_GET["file"]; if(file_exists("includes/$file")) { include "includes/".$file; } ... file_exists fonksiyonuna gelecek olası ../../../../etc/issue değeride gerçekten dosya sisteminde varol- duğu için fonksiyonu true değeri dönecektir. En çok karşılaşılan 3 zafiyeti ve bu zafiyetlere karşı ezbere alınan önlemlerin nasıl atlatılacağına kısaca değindim, daha yaratıcı bir çok zafiyet gerçek uygulamalarda mevcut ve birilerinin onları av- lamasını beklemekte. Yapılan yanlışlarla ilgili olarakta en temel sorun web güvenliğini anlamadan önlem almaya çalışmaktır. Güvenli kodlamalar. 7. FORM İŞLEMLERİ Formların internet siteleri üstündeki etkisini ve kullanım yöntemlerini anlayabilmek için öncelikle sta- tik ve dinamik siteler arasındaki farkı iyi kavramak gerekir. O zaman öncelikle kısaca statik ve dina- mik site kavramlarına bir bakalım. Genel bir bakış açısıyla web siteleri iki kategoride incelenebilir. Bunlar, durağan ve etkileşimli web siteleridir. Durağan, diğer bir ifade ile statik web siteleri web sayfalarının hazırlandıktan sonra hiçbir değişime uğramayan ve sadece tek taraflı bilgi akışının olduğu sayfalardır. Bilgi, web sayfası sunu- cusundan sayfayı ziyaret eden internet tarayıcısına, diğer bir ifade ile istemciye doğrudur. Site ta- mamen siteyi oluşturan kişi tarafından düzenlenebilir.
  • 32. 31 İkinci web sitesi çeşidi ise, günümüzde yaygın olarak kullanılan dinamik (etkileşimli) web siteleridir. Dinamik sitelerde kullanıcı etkileşimi ön plandadır. Web sayfalarına yeni içerikler eklenebilir, var olanlar güncellenebilir ya da silinebilir. Dinamik web sitelerinde, bilgi, web sayfası sunucusundan sayfayı ziyaret eden tarayıcıya olabileceği gibi tarayıcıdan web sayfası sunucusuna doğru da olabi- lir. Dinamik bir web sitesi, her kullanıcı için ya da her ziyarette özel olarak oluşturulabilir. Dünya üzerin- deki her kullanıcı, bir siteye kendi kullanıcı adıyla girdiğinde diğer kullanıcılardan farklı bir içeriğe erişebilir. Bu farklı içerik, web sitesinin renkleri, teması, müzikleri, sitedeki yetki derecesi vb. şeklinde olabilir. Günümüz internetindeki popüler siteler dinamik sitelerdir. Dinamik web sitelerini hazırlamada en çok kullanılan yapı formlardır. HTML formları çeşitli kontrolleri içeren ve ziyaretçi tarafından değiştirilebilen yapılardır. Formların içerdiği kontrol yapıları şunlardır; buttonlar (button, submit, reset),  checkbox,  radio,  text,  hidden,  password,  textarea,  select,  option,  file,  image. 7.1. FORM OLUŞTURMA Bir HTML formu <form> etiketi ile başlar ve </form> etiketi ile sonlanır. Bu etiketler arasına yerleşti- rilen kontrol yapılarıyla formumuzu oluşturmuş oluruz. HTML formları çeşitli görevleri yerine getir- mek için kullanılabilir. Örneğin anketler, yorum bölümleri, kullanıcı üyelik bölümleri, forumlar, sosyal paylaşım sitelerindeki video paylaşımı, resim paylaşımı ya da paylaşılanların beğenilmesi, derece- lendirilmesi vb. <form> etiketinin üç temel özelliği form oluşturmak için önemlidir.  action: Formdaki bilgilerin gönderileceği url adresi.  method: Bilginin gönderilme yöntemi.POST yada GET yöntemlerine sahiptir. Değer atanma- dığı durumlarda GET yöntemi kullanılır. İleri konularda kullanımlarına değinilecektir.  name: Formun ismidir. Bu özelliğe değer verirken PHP’nin değişken kurallarına uymak ge- rekir.
  • 33. 32 PHP’de değişken ismi verirken boşluk ya da özel karakter kullanamadığımızı hatırlayınız. Örnek: <form action= "url_adresi" method= "get name’’= "form_ismi"></form> Form etiketi bir formun oluşabilmesi için önemlidir fakat form kontrol yapıları olmadan anlamlı bir form oluşturmuş olmayız. 7.2. FORM KONTROL YAPILARINI KULLANMA HTML formlarının etkin bir şekilde kullanılması kontrol yapıları ile mümkündür. Kontrol yapıları sa- yesinde amaca uygun formlar oluşturulabilir ve internet kullanıcılarının kullanımına sunulabilir. Kont- rol yapıları sahip oldukları çeşitlilikle kullanıcıların kolay ve anlaşılabilir bir şekilde formları kullan- malarını sağlamaktadır. Formlarda kullanılan kontrol yapıları oluşturulurken her kontrolün sahip olduğu “name” özelliği var- dır. Name özelliği formlardan gelen bilgi elde edilirken kullanılmaktadır. Form kontrol yapıları aşağıda kullanımları ile listelenmiştir. 7.2.1. <input> Kullanımı Genel amaçlı bir form etiketidir. Sonlandırıcı etiketi yoktur. Girdi türü type öğesinde belirtilerek farklı girdilerin alınmasını sağlar.
  • 34. 33 Örnek: 7.2.2. <textarea> Kullanımı Formumuza uzun metinler yazmak için kullanılmaktadır. Örneğin adres bilgisi ya da yorum girişi için kullanılabilecek bir form elemanıdır. <textarea rows="5" cols="20" name="adres"></textarea> şeklinde kullanılır. <textarea> ile kullanılan; 7.2.3. <select> ve <option> Kullanımı Formlarımızda seçim kutuları oluşturmak için kullanılan yapılardır. Örneğin bir şehir seçimi için kul- lanılabilir.<select> ve <option> kullanılırken “name” özelliğinin <select> etiketi içerisinde “value” özelliğinin ise <option> içerisinde kullanılması gerekmektedir. <select name="sehir"> <option value="Ankara">Ankara</option> <option value="İstanbul">İstanbul </option> <option value="Samsun">Samsun</option> </select> 7.3. POST VE GET METODU İLE FORMLARDAN BİLGİ ALMAK PHP'nin en güçlü özelliklerinden biri HTML formlarına yaklaşım biçimidir. Bilinmesi gereken ilk önemli durum, form içindeki tüm elemanların PHP tarafından aktif olarak . kullanılabilir olacağıdır.
  • 35. 34 Formların veri aktarabilmeleri için iki ayrı yöntem vardır. Bunlar POST ve GET yöntemleridir. Dola- yısı ile PHP’de formlardan gelen bilgileri almanın da iki yöntemi vardır. Bunlar;$_POST,$_GET yön- temleridir. 7.3.1. GET Metodu GET metodu ile veriler iletildiğinde forma girilen tüm bilgiler adres satırında URL’ye eklenerek iletilir. Örnek: Aşağıda ‘form_get_1.html’ dosyasına dikkat edilirse herhangi bir PHP kodu içermemektedir. Bu- nunla birlikte bu dosyada bulunan form bir PHP dosyasına yönlendirilmektedir. ‘formu_isle_1.php’ isimli dosya ise kendisine GET metodu kullanılarak gönderilen bilgileri alıp ek- rana yazmak için hazırlanmış bir PHP dosyasıdır. Formdan gelen bilgiler $_GET değişkeni kullanı- larak alınmaktadır. Örnekte formu_isle_1.php’ sayfasının tarayıcı görünümüne dikkat edilecek olursa adres çubuğunda bilginin URL’ye nasıl eklendiğini görebiliriz. Burada bilgilerin eklenme işini gerçekleştiren yapı HTML <form> etiketidir. URL adresinden sonra “?” kullanılarak bilgi ekleme işlemi gerçekleşmiştir. Bilgiler, değişken_ismi=değer şeklinde eklenmiş ve her yeni bilgi “&” işareti ile peşi sıra eklenmiştir.
  • 36. 35 HTML formlarında bu tür bilgiler <a>….</a> etiketi kullanılarak da oluşturulabilmektedir. Bu işlem “URL sorgu cümlesi oluşturmak” olarak adlandırılabilir. Yukarıdaki örneğin <a>etiketi ile oluşturulması şu şekildedir; <a href=“formu_isle_1.php?isim=Hakan&yas=33”>URL Sorgu Cümlesi</a> URL sorgu cümleleri çoğunlukla bir yazının devamını okumak için devamını okuyun linklerinde karşımıza çıkmaktadır. Örnek: Formdan gönderilen iki sayının toplamını ekrana yazan örneği hazırlayalım. PHP değişkenleri olan $_GET ve $_POST değişkenleri bütün veri türlerini taşıyabilir.
  • 37. 36 GET yöntemi kullanılarak oluşturulan formlar çoğunlukla basit formlardır. Karmaşık formlarda ço- ğunlukla POST metodu tercih edilir. 7.3.2. POST Metodu POST metodu formlarda bilgiyi taşıma yöntemlerinden bir diğeridir. GET metodunun aksine bilgi taşınırken URL adresinde görünmez. Bu yönüyle POST metodunun daha güvenilir olduğunu söyle- yebiliriz. Ayrıca POST metodunda bilginin taşınması esnasında bir sınırlama yoktur. POST metodunun kullanımı GET ile bezerdir. Oluşturulan formun “method” özelliği POST yapılarak formun bu yöntemi kullanarak veriyi göndermesi sağlanır. PHP tarafında ise $_GET dizi değişkeni yerine $_POST dizi değişkeni kullanılır. Örnek: Aşağıda ‘form_post_1.html’ dosyası ‘formu_isle_1.php’ isimli dosyaya yönlendirilmiştir. ‘formu_isle_1.php’ isimli dosya ise kendisine POST metodu kullanılarak gönderilen bilgileri alıp ek- rana yazmak için hazırlanmış bir PHP dosyasıdır. Formdan gelen bilgiler $_POST değişkeni kulla- nılarak alınmaktadır. Notice: Undefinedindex: Eğer php sayfanızda yukarıdaki hata mesajını ve hata satırını görüyorsanız bunun anlamı şudur: $_GET yada $_POST dizi değişkenleri içine yazdığınız index isimleri bulunamadı. Formdan gelen kontrol yapılarına verilen isimleri kontrol ediniz.
  • 38. 37
  • 39. 38 Örnek: Bu örneğimizde POST metodu kullanılarak farklı form kontrol elemanlarından bilgi elde edilecektir. ‘form_post_2.html’ dosyasında Cinsiyet ve Yabancı Dil sırasıyla “radio” ve “checkbox” özelliğini ta- şıyan form kontrolleridir. Cinsiyet için kullanılan iki farklı “radio” özelliğindeki form kontrollerinin “name” özellikleri aynıdır. Bu- nun anlamı iki farklı değerden sadece bir tanesinin ‘formu_isle_2.php’ dosyasına iletilecektir. Yabancı Dil için kullanılan üç “checkbox” özelliğindeki form kontrollerinin “name” özellikleri de aynı- dır. Farklı olarak “[ ]” (köşeli parantez) işaretleri eklenmiştir. Bunun anlamı, verilen isim üzerinden değerler dizi olarak gönderilecektir. ‘formu_isle_2.php’ dosyasında ise diğerlerinden farklı olarak fo- reach döngüsü kullanılarak dizi değişken içinden istenilen değerler elde edilecektir.
  • 40. 39 ‘form_post_2.html’ dosyasında kullanılan iki kontrol nesnesi olan “reset” ve “submit” özelliğindeki butonlara isim verilmemiştir. Bunun nedeni, PHP sayfasında elde edilmeyecek olan kontrol nesne- lerine isim vermeye gerek yoktur.
  • 41. 40 Örnek: Bu örneğimizde form yoluyla resim yükleme (upload) işlemi gerçekleştireceğiz. Resim yükleme iş- lemi için diğer formlardan farklı olarak <form> etiketinin “enctype” özelliğinin “multipart/form-data” olarak atanması gerekiyor. Bu atama ile birlikte formumuz MIME standartlarına uygun bütün dosya- ların yüklemesini yapabilecektir. Multipurpose Internet Mail Extensions (Çok amaçlı İnternet Posta Eklentileri); E-posta uygulama- ları aracılığıyla gönderilecek olan iletiye çeşitli türdeki içeriği eklemek için kullanılan bir İnternet stan- dardıdır. Örneğimizdeki diğer bir fark ise “Resim Dosyası” alanı için oluşturulan “input” form kontrolünün “type” özelliği “file” olarak atanmasıdır. Bu sayede kullanıcılar tarayıcıda “Gözat” (Browse) düğmesi sayesinde forma istedikleri dosyayı gönderebileceklerdir. Bu örnekte, resim dosyası olarak yükleme yapılacağı belirlendiği için, ‘form_isle_3.php’ dosyasında yüklenen resim bir ‘img’etiketinin ‘src’ özelliğine atanarak resmin tarayıcıda gözükmesi sağlanmak- tadır. ‘form_post_3.html’ dosyasında “Gözat” düğmesi tıklanarak bilgisayarımızda bulunan her hangi bir dosyanın forma iliştirilmesi mümkün olmaktadır. Formlara girilen bilgilerin kontrol edilmesi çok önemli bir konudur. Örneğin yukarıda Gözat düğmesi kullanılarak bir resim dosyası yerine farklı bir formatta dosya yüklemesi yapılsaydı örnek istenildiği gibi çalışmazdı. Dosyanın yüklenmesi gerçekleşirdi. Bununla birlikte ‘img’ etiketine bir resim dosyası yolu verilmediğinden istenildiği gibi çalışmamış olurdu.
  • 42. 41 Örneğimizdeki dosyanın $_FILES özelliklerine şu kodla erişebiliriz. <?php foreach($_FILES[‘dosya’] as $anahtar=>$deger) echo “$anahtar=>$deger<br />”; ?> Yukarıdaki kodun ekrandaki karşılığı şu şekilde olacaktı. name=>kizkulesi.jpg type=>image/jpeg tmp_name=>D:xampptmpphp7BA3.tmp error=>0 size=>56647 Formdan gelen dosyanın sunucuya kopyalanması işlemi için ‘copy’ komutu kullanılmaktadır. Copy komutunun kullanımı şu şekildedir: copy ( string $kaynak , string $hedef [, resource $bağlam ] )  $kaynak dosyanın kaynak yolunu,  $hedef ise dosyanın kopyalanacağı adresi belirler.
  • 43. 42 ‘form_isle_3.php’ dosyasında kullanılan $_FILES dizi değişkeni küresel bir değişkendir. Formdan gelen dosyanın elde edilmesi için kullanılmaktadır. $_FILES dizi değişkeninin sahip olduğu değerler şunlardır:  name: Dosyanın ismi  type: Dosyanın türü.  tmp_name: Kaynak dosyanın kopyasının yolu.  error: Aktarım esnasındaki hata kodu.  size: Dosyanın boyutu.
  • 44. 43 ‘form_isle_3.php’ dosyasını görüntüleyen kaynak görüntüsü incelendiğinde resmin <img> etiketinin ‘src’ özelliğine bakıldığında resmin isminin olduğu görülecektir. Tarayıcıda görüntülenen resim su- nucuya kopyalanan resimdir. 7.4. KULLANICIDAN GELEN BİLGİ VE GÜVENLİK PHP’ de yazılmış bir uygulamanın en zayıf noktası, dilin kendisinde olan bir sorun değil, yazılan uygulamanın bazı varsayımlara dayanarak güvenliği göz önünde bulundurmamasıdır. Kod yazarken her zaman yazdıklarınızı dikkatlice inceleyip, kullanıcıdan gelen bilgilerin doğru ve tam şekilde denetlenip onaylandığına emin olmanız gerekir. Kullanıcıdan gelen bilgiyi alıp işleme koyduğunuz her durumda kendinize şu soruları sorabilirsiniz:  Bu betik (kod ya da script) benim istemediğim dosyalara erişim, değişiklik veya silme imkanı veriyor mu?  Beklenmeyen bir bilgi geldiğinde de istenilen işlem yapılacak mı?  Bu betik başka bir amaç için kullanılabilir mi?  Bu betik, sistemde var olan başka betiklerle birlikte kötü amaçlı kullanılabilir mi?  Yapılan işlemler daha sonra inceleme amacıyla kayda alınacak mı? Yaptığınız projenin uygunluğuna göre kod yazmadan önce ve yazarken bu soruları sık sık kendinize sormanız, proje bittiğinde değerlendirme yapıp değişiklikler yapmanızdan çok daha faydalı olacaktır. Bu sayede proje tasarımını güvenlik düşünülerek yapmış olacak ve daha sonra güvenlik dolayısıyla ciddi değişiklikler yapma zorunluluğunuz ortadan kalkacaktır. Güvenliğe vereceğiniz öncelikli önem, daha sonra yapacağınız ve güvenliği riske atacak değişikliklerden çok daha faydalıdır. Belirtilen bir değişkenin değerini, kaynağı veya geçerliliği bozacağını düşündüğünüz register_glo- bals, magic_quotes ve benzeri ayarları kapatmanız iyi olabilir. Hata bildirim kipi 'error_repor- ting(E_ALL)' kullanımı, aynı zamanda uyarıları da göstereceği için kodunuzda sorun olup olmadığı hakkında daha iyi bilgi verebilir. PHP’ de tip denetim yapısı katı değildir ve bu güvenlik sorunlarını tetiklemektedir. Uygulamanızda değişken tiplerinin neler olduğunu bilmek ve mantıksal olarak kullanıcıdan gelen değişkenlerin tü- rünü bilmek birçok durumda hataları ortadan kaldırabilir. PHP’de kullanılabilecek çok sayıda tip tanımlama fonksiyonu vardır. Bu fonksiyonlardan bazıları is_int, is_array, is_bool, is_null, is_float, is_numeric vb. dir.
  • 45. 44 Örnek: Formlardan gelen bilgiler her zaman beklenen doğru bilgiler olmayabilir. Bazen istenmeyen bilgi- lerde formlarla birlikte gönderilebilir. Bu bilgiler sayfalarımızın istenildiği gibi görünmesini engelleye- bilir. Hatta çok daha ciddi problemler çıkmasına sebep olabilir. ‘htmlspecialchars’ fonksiyonu verilen metin içerisindeki HTML etiketlerinin işaretlere dönüştürülme- sini sağlar. Aşağıdaki örnekte POST yöntemi kullanılarak gönderilen bilgiler ‘htmlspecialchars’ fonksiyonu kul- lanılarak HTML karakter dönüşümleri yapılmaktadır.
  • 46. 45 HTML karakter dönüşümü yapılmış olarak görüntülenen internet sayfasının kaynak kodu aşağıda olduğu gibidir. Görüldüğü gibi HTML için özel anlamı olan ‘<’, ‘>’ işaretleri ‘htmlspecialchars’ fonksi- yonu sayesinde sırasıyla ‘&lt;’, ‘‘&gt;’özel karakterlerine dönüştürülmüştür. Aşağıdaki örnekte foreach döngüleri ile GET ve POST metotları ile gelen bütün değişkenlerin HTML etiketlerinin dönüştürülmesi sağlanır. 8. DÜZENLİ İFADELER Bilgisayar dünyasının Türkçe adıyla düzenli ifadeler, İngilizcesi ile regular expressions, konusu bütün programlama dillerinde karşımıza çıkmaktadır. Her programlama dilinin düzenli ifadeler için kullandığı farklı fonksiyonları bulunmaktadır. Bununla birlikte düzenli ifadelerde kullanılan söz dizileri (desen, örüntü, İngilizce karşılığı patterns) ve bu söz dizelerini oluşturan işaret ve kurallar çok ben- zerdir. 8.1. DÜZENLİ İFADE NEDİR? Belirlenen kurallara uyan söz dizilerine düzenli ifade denir. En yaygın kullanıldığı şekliyle örnek ve- rerek konuyu açalım. Bir form oluşturduğumuzu ve bu formda e-posta alanı olduğunu varsayalım. Form gönderildiğinde giriş yapılan e-postanın gerçek olup olmadığını düzenli ifadeleri kullanarak basit bir söz dizisi ile öğrenebiliriz.
  • 47. 46 Ya da bir metin içerisinde “PHP Matematik Fonksiyonları” ifadesini aradığımızı varsayalım. Bu ifa- denin bulunması için PHP’de birçok fonksiyon (strstr, strpos vb.) kullanabiliriz. Bununla birlikte ben- zer ifadelerin tümünü görmek istiyorsak ne yapmalıyız? Örneğin “PHP Metin Fonksiyonları”, “PHP Tarih ve Saat Fonksiyonları” ifadelerini ve bunlara ben- zeyen fakat aklımıza gelmeyen ifadelerin tamamını arama sonucunda görmek istiyorsak düzenli ifadeler kullanabiliriz. Kısacık bir söz dizisiyle istediğimizi elde etmeyi sağlar. 2.1.1. Kullanım Amaçları *Nasıl yazıldığını tam olarak bilmediğimiz bir sözcüğü aratabiliriz. Örneğin, bir makalede "entrepreneurship" sözcüğünü bulmak istiyorsak, ancak ne şekilde yazıldı- ğından emin değilsek, ilk ve son birkaç karakterini verip aratabiliriz. *Bir metnin içindeki, özel bir forma uyan parçaları bulabiliriz. Örneğin, düz bir metin içindeki tüm URL'leri (İnternet adreslerini), yalnızca ana yapıyı tarif ederek, teker teker ayıklayabiliriz. (http:// ile başlayan ve arada noktalar içeren sözcükler) *Aldığımız bir metnin, belli bir yapıya uyup uymadığını kontrol edebiliriz. Örneğin, kullanıcılardan e-posta adresi girmelerini istediğimiz bir web sayfasında, metin kutusuna girilen yazının geçerli bir e-posta adresi olabilecek formatta olup olmadığına bakabiliriz. (@ işareti içerecek, belli karakterlerden oluşacak, ikinci blokta en az bir nokta olacak vs) *Belli formatta aldığımız bir veriyi, istediğimiz başka bir formata çevirebiliriz. Örneğin, bir XML belgesinden kopyaladığımız veriyi, kendi uygulamamızda kullanmamız için bir PHP dizisi (array) haline getirebiliriz. 8.2. SÖZ DİZİSİ En basit düzenli ifadeler, tek bir karakterden oluşur. Harfler, rakamlar, noktalama işaretleri gibi pek çok karakter, kendisiyle eşleşen düzenli ifadelerdir. Yani, bir metinde a karakterini arıyorsak, girme- miz gereken düzenli ifade, doğal olarak a karakteridir. Ancak, bazı karakterler, düzenli ifadelerin söz dizisinde özel anlamlar ifade eder. Bu özel karakterler, . * [ ] ^ $ sembolleridir. Aradığımız karakter, bu özel karakterlerden bir tanesiyse, başına karakteri koyarak, özel anlam içermesini engelleyebi- liriz. Örneğin, bir metin içinde nokta karakterlerini bulmak istiyorsak, girmemiz gereken düzenli ifade nokta ( .) değil ( . ) olmalıdır. Düzenli ifadelerin, bazı özel sembollerle bir araya gelmesi sonucu, daha güçlü ve karmaşık düzenli ifadeler elde edilir. Aşağıdaki tablolar, düzenli ifadelerin nasıl elde edildiğini açıklar:
  • 48. 47 8.2.1. Söz Dizisinde Kullanılan Özel Karakterler Aşağıdaki tabloları bir anda anlamak mümkün olmayacaktır. Bu aşamada düzenli ifadeler için PHP’de kullanılan preg_match fonksiyonunun kullanımına bakıp aşağıdaki tabloda verilen örnekleri deneyerek ilerlemek işlerimizi kolaylaştıracaktır. Bu şekilde adım adım düzenli ifadeler konusunu anlamak mümkün olacaktır. Dikkat edilmesi gereken önemli bir nokta, söz dizileri oluşturulurken iki aynı simge arasına yazılma- lıdırlar. Örneğin; /Bafra/ yada -Bafra- yada @Bafra@ gibi.
  • 49. 48
  • 50. 49 8.2.2. Söz Dizilerinde Görünmez (non-printing) Karakterleri Yakalamak Bunu da şöyle izah edebiliriz: Örneğin bir metin yazarken satır sonuna geldiğinizde enter tuşuna bastınız ve alt satıra geçtiniz. Oysa görünürde o noktaya basılmış herhangi bir karakter yoktur. As- lında tam tersine sizin metin editörünüz o noktaya sizin göremeyeceğiniz bir karakteri, yani yeni satır (newline) karakterini basmıştır. İşte aşağıda listesini verdiğimiz buna benzer görünmez karakterleri yakalamak için yine ters bölü anahtarını kullanmalısınız.
  • 51. 50 8.2.3. Söz Dizilerinde Geniş Aralıkları İçeren Karakter Setleri Aşağıdaki karakter setleri rakam, harf ya da beyaz boşluk(enter, tab vb.) gibi geniş karakter grupla- rını tanımlamak için kullanılır. 8.2.4. Söz Dizilerinde Sınırları Yakalamak Düzenli ifadelerde kullanılan özel karakterlerden bazıları bir ifade ya da kelimenin sınırlarını belirle- mek için olanıdır. Ama bu kullanımın diğerlerinden belirgin bir farkı vardır. O da aşağıda listesi veri- len karakterlerin aslında fiziksel bir karşılıklarının olmayışıdır.
  • 52. 51 8.2.5. Yer Değiştirme Bazı durumlarda arama işlemine ek olarak, bulunan söz dizisi örneğinin yer değiştirmesi de gereke- bilir. Bu işlem için düzenli ifadelerin temel tanımına ait olmayıp, gelişmiş bir özellik olan bellek kulla- nımı gereklidir. Bu özellik kullanıldığında ifade gücü Tip – 3 dillerinin üzerine çıkar. Arama örüntüsü içinde ‘(‘ ile başlayıp, ‘)’ ile biten parçalara yer değiştirme işleminde, 1 gibi numaralı bir yazmaç (register) ile referansta bulunulur.(13) 8.3. PHP’DE DÜZENLİ İFADELER PHP 5.3.0 sürümü ile birlikte düzenli ifadeler yaklaşımında değişikliğe gitmiştir. Bu sürümden önce kullandığı POSIX standardını bırakarak PCRE standardına geçmiştir. 8.3.1. PHP’de Düzenli İfadeler İçin Kullanılan Fonksiyonlar PHP’de kullanılan ve bizim bu modülde üzerinde duracağımız PCRE fonksiyonları preg_match ve preg_replace’tir. Bütün PCRE fonksiyonları için http://www.php.net/manual/tr/ref.pcre.php adresini ziyaret edebilirsiniz. *preg_match ( string $soz_dizisi , string $metin)
  • 53. 52 $soz_dizisi ile belirtilen düzenli ifadeyi eşleştirmek için $metin içinde arama yapar.Eşleşme var ise TRUE, yok ise FALSE değeri döner. Fonksiyona ait üç tane daha değer (parametre) vardır. Bunların kullanılması zorunlu olmadığı için burada yer vermedik. Şimdi düzenli ifadeler konumuzdan uzaklaşmadan adım adım düzenli ifadeleri kullanarak nasıl söz dizileri oluşturacağımıza bir bakalım. Basit bir örnekle başlayalım. Örneğin “PHP ile Düzenli İfadeler” metni içinde “PHP” ifadesini arayalım. Görüldüğü gibi istenilen söz dizisi metin içeresinde olduğundan preg_match fonksiyonu TRUE de- ğerini döndürür ve ekrana “Eşleşme sağlandı.” mesajı çıkar. Söz dizisini oluştururken PHP ifadesini “/” karakteri ile başlatıp sonlandırdık. Fonksiyonumuzun doğru çalışabilmesi için bu gerekliydi. Yukarıdaki örnekte metin içerisinde PHP ifadesi geçtiği sürece sonuç hep aynı olacak ve ekrana “Eşleşme sağlandı.” mesajı çıkacaktır. Örneğin “PHP ile Düzenli İfadeler”, “Düzenli İfadeler ve PHP”, “PHP öğreniyorum!”, “Bugünlerde PHP uygulamaları geliştiriyorum.” Yukarıdaki örnekte aramanın büyük ve küçük harfe duyarlı olması için söz dizisini şu şekilde düzen- lememiz yeterli olacaktır. /php/i Şimdi bazı özel karakterler kullanarak arama sonuçlarını daraltalım. Örnek:
  • 54. 53 Örnek: Düzenli ifadeler için pratik bir örnek yapalım. Örneğimizde bir form oluşturup, form ile birlikte hem söz dizisini hem de metni preg match fonksiyonuna gönderelim. Böylece bütün söz dizilerini tek bir form üzerinden kontrol etmemiz mümkün olacaktır. echo fonksiyonu içerisine yazılmış olan $_POST değişkenlerinin indexlerinin tek tırnak ya da çift tırnak kullanılmadan yazıldığına dikkat edelim. Aynı zamanda echo fonksiyonunun doğru çalışabil- mesi için $_POST değişkeni içinde tek tırnak karakteri olmamalı ya da ’ şeklinde kullanılmalı. error_reporting(0; kod satırının PHP’de hata mesajlarını tarayıcıya göndermediğini hatırlayalım. *preg_replace ( string $soz_dizisi , string $yeni_ifade, string $metin)
  • 55. 54 $soz_dizisi ile belirtilen düzenli ifadeyi eşleştirmek için $metin içinde arama yapar. Yapılan arama sonucunda eşleşenlerin hepsi yeni ifade ile değiştirilir. Örnek: Bir ifade içinde “Bay” olarak geçen kelimeleri “Bayan” olarak değiştiren örneği yapınız. Örnek: Verilen ifade içinde http:// söz dizisini http_ ile değiştiren örnek.
  • 56. 55 Örnek: ‘preg_replace’ fonksiyonu kullanarak bir metinde olan <h1></h1> etiketini yazıdan çıkarmak. Örnek: ‘preg_replace’ fonksiyonunu kullanarak bir metinde olan <h1></h1> etiketini yerine <u></u> etiketi eklemek
  • 57. 56 9. OTURUM YÖNETİMİ Oturum, bir kullanıcının bir web sitesini ziyaret etme sürecidir, diyebiliriz. Başka bir tanım ile, bilgi- sayarınızın başına geçip tarayıcınızı çalıştırdığınız, web’ de sörf yaptığınız ve daha sonra tarayıcı- nızı kapattığınız zaman arasında kalan süreç bir oturumdur. Oturum Yönetimi kavramının gelişmesi internet sitelerinin ziyaretçilerine daha iyi, hızlı ve özgün hizmet verebilmeleri ile ilgilidir. Amaç elde edilmiş verilerin kaybedilmeden kullanıcı yararına kulla- nılması. ve kullanıcıların istek ve yönelimlerini tespit ederek siteyi en etkin bir şekilde kullanmalarını sağlamaktır. 9.1. ÇEREZLER İnternet sayfalarını gezerken sıkça karşılaştığımız kavramlardan biri olan Türkçe ismiyle çerezler İngilizcesi ile cookies, kullanıcıyı ayırt etmenin en etkili yollarından biridir. Belki de bütün internet siteleri ziyaretçileri hakkında bir takım bilgiler toplarlar. Kimi zaman bu bilgileri veri tabanına kimi zaman ise kullanıcıların kendi bilgisayarlarına kaydederler. Çerezler, internet sitelerinin kullanıcı bilgisayarına yerleştirdiği küçük boyutta dosyalardır. Tarayıcı- nın bir sayfayı açtığı her tekrarda internet siteleri çerezlerini tekrar gönderir. 9.1.1. Çerezlerin Kullanım Yerleri Çerezler, web sayfası ile bilgisayarımız arasındaki referansımızdır. Daha önce girdiğimiz bir web sayfasına girişlerimiz çerezler sayesinde kaydedilebilir. Daha sonra aynı sayfaya girmemiz halinde girdiğimiz sayfa bizi tanır, bize kimi referans bilgileri verir, sayfayı daha sonra ziyaret ettiğimizde bu referans bilgileri web sayfasına otomatik olarak iletilir. Çerezler çeşitli amaçlarla kullanılabilirler. Örnek verecek olursak bunlardan biri anket formlarıdır. Anket formlarında oy kullandığınızda web sitesi bu durumu bir çerezle bilgisayarınıza kaydedebilir. Siteyi tekrar ziyaret ettiğinizde anket sayfası bilgisayarınızdaki çerezleri kullanarak anket kullandı- ğınızı tespit eder ve anketi tekrar kullanmanızı önler. Bir başka örnek de üyelik sistemleridir. Üyelik sistemlerinde de çerezler anket sistemlerinde olduğu gibi kullanılır. Sayfaya girişin bir kullanıcı adı ve şifre ile mümkün olduğunu varsayalım. Sayfaya üye olduktan sonra kullanıcı adı ve şifre ile giriş yapılır. Kullanıcı adı ve şifre çerez ile kaydedilir. Daha sonra bu internet sitesi aynı bilgisayardan tekrar ziyaret edildiğinde çerez bilgileri okunur. Kullanıcı adı ve şifre çerezlerden alınarak kullanıcı oturum sayfası açılır. Aslında çerezler çok daha fazla işlemde kullanılır. 9.1.2. PHP ile Çerezler PHP HTTP çerezlerini destekler. Çerezler, uzak tarayıcıda veri saklamayı ve böylece geri dönen kullanıcılar hakkında veri takibi yapmayı sağlar. Çerezleri, setcookie()işlevleri ile atayabilirsiniz. Çe- rezler, HTTP başlığının birer parçasıdır, bu yüzden tarayıcıya bir veri göndermeden önce setcookie() işlevini çağırmalısınız. *Setcookie fonksiyonu
  • 58. 57 Kullanımı : setcookie (string $isim [, string $değer [, int $zaman_aşımı = 0 [, string $yol [, string $alan [, bool $güvenlik = false [, bool $sadece_http = false ]]]]]] )  $isim: Çerezin ismi.  $deger:Çerezin değeri. Bu değer istemcinin bilgisayarında saklanır. Bu bakımdan çerezlerde güvenlik ihlaline konu bilgiler saklamayın. İsim değiştirgesinde 'çerezim' ismini kullandığınız varsayımıyla, bu çerezin değerini $_COOKIE['çerezim'] değişkeni ile alabilirsiniz.  $zaman_aşımı: Çerezin zaman aşımına uğrama süresi. Değer bir Unix zaman damgasıdır. Başka bir deyişle time() işlevinden dönen değere çerezin zaman aşımına uğrayacağı süreyi saniye cinsinden eklemek suretiyle bulacağınız değerdir. Ayrıca, mktime() işlevini de kulla- nabilirsiniz. time()+60*60*24*30 ile çerez 30 gün sonra zaman aşımına uğrar. Burada 0 atanır veya bir şey belirtilmezse, çerez oturumun sonunda (tarayıcı kapandığında) zaman aşımına uğrar.  $yol: Çerezin üzerinde etkin olacağı sunucudaki yol. '/' belirtilirse çerez alanın tamamında kullanılabilir olacaktır. Eğer '/isim1/' belirtilirse, çerez sadece /isim1/ dizininde ve /isim1/isim2/ gibi alt dizinlerde kullanılabilir olacaktır. Ön tanımlı değer çerezin atandığı içinde bulunulan dizindir.  $alan: Çerezin kullanılabileceği alan. Çerezi mesela.dom ve alt alanlarında kullanılabilir yap- mak için değer olarak '.mesela.dom' belirtmelisiniz. Değer olarak, 'belge.mesela.dom' belirti- lirse çerez sadece belge alt alanında kullanılabilir olacaktır.  $guvenlik: Çerezin istemciye güvenli bir HTTPS bağlantısı üzerinden aktarılması gerektiğini belirtmek için kullanılır. TRUE belirtildiği takdirde, çerez sadece güvenli bağlantı mevcutsa gönderilecektir. FALSE ön tanımlı değerdir.  $sadece_http: TRUE olduğu takdirde çerez sadece HTTP protokolü üzerinden erişilebilir olacaktır. Yani çerez, JavaScript gibi betik dilleri tarafından erişilebilir olmayacaktır. Bu ayar- lama, kimlik hırsızlığı riskini etkin şekilde azaltmaya yardımcı olabilir.
  • 59. 58 Örnek: Örnekte <html> etiketinden önce setcookie kullanılmıştır. Bunun sebebi setcookie fonksiyonu ile çerez oluştururken sayfaya herhangi bir bilgi gönderimi yapılmadan önce fonksiyon kullanılmalı- dır. Yukarıdaki cookie02.php sayfası ziyaret edildiğinde ekranda “test değeri” yazacaktır. Yukarıdaki örnekte cookie01.php fonksiyonu şu şekilde düzenlenirse çereze zaman aşım süresi ek- lenmiş olur. “time()” fonksiyonunun 60*60*24 ile çarpılması zaman olarak bir günü ifade eder. “time()” fonksiyonu o anki zaman damgasını saniye cinsinden elde eder. Diğer ifadelerde 60 saniye, 60 dakika ve 24 saati ifade eder. Bu sayıların çarpımı bir günün saniye karşılığını verir. setcookie(“test_cerezi”,$deger, time() + (60*60*24)) Çerez isimleri dizi isimleri olabilir. Böylece siz PHP betiğinizde bu çerezler için dizi kullanırken, kul- lanıcının sisteminde bunlar ayrı ayrı çerezler olarak saklanırlar. Tek bir çereze çok sayıda isim ve değer atamak için “explode” işlevini kullanabilirsiniz. Örnek: Şimdi de çerezleri kullanarak oturum yönetimi yapalım.
  • 60. 59 Yukarıda birinci dosya olan oturum_ac.php dosyası ile kullanıcı girişi yapılır. Bu aşamadan sonra sayfa1.php dosyası açıldığında kullanıcı adı ve şifre ile çerez karşılaştırılır. Eğer yanlış ise sayfa exit() fonksiyonu ile sonlandırılır. Değilse sayfa açılmaya devam edilir. Bu aşamada site içinde başka bir sayfaya geçilmek istenirse kullanıcı adı ve şifrenin URL sorgu cümlesi ile taşınarak (sayfa2.php?kullanici=ahmet&sifre=12345) her sayfanın başında çerezler ile karşılaştırılması ge- rekir. Karşılaştırma için kullanılacak if cümlesi ise şu şekilde olmalı.
  • 61. 60 <?php if ( $_COOKIE['kullanici']!=$_GET['kullanici'] and $_COOKIE['sifre']!= ]!=$_GET[sifre]){ echo "Şifreyi yanlış girdiniz..."; exit(); } ?> ‘exit’ fonksiyonu sayfanın çalışmasını sonlandırır. Çerezlerle oturum yönetimi PHP oturum yönetimi kullanılmadan çok zayıf olacaktır. Oturum açmak için tarayıcılar zaten “Kullanıcı adı ve şifre kaydedilsin mi?” şeklinde soru sormaktadır. Bu soruya evet dediğinizde o sitenin kullanıcı adı ve şifresi çerezler yoluyla kaydedilmektedir. Bundan sonra- sında PHP oturumu açılarak hem sayfalar arası geçişler çok daha kolay olur hem de çok sayıda oturumla ilgili verileri saklama imkânı olur. 9.2. PHP’DE SESSİON (OTURUM YÖNETİMİ) PHP'deki oturum desteği, belli bir veriyi sonraki erişimlerden korumak için kullanılır. Böylece daha özelleştirilmiş uygulamalar oluşturabilir ve sitenizi daha fonksiyonel yapabilirsiniz. Sitenize gelen her ziyaretçiye eşsiz bir kimlik atanır, buna oturum kimliği (session_id) diyoruz. Bu kimlik istemci tarafından bir çerezde ya da doğrudan URL üzerinde saklanır. Oturum desteği, internet sayfalarının çok sayıda (sayısı yazılımcıya bağlı) değişkeni oturuma kay- detmenize izin verir. Böylece bir oturumun başlaması ile birlikte bütün değerler sayfalar arası geçiş- lerde korunur. PHP’de oturum yönetimi için kullanılan pek çok fonksiyon vardır. Bu modülde session_start() ve session_destroy()fonksiyonları konu edilecektir. Aynı zamanda $_SESSION küresel değişkeni de modülde konu edilecektir. 9.2.1. Session Kullanım Yerleri Oturumun açılması ile birlikte çok sayıda değişkeni sayfalar arasında kullanabilmek, kullanıcıların tarayıcı kapatılana kadar site üyelik bilgilerinin aktif olarak kullanılabilmesini sağlar. E-posta sistem- leri, üyelik gerektiren sistemler bu yöntemi kullanırlar E-ticaret sistemleri oturum yönetimi sayesinde müşterinin kişisel bilgilerinin yanında aktif oturumdaki alış-verişlerini oturum değişkenleri ile birlikte taşır. Buna yaygın olarak alış-veriş sepeti denmektedir. session_start() fonksiyonu session_start() bir oturumu ya oluşturur ya da GET, POST veya çerez gibi bir istek üzerinden akta- rılan oturum kimliğine istinaden eski bir oturumu geçerli oturum haline getirir. Oturum başarıyla baş- latılabilmişse TRUE aksi takdirde FALSE döner. Oturumun başlaması ile birlikte oturum değişkenlerinin tanımlanması mümkün olur. Oturum değiş- kenleri $_SESSION dizi değişkeninde tanımlanır. Örneğin; $_SESSION[‘kullanici’] = ’ahmet’ gibi.
  • 62. 61 Oturum değişkenlerinin sayfalar arasında kaybolmadan dolaşabilmesi için session_start fonksiyonunun sayfaya hiçbir HTML değeri gönderilmeden önce başlatılması gerekir. ‘Bu uygulamalar yaygın olarak veri tabanları ile birlikte kullanılır. Üye giriş sayfasında kullanıcı adı ve şifre bölümü olur. Kullanıcının girdiği bilgiler veri tabanında doğrulanır. Eğer doğrulanma gerçek- leşmişse oturum başlatılır ve oturum değişkenleri oluşturulmaya başlanır. Eğer bilgiler onaylanmaz ise kullanıcı giriş sayfasına yönlendirilir. session_destroy() fonksiyonu session_destroy() işlevi geçerli oturumla ilişkilendirilmiş tüm veriyi yok eder. Kullanımı için aşağıdaki örneği inceleyiniz. Örnek: session01.php dosyası ile oturum açılmış ve kullanıcı ile eposta adlı iki küresel oturum değişkeni tanımlanmıştır. 3.Sayfa linki ile birlikte sayfa session03.php’ye yönlendirilmiştir. Bu sayfada yer alan oturum sonlan- dırma linkinde oturum sonlandırma işlemi için URL cümlesi oluşturulmuştur. Bu linke tıklanınca
  • 63. 62 $_GET üstünden sayfaya oturumu kapatma değeri gönderilmiş, session03.php dosyası 3. satırında yer alan session_destroy fonksiyonu ile oturum sonlandırılmış ve bütün oturum değişkenleri silin- miştir.
  • 64. 63 Oturum devam ederken bir oturum değişkenini silmek için unset() fonksiyonu kullanılır. Ör- neğin; unset($_SESSION[‘eposta’]) gibi.
  • 65. 64 Kaynakça http://web.adu.edu.tr/panel/lesson/PHP.pdf http://zafer.co/files/phpileoop.pdf http://webguvenligi.org/dergi/PHPKodGuvenligiVeYanlisBilinenl er-Aralik2010-CanberkBolat.pdf http://www.sahinbeyoglu.com/Uploads/1274188635-php.pdf http://www.serkanaksu.net/dersler/bpr253/ip02_php_degiskenler.pdf http://80.251.40.59/ankara.edu.tr/demircan/apache_php_mysql_Y DMA.pdf http://suhagokalp.com/wp- content/uploads/2015/03/PHPWebSiteYapimi.pdf http://www.megep.meb.gov.tr/mte_program_modul/moduller_pdf/A %C3%A7%C4%B1k%20Kaynak%20Kodla%20Temel%20Uygulama lar.pdf http://www.megep.meb.gov.tr/mte_program_modul/moduller_pd f/A%C3%A7%C4%B1k%20Kaynak%20Kodla%20Form%20%C 4%B0%C5%9Flemleri%20Ve%20Oturum%20Y%C3%B6netimi .pdf http://www.megep.meb.gov.tr/mte_program_modul/moduller_pdf/A %C3%A7%C4%B1k%20Kaynak%20Kodla%20Veri%20Taban%C4 %B1%20%C4%B0%C5%9Flemleri.pdf