Ünite 7: Sunucu Taraflı Veri Yönetimi

Giriş

Bir önceki ünitede de bahsedildiği gibi PHP, ASP ve JSP gibi sunucu taraflı dillerin ortaya çıkması, web teknolojileri için önemli bir kilometre taşı olmuştur. Bu diller sayesinde sunucu tarafında çalıştırılabilen kodlar yazılabilmiş, böylece esnek ve etkileşimli web sayfaları oluşturulmaya başlanmıştır. Sunucu taraflı diller ile geliştirilen web siteleri, web-kullanıcı etkileşimini, linklerin tıklanması veya dosyaların indirilmesinin ötesine taşımıştır. Kullanıcıdan istenilen verilerin alınabilmesi ve bu verilerin sunucu tarafında işletilebilmesi ise, “Web 2.0” olarak adlandırılan yeni web teknolojisinin çekirdeğini oluşturmuştur. Web formları sayesinde temel bilgi okur- yazarlığı seviyesinde bulunan kullanıcılara bile kolaylıkla web içeriğine katkı sağlama fırsatı verilebilmiştir. Böylece web içeriği, hemen her web kullanıcısının katkısıyla hızla artmaya başlamıştır.

Kişisel web siteleri, web mail hizmetleri, forumlar, bloglar, viki ansiklopedileri ve çevrimiçi sosyal ağ siteleri gibi platformların tamamının sunucu taraflı veri yönetimi çekirdeği etrafında geliştirildiği söylenebilir. Bu platformların hepsinin çalışma prensibi, kullanıcıdan web formları aracılığıyla alınan verilerin sunucu tarafından derlenen bir sayfaya yönlendirilmesi ve bu sayfa tarafından işlenmesi temeline dayandığı söylenebilir. Bu süreçteki dört önemli nokta ise kullanıcıdan verilerin alınması, verilerin bir veritabanı yönetim sistemi aracılığıyla işletilmesi, kullanıcı oturumlarının ve web tarayıcıya gönderilen verilerin yönetilmesidir.

Bu ünitede yukarıda değinilen dört nokta ele alınmaktadır. Buna yönelik olarak bir önceki ünitede temel kullanımı sunulan PHP dili üzerinden ilerlenilecektir. PHP derleyebilen bir web sunucusunun kurulumu, PHP dilinde değişken, şart ifadesi, döngü yapısı ve fonksiyon kullanımı gibi temel konuları bilmeyen okurun öncelikle “Sunucu Taraflı Uygulama Geliştirme” başlıklı üniteyi okuması önerilmektedir. Ayrıca veritabanı etkileşiminde önemli rol oynayan SQL’in temel düzeyde de olsa biliniyor olması, bu ünitede sunulan konuların anlaşılması açısından önemlidir.

Web Formları

Bilgisayar uygulamaları birçok durumda kullanıcılardan veri alarak bu veriler üzerinde işlem yaparlar. Bir masaüstü yazılımı, çoğu zaman kullanıcının kendi bilgisayarında çalışıyor olduğu için, kullanıcıdan kolaylıkla veri alabilir. Ancak PHP gibi sunucu tarafında işletilen bir platformun kullanıcıdan veri alması için gereken süreç, verilerin kullanıcıdan alınıp PHP sayfasına teslim edilmesini sağlayacak web formlarını gerektirir.

Form Oluşturma Süreci

Bir web sayfasında form oluşturma sürecini başlatmak için “ form ” adlı etiket kullanılır. Bu etiket ile başlayan formun, üzerindeki verileri sunucudaki web sayfasına doğru bir şekilde teslim edilmesi için iki önemli tanımlama yapılmalıdır. Bu noktada kullanılacak ilk argüman, form verilerinin hangi sayfaya teslim edileceğidir. Form verilerinin yönlendirileceği adres, “action” özelliği üzerinden belirtilir. Örneğin “ form action=’verilerial.php’ ” şeklinde oluşturulan etiket, oluşturulan form üzerindeki verilerin “verilerial.php” adlı sayfaya teslim edileceğini belirtir.

Form etiketi içinde tanımlanması gereken ikinci özellik ise verilerin hangi metod ile teslim edileceğidir. Veriler bir PHP sayfasına teslim edilirken birçok metod kullanılabilir. En çok kullanılan form verisi teslim metodları ise GET ve POST metodlarıdır. GET metodu, verileri adres satırı üzerinden gönderdiği için, bu verilerin dışarıdan görülebilmesi ve tarayıcı geçmişine kaydedilmesi gibi durumlar olasıdır. Bu nedenle, parola veya özel mesaj gibi verilerin GET metodu ile gönderilmesinden kaçınılmalıdır. Kullanılabilecek diğer metod olan POST ise verileri adres satırında görünmeyecek şekilde gönderir. Bu nedenle, gizli kalması gereken veriler için tercih edilmektedir. Ayrıca POST metodu, GET metoduna göre çok daha büyük veri paketlerini gönderebilme potansiyeline sahiptir.

“ formaction=’verilerial.php’method =’POST’ ” etiketi, üzerinde hem verilerin teslim edileceği sayfayı hem de verilerin teslim edilme metodunu bulundurmaktadır. Bu etiket ile “ /form ” etiketi arasında kalan metin kutusu, radyo butonu veya seçim kutusu gibi elemanların üzerinde bulunan veriler, “verilerial.php” sayfasına, POST metoduyla teslim edilecektir.

Web sayfalarında en çok kullanılan form elemanlarının metin kutusu, parola kutusu, metin alanı, radyo butonu ve işaretleme kutusu olduğu söylenebilir.

Veritabanı İşlemleri

Sunucu taraflı web uygulamaları genellikle çok sayıda kullanıcıya yönelik olduğu için, sıklıkla büyük miktarlarda verilerin işlenmesini gerektirir. Bir web sitesinin milyonlarca kullanıcısının olması olasıdır. Her kullanıcıya ait kişisel bilgiler, tercihler veya mesajlar gibi çok sayıda veri parçasının kaydının tutulması, işlenmesi ve gerektiğinde okunması gerekmektedir. Kuramsal olarak bu verilerin basit dosya yapılarında tutulması olanaklıdır. Ancak bu yapı oldukça hantal, hataya açık ve esneklikten uzak olacaktır. Ayrıca bu yapının birçok güvenlik açığının bulunması da söz konusudur. Bu nedenle web projelerinde işlenecek veriler konusunda veritabanı yönetim sistemlerinden yardım almak gerekmektedir. Veritabanı yönetim sistemleri, veri yönetimi konusunda uzmanlaşmış sistemlerdir. Verilerin esnek, hızlı ve güvenli bir şekilde işletilmesini sağlarlar. Ancak veritabanı yönetim sistemlerinin kullanılması, veritabanı tasarımı becerisini ve veritabanıyla iletişim kurulmasını sağlayacak SQL gibi bir veri sorgulama dilinin bilinmesini gerektirmektedir.

Veritabanı Yönetim Sistemlerinin Kullanılması

Bir veritabanı yönetim sistemi, farklı adlara sahip birden fazla veritabanı içerebilir. Veritabanı ise yine farklı adlara sahip birden fazla tablo içerebilir. Anlaşılacağı üzere bu tablolar, satır ve sütunlardan oluşan veri setleridir. Doğru tasarlanmamış bir veritabanı ile çalışan web projeleri, sistem kaynaklarını etkin kullanmayacağı gibi, projenin geliştirilme sürecinde de güçlüklerin yaşanmasını sağlayabilir. Veritabanı tasarımı yapılırken, işletim sürecinde veri tekrarının en az düzeyde kalmasına ve sonradan ortaya çıkacak ihtiyaçları karşılayacak esnekliğe sahip olmasına dikkat edilmelidir.

Tasarlanan bir veritabanının gerçeklenmesi, veritabanı ve tabloların veritabanı yönetim sistemi üzerinde oluşturulmasıdır. WampServer gibi yazılım paketleri, phpMyAdmin adında, PHP ile oluşturulmuş bir veritabanı yönetim arayüzü içerir.

phpMyAdmin paneldeki önemli bağlantılar aşağıdaki gibi özetlenebilir.

  • Veritabanları: Veritabanlarını listeleyen ve yeni veritabanı oluşturma olanağı sağlayan arayüze ulaştırır.
  • SQL: Veritabanları üzerinde SQL dili ile soru yapılmasını sağlayan arayüze ulaştırır.
  • Durum: Veritabanına ilişkin istatistikleri sunan arayüze ulaştırır.
  • Kullanıcılar: Veritabanı kullanıcılarının oluşturulması, silinmesi veya yetkilendirilmesi gibi işlemlerin yapılabileceği arayüze ulaştırır.
  • Dışa Aktar: Veritabanlarının yedeğinin alınmasını sağlayan arayüze ulaştırır.
  • İçe Aktar: Veritabanlarının yedekten yüklenmesini sağlayan arayüze ulaştırır.
  • Ayarlar: phpMyAdmin arayüzüne ilişkin ayarların yapılmasını sağlayan arayüze ulaştırır.

“Veritabanları” tıklandığında “Veritabanı oluştur” etiketli metin kutusuna, oluşturulacak veritabanının adı yazılıp “Oluştur” etiketli butona basıldığında, yeni bir veritabanı oluşturulacaktır. Veritabanı oluşturulduğunda sol taraftaki panelde yeni veritabanının adı görüntülenecektir. Bu adın üzerine tıklanması, sağ tarafta kalan kısımda içeriğinin görünmesini sağlayacaktır. “Veritabanında tablo bulunamadı.” şeklinde bir mesaj görüntülenecektir. Bu metnin altında kalan “Tablo oluştur” etiketli form kullanılarak yeni bir tablo ekleme süreci başlatılabilir. Oluşturulacak tablonun ismi ve tablonun kaç sütundan oluşturulacağı bu forma yazılıp “Git” etiketli butona basılır. Oluşturulacak tablonun sütun başlıklarının ve bu başlıklar altında tutulacak verilerin ad, veri türü, uzunluk, varsayılan değer, boş bırakılabilme, indekslenme ve otomatik artış gibi özelliklerinin tanımlanmasını sağlar.

Web projelerinde, kullanıcıların veritabanına veri girişi genellikle yukarıda anlatılan web formları aracılığı ile sağlanır. Kullanıcıya sunulan bir form üzerindeki veriler, bu verileri alıp veritabanına ekleyen diğer bir sayfaya yönlendirilir.

Kayıt formundan gelen verilerin teslim edileceği sayfanın gerçekleştirmesi gereken üç işlem vardır. Bu sayfa öncelikle, veri kaydetmek istediği veritabanı ile bağlantı kurmalıdır. Daha sonra web formu üzerinden gelen kullanıcı verilerini almalı, son olarak da bu verileri veritabandaki ilgili tabloya eklemelidir.

Kullanıcılardan gelen verilerin veritabanına yazıldığı nokta, sistem güvenliği açısından oldukça önemlidir. Veritabanına yönelik saldırılar genellikle bu noktalardaki zayıflıkların suistimal edilmesi şeklinde olmaktadır. Bu nedenle, web formlarından gelen verilerin veritabanına dokunmasından önce bu veri içeriklerinin kontrol edilmesi gerekir. “mysqli_real_escape_string()” adlı fonksiyon, kendisine verilen içerikteki özel karakterleri temizleyerek bu tehdidi ortadan kaldırır. Bir sonraki sayfada sunulan PHP kodunda bu değişiklik yapılmıştır. Sunulan kodun dört ve beş numaralı satırları, verileri POST üzerinden okurken aynı zamanda “mysqli_real_escape_string()” adlı fonksiyondan geçirilmektedir. Bu işlem, zaten MD5 algoritmasıyla şifreleneceği için, kullanıcı parolası üzerinde yapılmamıştır.

Suistimale açık bir nokta da kullanıcıların web formlarına HTML etiketleri yazabiliyor olmasıdır. Kullanıcıdan gelen ve tarayıcı tarafından tanınıp işlenebilecek olan HTML veya JavaScript kodları tehdit oluşturabilir. Buna ilişkin önlem almak, “strip_tags()” fonksiyonu ile mümkündür.

Kayıt formu ile kaydedilen verileri listeleyen bir web sayfası oluşturmak da PHP ile gerçekleştirilebilecek veritabanı etkileşimlerine ilişkin güzel bir örnek olacaktır. Veritabanındaki verileri listeleyen PHP sayfasının veritabanına bağlanıp, sonrasında tablodaki verileri çeken bir SQL sorgusu çalıştırması gerekir. Gerçekleştirilen SQL sorgusunun ürettiği sonuçtaki verilerin okunup sayfaya basılması ise ayrıca işletilecek bir süreçtir.

PHP, MySQL veritabanı üzerinde yapılacak işlemlere yönelik olarak birçok fonksiyon içermektedir.

Veritabanı işlemlerinin gerçekleştirilmesini sağlayan PHP fonksiyonları:

  • mysqli_connect(): Veritabanı bağlantısı kurar.
  • mysqli_real_escape_string(): Veritabanı sorgularında kullanılacak verideki özel karakterleri temizleyerek sorgu güvenliği sağlar.
  • mysqli_query(): Veritabanının SQL ile sorgulanmasını sağlar.
  • mysqli_num_rows(): SQL sorgularından dönen sonuçların kaç satır veri içerdiğini döndürür.
  • mysqli_num_fields(): SQL sorgularından dönen sonuçların kaç sütun veri içerdiğini döndürür.
  • fetch_assoc(): Sorgu sonucu içeren nesnenin bir sonraki satırı ele almasını sağlar.
  • mysqli_data_seek(): Sorgu sonucu içeren nesnenin istenen satırı ele almasını sağlar.
  • mysqli_stat(): Veritabanının durumuna ilişkin veri sağlar.
  • mysqli_ping(): Veritabanı bağlantısının kontrol edilmesini sağlar.
  • mysqli_info(): Veritabanında gerçekleştirilen son sorguya ilişkin bilgileri sunar.

Oturum Yönetimi

PHP sayfalarının ziyaretinden sonra, söz konusu sayfalar tarafından sunucuda oluşturulan değişkenler ve bu değişkenlerde tutulan veriler tamamen yok olurlar. Ancak bazı özel durumlarda, ziyareti tamamlanan bir sayfa tarafından üretilen verinin, ziyaret edilen bir sonraki sayfa tarafından kullanılması gerekebilir. Örneğin, kullanıcıdan mail adresini ve parolasını alan bir sayfa, gerekli veritabanı kontrollerini yaparak söz konusu kullanıcının kimliğini doğruladığında, bu kimlik verisinin diğer sayfalarca da erişilir olması gerekir. Aksi durumda kullanıcı, ziyaret ettiği her sayfaya kimliğini doğrulamak için mail adresi ve parola bilgisi vermek zorunda kalır ki bu, son derece olumsuz bir kullanıcı deneyimi getirir.

Oturum Yönetimi Süreci

Oturum yönetimi, aynı ziyarete ilişkin verilerin PHP sayfaları arasında paylaşımını sağlamaktadır. “session_start()” adlı fonksiyonla başlatılan oturum, “$_SESSION[]” dizisi içinde oturum verilerinin tutulmasına olanak verir. Bu diziye yazılan veriler, kullanıcı tarayıcısı kapanana, oturum süresi dolana ya da “session_destroy()” fonksiyonuyla yok edilene kadar erişilebilir olur.

Oturum yönetiminin doğru anlaşılması için kullanılabilecek en güzel örneğin, basit bir “kullanıcı girişi” sisteminin oluşturulması olduğu söylenebilir. Önceki başlıkta oluşturulan veritabanı ve kullanıcı kayıt sistemi de bunun için hazır bir altyapı oluşturmuştur. Kullanıcı giriş sistemi oluşturabilmek için yapılması gereken ilk şey, bir giriş formu hazırlamaktır. Sonrasında ise giriş formundan aldığı verileri veritabanındaki veriler ışığında kontrol ederek kullanıcı oturumunu başlatan sayfa hazırlanmalıdır. Bu sayfa tarafından oluşturulan oturum sayesinde, diğer sayfalar da kullanıcının kimlik verilerine ulaşabilecektir.

Oturum açacak olan PHP sayfasının iki numaralı kodu, sonradan kullanılmak üzere veritabanı bağlantısı yapmaktadır. Dört ve beş numaralı satırlar ise formdan gelen verileri “$mailadresi” ve “$parola” adlı yerel değişkenler üzerine almaktadır. Bu noktada “mysql_real_escape_string()” adlı fonksiyonla veritabanı sorgusunda kullanılacak form verilerine ilişkin güvenlik önlemi alındığına dikkat edilebilir. Ayrıca parolalar veritabanında MD5 algoritmasından geçirilmiş hâlde tutulduğu için, buradaki parola da MD5 algoritmasıyla şifrelenmiştir. Yedi ve sekiz numaralı kod satırını kapsayacak şekilde işletilen SQL sorgusu ise gelen kullanıcı bilgilerine uyan kayıt satırının “kullanicino” alanındaki verisini çekmek için işletilmiştir. Bu sorgu 0 satırlık bir sonuç döndürürse yani bu verilere uyan herhangi bir kayıt yok ise, veritabanında olmayan bir e- posta adresi ve parola ikilisinin girildiği sonucuna ulaşılabilir. On numaralı satırdaki “if” yapısı, “mysqli_num_rows()” fonksiyonuyla bunu kontrol etmektedir. Eğer dönen sonuç 0 satıra sahip değil ise söz konusu verilere uyan bir kayıt bulunmuş demektir. Bu durumda da “else” deyimine bağlı olan 14, 15, 16,17 ve 18 numaralı satırlardaki kodlar devreye girer. 14 numaralı satırda, önceden “$sorgu” adlı değişkene aktarılmış sorgu sonucunun içerdiği veri setinin ilk satırı “$sorgusonucu” adlı değişkene aktarılmaktadır. 15 numaralı satır, kullanıcının bu değişkende bulunan numarasını “$kullanicino” adlı değişkene aktarır. 16 numaralı satırdaki “session_start()” adlı fonksiyon, yeni bir oturum başlatır. 17 numaralı satırda ise yeni bir oturum değişkeni oluşturulup bu değişkene kullanıcının numarası yazılmaktadır. Böylece, kullanıcı tarafından ziyaret edilen diğer sayfalar, oluşturulan oturum değişkenine bakarak ziyaretçinin kullanıcı numarasını görebilecek, dolayısıyla kimliğini edinebileceklerdir. 18 numaralı satırdaki echo deyimi, kullanıcıya oturumunun açıldığını bildirip, “anasayfa.php” sayfasına yönlendirecek bir link sunacaktır.

Çerez Yönetimi

Sunucu taraflı uygulamalarda yönetilmesi gerekebilen önemli bir veri türünün de çerez adı verilen yapılar olduğu söylenebilir. Çerezler, sunucu tarafından tarayıcılara gönderilen, tarayıcı tarafından belirli bir süre boyunca saklanan ve gerektiğinde tekrar sunucuya gönderilen veri parçalarıdır. Birçok amaçla kullanılabilecek çerezler sayesinde kullanıcı adı ve parola gibi bilgilerin sonraki ziyaretlerde de hatırlanması mümkün olabilir. Oturum açmamış olsa bile, kullanıcı tarafından özelleştirilen bir sayfanın kullanıcıya özel görüntüsü, çerezler yardımıyla kalıcı hâle getirilebilir. Bir alışveriş sitesi, yine çerezler üzerinde kullanıcı tercihlerini tutabilir. Kullanım örneği verilen bu yapılar, iki farklı kullanıma sahip olan ve aşağıda örneklendirilen “setcookie()” adlı fonksiyon ile oluşturulurlar.

Dikkat edileceği üzere, sunulan kodun iki numaralı satırında, çerez ömrü olarak güncel tarihten 1000 saniye öncesi tanımlanmıştır. Bu durum doğal olarak, tarayıcı tarafından çerezin ömrünün dolduğu şekilde yorumlanacak ve temizlenmesi sağlanacaktır.

Çerezler konusunda dikkat edilmesi gereken bir nokta da web tarayıcıların çerezleri kabul etmeyecek şekilde ayarlanabilmesidir. Güvenlik ve gizlilik gerekçeleri ile çerez kabulünü kapatan kullanıcı sayısının azımsanmayacak ölçüde olduğu söylenebilir. Web uygulamaları tasarlanırken bu durumu da göz önünde bulundurmakta yarar vardır.

Sunucu taraflı uygulamalar için veri yönetim sürecinin oldukça önemli olduğu söylenebilir. Kullanıcılarıyla, veritabanlarıyla ve web tarayıcılarla sıklıkla veri alışverişi yapan sunucu taraflı uygulamalar, bu süreçteki en önemli kaynak olan kullanıcılardan veri almak için genellikle web formlarını kullanırlar. Kullanıcılara bir web sayfası içinde sunulan web formları, kullanıcıdan çeşitli formatlarda aldığı verileri sunucuya gönderecek şekilde oluşturulur.

Sunucu üzerinde depolanıp işlenecek veriler için kullanılabilecek en uygun yapı veritabanıdır. PHP dilinde veritabanı bağlantısı oluşturmak ve veritabanı üzerinde SQL sorguları çalıştırmak için gerekli bütün fonksiyonlar mevcuttur. “mysqli_query()” fonksiyonu üzerinden veritabanına iletilecek SQL sorguları sayesinde verilere ilişkin yazma, okuma, güncelleme ve silme gibi işlemlerin tamamı yapılabilir. Yine aynı fonksiyon tarafından döndürülen sorgu sonuçlarını, “mysqli_result()” adlı fonksiyon ile ele alınıp işlemek mümkündür.

Web uygulamalarının ziyaretleri sırasında, sunucu tarafında tutulması gereken ve PHP sayfaları arasında paylaşılabilen verilerin oluşturulması gerekebilir. Bu gibi durumlarda oturum değişkenleri oldukça kullanışlıdır. Bir PHP sayfası tarafından “$_SESSION[]” adlı dizi üzerinden oluşturulan oturum değişkeni, diğer PHP sayfalarından da ulaşılabilir. Oturum değişkenleri, süreleri dolana, kullanıcı tarayıcısını kapatana ya da session_destroy() fonksiyonuyla yok edilene kadar etkindirler.

Kullanıcıya özel verilere ilişkin diğer bir olanak da söz konusu verilerin web tarayıcılar tarafından tutulmasını sağlayabiliyor olmaktır. Sunucu taraflı uygulamalar tarafından web tarayıcılarına gönderilebilen çerez adlı yapılar, tarayıcıların belleğinde geçici olarak tutulabilir. Bu veriler sayesinde istemde bulunan tarayıcı, sonraki ziyaretlerde tekrar gerekebilecek verileri, kullanıcıya sormaya gerek kalmaksızın sunucuya gönderebilirler.