SequelPro: MacOSX kullanıcıları için PHPMyAdmin alternatifi

MacOSX’de php geliştirme ortamı kurmak, diğer işletim sistemlerine göre çok daha kolay. MAMP ile neredeyse tek drag & drop ile apache, php, mysql üçlüsünü çalışır hale getirmek mümkün.

Eğer *AMP kullanan bir web geliştiricisi iseniz muhtemelen tüm veritabanı yönetiminizi phpmyadmin ile yapıyorsunuzdur. PHPMyAdmin kuşkusuz taşınabilir ve esnek yapısıyla istediğiniz gibi özelleştirebileceğiniz bir yönetimsel araç. Fakat bazı noktalarda bazen bir masaüstü aracının sunacağı özellikleri sunamayabiliyor.

Sequel Pro, adından paralı bir yazılım gibi bir çağrışım yapsa da ücretsiz bir yazılım. Basit ve minimalist bir arayüze sahip Sequel Pro’nun kullanımı oldukça kolay.

Okumaya devam et “SequelPro: MacOSX kullanıcıları için PHPMyAdmin alternatifi”

PHPStorm, PyCharm veya RubyMine kullanıcıları, projenizi veritabanı entegrasyonu ile geliştirin

PyCharm, PhpStorm, and RubyMine kullanıcıları, jetbrains son güncellemelerden biriyle saydığım IDE’lere gelişmiş veritabanı desteği ekledi. Daha önce de vardı fakat hiç veritabanı bağlantısını PHPStorm’da kullanmamıştım fakat bu videodan sonra denemeye karar verdim ve oldukça efektif buldum.

Java bağlayıcılarını yükledikten sonra birçok veritabanı motorunu projenize bağlayabiliyorsunuz. Projenize veritabanı bağlantınızı kurduktan sonra veritabanı yapısını gözden geçirebilir, yapıyla oynayabilirsiniz. Teknik olarak phpmyadmin yerine bu kısımları kullanabilirsiniz. Bu kısmı ilgimi çok çekmedi, fakat spesifik olarak SQL geliştirirken veritabanı konsolunu kullanabilir ve kod yazım zekasını kullanabilirsiniz. Buraya kadar IDE’den bağımsız bir veritabanı yönetim aracı gibi geldi.

Asıl işe yarayan kısmı ise, kodunuzdaki SQL’leri doğrudan çalıştırabilir veya php kodunuzda SQL yazarken kod yazım zekasını kullanabiliyorsunuz. Videoda örnek kullanımda görebilirsiniz.

Kaynak: http://blog.jetbrains.com/webide/2012/11/sql-support-and-database-tools/

PHP ile tekil anahtar oluşturmak

Türkçesini çok bulamadığım hash kelimesini anahtar olarak kullanacağım. Burada aslında bahsettiğim anahtar herhangi bir veri grubunuza atadığınız, sayısal olmayan kimliklerden bahsediyorum. Yani rasgele üretilmiş belirli bir uzunlukta olan kimlikleri her yerde kullanıyoruz.

Neden sayısal bir kimlik kullanmak yerine bu anahtarlara ihtiyaç duyacağınızı en açık şekilde şöyle anlatabilirim. Mesela tahmin ederek erişilmesini istemeyeceğiniz ama şifre veya kullanıcı girişi gibi herhangi bir sınırlama koyamayacağınız bir sayfanız var, örnek veriyorum yapılacak işler listesi veritabanı oluşturuyorsunuz ve her kayıt bir yapılacak iş listesi. Veritabanında sayısal bir kimliğe yani numaraya sahip bu kayıtlar. Hazırladığınız bir php sayfası da liste numarasına göre yapılacak iş listesinin detayını ekrana döküyor.

Eğer liste_detay.php?no=145 gibi basit bir şekilde tutarsanız url’i oynayarak başkalarının listelerine erişebilir, sadece erişmek değil sistemdeki tüm listeleri basit bir script ile tahmin edebilir veya tarayıp kaydedebiliriz. Böyle bir durumda listelerinizi sadece sayısal değil, tahmin edilemeyecek bir anahtar ile (örneğin: t34de6gx) tanımlamak istiyorsunuz.

Bu noktada rastgele bir anahtar üretebilirsiniz, bunu yapmak çok zor değil. PHP’deki rasgele sayı üretme fonksiyonunu kullanarak ve bir karakter dizisinden rastgele elemanlar çekerek bir kelime üretebilirsiniz.

Bunu daha pratik bir şekilde tek satırda bile yapabilirsiniz:

Bu satır size 6 karakterlik bir kelime üretecektir. Basitçe str_shuffle fonksiyonu ile özel karakter içermeyen ve rakamlarında dahil olduğu bir alfabeyi karıştırıyor ve başındaki ilk 6 karakteri alıyoruz.

Şimdi bu, işin basit kısmı. Eğer veritabanındaki bir veri set için bu anahtarı oluşturuyorsanız üretilen anahtarın veri setinde daha önce kullanılıp kullanılmadığını test etmek zorundasınız. Sonuçta tekil bir anahtar oluşturuyorsunuz. Bu arada veri setiniz mysql veya bir sql veritabanında olmak zorunda değil, bir xml, csv veya txt dosyasında saklı olan bir set için de benzer şeyi uygulayabilirsiniz.

Veritabanındaki veriyi test ederek bir anahtar oluşturmanın en kısa ve basit kodu şöyle:

Bu kod, veritabanında olmayan bir anahtar üretmenizi sağlayacaktır. Sonra verinizi hazırlayıp tablonuza yeni kayıdınızı ekleyebilirsiniz.

MySQL’de optimizasyon analizi

MySQL’de Procedure Analyse fonksiyonu ile tablo yapınıza ait betimsel istatistikler ve alanlara ait veri türü önerisi elde edebilirsiniz. Bu sayede içi dolu olan bir tablonuzun yapısını optimize ederken kaydedilen veri hakkında fikir sahibi olabilirsiniz.

Procedure Analyse, çıktı olarak tablonuzdaki her alana ait minimum, maksimum, içindeki veri boyutlarının alt ve üst sınırlarını, ortalama standart sapma ve en önemlisi, o ana kadar kaydedilmiş verilerin profiline göre o alanın en ideal hangi türde olması gerektiğine dair öneri veriyor.

Sonuçta nümerik alanlarda ortalama, standart sapma, minimum maksimim değerleri düşünerek veri boyutunuzu saptayabilirsiniz. Aynı durum varchar alanlarda da geçerli. Çoğu zaman select sorguları gereksiz yere büyük açılmış alan türlerinden ve indeks oluşturulmamış basit alanlardan dolayı oldukça uzun sürelerde sonuç veriyor. Hatta bazen zaman aşımına uğruyor.

MySQL’de Procedure Analyse hakkında bilgi almak için
taze yazdığım şu dökümanı inceleyebilirsiniz :

MySQL’de Procedure Analyse ile optimizasyon analizi

MySQL’de Procedure Analyse ile optimizasyon analizi

MySQL’de büyük veri taşıyacak tablolar ürettiğinizde bazen indeksleri doğru seçemeyebiliyor, alan türlerini iyi belirleyemiyoruz. Gözden kaçan şeyler olabiliyor veya bilmediğimiz alan türleri ile çalışıyor olabiliriz.

Veri boyutu büyüdükçe sistemdeki sorgu süreleri büyüyebiliyor. Hatta bu optimizasyonu iyi yapmazsanız aslında 1 saniyeyi geçmeyecek sorgular için dakikalar harcayabilir, kodunuz zaman aşımına uğrayabilir (timeout).

Optimizasyon konusunda çeşitli teknikler var tabiki. Bu dökümanda basitçe tek sorgu ile mysql’in yapı analizi çıktısı almayı ve oradaki önerileri değerlendirmeyi anlatacağım.

Bir tablonun yapısını öğrenmek için

sql kodunu kullanarak tablo yapısını öğrenebiliriz. Çıktı olarak her alanın adını, türünü, null olup olmadığı, indeks türü gibi değerler döner. Kaç alanınız var ise o kadar satır çıktı alırsınız.

MySQL’deki Procedure Anlayse fonksiyonu ile bu alanların bazı betimsel istatistiklerini ve önerilen türünü öğrenebilirsiniz. Bunun için de

kodunu çalıştırmanız yeterlidir. Bu kod çıktı olarak kaç tane alanınız var ise o kadar kayıt dönecektir. Bu kayıtlar şu bilgilere sahip olur :

Burada dikkat edeceğiniz şey, alan boyutlarının alt ve üst değerleri. Yani mesela siz varchar(200) lük bir alan ürettiniz. Ve tablonuz verilerle doldu, bu analize bakınca o alan için Min_length 10 Max da 50 diyorsa sizin alan boyutunuzu 70-80 gibi bir boyuta düşürmeniz daha az bellek harcamasını sağlar. Yani 200 olarak düşündüğünüz alan uygulamada, yani gerçekte o boyuta ulaşmamış ve daha ufak kalmış.

Benzer konu nümerik alanlar için de geçerli. Yani sizin teorik/ideal olarak düşündüğünüz veri boyutu bazen büyük gelebilir. Bu noktada alan türü ve boyutunu değiştirerek select gibi sorguları daha hızlı hale getirebilirsiniz.

Index atama konusunda da bu geçerli, eğer select’lerde çok kullandığınız ve where kalıplarına sürekli soktuğunuz bir alanınızın standart sapması ufak ise (yani birbirinden çok farklı değerler almıyorsa – ama tekil ise) o alana bir indeks atayarak sorgu işletim zamanını oldukça kısaltabilirisiniz.

Burada bir güzel şey de, mesela sadece gruplama amacı ile bir alanı varchar(30) yapıp içine "anket", "forum", "dokuman" gibi 3 değer atıyorsunuz. Tabiki projeyi tasarlarken bunun farkında olmazsınız ve "Ya burada her türlü şeyi tanımlarım" diye düşünürken projeye bu üçü dışında başka şey gelmediğini farkettiğinizde bu analiz çıktısında zaten mysql size veri türünü ENUM("anket", "forum", "dokuman") olarak ayarlamanızı önerecektir.

Bu çıktıyı sadece optimizasyon değil, log tuttuğunuz bazı tablolardaki basit istatistiksel çıkarımlarla veri hakkında fikir edinmek için de kullanabilirsiniz. Zira ortalama, standart sapmaya veriyor olması o verinin dağılımı konusunda size oldukça fazla fikir verebilir.

PHP ve PEAR

v0.7’de altyapıda neredeyse bütün işlerimi PEAR’a yaptırdım. Son günlerde pear’da mysql işlemleri ile ilgili sorular sorulmaya başlandı, ben de yazayım dedim, pear ile SQL işlemlerini MDB2’ye yaptırmaya yönelik 2 döküman yazdım. İkincisi diğerinin devamı gibi oldu ama ana konu sql injection’dan kaçmak. Yine de vermem gereken bilgileri verdim 🙂

Pear’da MDB2 ile veritabanı işlemleri
PEAR ve MDB2 ile “Prepare & Execute” sayesinde SQL injection saldırılarına karşı koymak

Pear’da MDB2 ile veritabanı işlemleri

MDB2 nedir?

MDB2 pear’da eskiden DB adıyla geliştirilen ve bir süre önce gelişimi durdurulup projeyi mdb2 olarak devam ettirdikleri bir veritabanı yönetim kütüphanesidir. Aslında sırayla girdiğimiz mysql_connect, mysql_select_db, mysql_query … gibi işlemleri biraz daha ortak yapıda kullanmamızı sağlayan, çeşitli yetenekleri olan güvenli bir kütüphane.

Normalde veritabanımıza (mysql, mssql veya pgsql farketmez) bağlanırken bağlantı kaynak değşkeni oluştururuz. Örneğin :

sonra da bu değişkeni kullanarak fonksiyonlarımızı işletiriz. Bu noktadan sonra veritabanı seçeriz ve sorgular üretip sonuçlarını işleriz.

MDB2’de veritabanı bağlantı cümleleri vardır. Tek hamlede hem bağlantı değişkenimizi oluşturur hem de veritabanı seçeriz.

connect yerine factory fonksiyonunu da kullanabilirsiniz, aynı işi görmektedir. Bağlantı cümlesi, pear dizininde MDB2’nin dizinindeki Drivers klasöründe yüklediğiniz veritabanı sürücülerine göre değişir.

Genellikle mysql için kullanacağınızdan örnek vermek gerekirse

yeterince açık ama yine de üstünden geçeyim. Gördüğünüz gibi cümle bir protokol adresi gibi. Yani ftp’ye bağlanmaktan farksız 🙂 önce protokol türünü belirtiyoruz (mysql, pgsql, sqlite vs) arada “://” işaretlemesinden sonra kullanıcı, “:” ve şifreyi belirtiyoruz. @ işaretinden sonra sunucu adresi. Sonrasında da klasör ifade eder gibi veritabanı adını veriyoruz. SQLite için ise protokoldan sonra doğrudan dosya adresini veriyorsunuz. (Daha fazla bilgi için http://pear.php.net/manual/en/package.database.mdb2.intro-dsn.php)

Biliyorsunuz mysql mssql sqlite pgsql arasında çok fazla kural farkı yok. Yani aynı sorgularla veri ekleyebiliyor, güncelleyebiliyor, silebiliyor ve listeletebiliyoruz. Böylece aynı veritabanı yapısına sahip mysql ile çalışan bir projeyi mssql’e geçirmek çok da zor olmuyor 🙂

Şimdi basitçe bir sorgu işletmeyi göstereyim. MySQL’de bir sorgu işletmek için:

şeklinde kullanıyorduk. MDB2’de de çok farklı değil:

sorgu sonucunu işlerken

şeklinde kullanırdık. İşte bu noktada MDB2 bize birçok kolaylık sağlıyor. MDB2’de sürü sepet sonuç işleme fonksiyonu var fakat biz 2 tanesini kullanacağız.

Bu kodda $uye_bilgisi değikeni dizi olarak indisleri normal numara olmak üzere
$uye_bilgisi[0]’da no,
$uye_bilgisi[1]’da adi,
$uye_bilgisi[2]’da eposta,
alanlarını tutar. fetchRow fonksiyonunun parametresiyle “İşleme Türü”nü ayarlarız. Eğer ayarlamazsak, veri az önceki gibi gelecektir.

olarak kullanırsak taboldaki indis adlarına göre doğrudan seçebiliriz verimizi ($uye_bilgisi[no], $uye_bilgisi[adi] $uye_bilgisi[epsta]). Bunu her seferinde yapmak yerine, veritabanı bağlantısı yaptıktan hemen sonra

ile “İşleme Türü”nü tüm betik için ayarlamış oluruz. Bundan sonra ilk verdiğim örnek koda göre işleminizi kolayca yapabilirsiniz.

Genellikle 2 tür veri çekeriz, tek satırlık sonuçlar veya listeler. Mesela yukarıdaki sql cümlesi bize tek kayıt döner yani 5 nolu üyenin bilgilerini. Bunun için doğrudan fetchRow() kullanarak bilgileri aldık. Çok satırlı bir sql sorgusu işletiyor olsaydık :

şeklinde fetchRow()’u while içinde değişkene atama olayı olarak tanımlayacaktık. Böylece kayıtlar bittiğinde atama gerçekleşmeyecek ve döngü duracaktı. Fakat bu noktada kolaylık olsun diye tüm kayıtları çok boyutlu diziye doğrudan almak için fetchAll() fonksiyonunu kullanıyoruz.

Tabi $tum_uyeler dizisi bizim listeledigimiz sql sonucunu dizi olarak donuyor bize. Dizi boyutu da kayıt sayısı yani üye sayısını veriyor count($tum_uyeler) ile. Aynı işlemi $sorgu->numRows() ile de yapabilirdik. Zira while ile kullanıyorsak dizi boyutu diye birşey olmayacak ve numRows‘u kullanacağız.

Bu iki yol da neredeyse aynı. while, foreach veya verinizin dizi olarak olup olmaması alışkanlıklarınız ve programlama anlayışınız ile ilgili birşey.

Daha da hızlı dizi olarak almak istiyorsanız

size tüm üyleri çok boyutlu dizi olarak $uyeler değişkenine atayacaktır. query + fetchAll işleminin kısaltılmışıdır 🙂

Ek olarak

$sorgu->numCols() ile sorgudan kaç tane kolon çıktığını öğrenebilirsiniz.
Aynı zamanda $sorgu->fethcCol() ile verinizi kolon kolon alabilirsiniz de (nerede kullanacağınızı bilmiyorum ama işe yarayabilir).

$sorgu->getColumnNames() ile işlenen kolonları dizi olarak alırsınız. İşleme sırasıyla yerleşecektir dizide. Sorgudan hangi kolonların döndüğünü bilmediğiniz sorgularda kolonları meta olarak basabilmek için kullanabilirsiniz bu fonksiyonu.

$sorgu->seek(5) ile sorguları dönerken 5 kayıt atlamanızı sağlar (ilginç).

$db->lastInsertID() ile son “insert into uyeler (…) values (…)” tipi, veri kayıt sql sorgunuzda eklenen kayıt için, auto_increment olan kolona atanan numarasını döner.

Hata yakalamak

Sorgunuzu çalıştırırken birçok nedenden dolayı çalışmayabilir.

kullanımı; PEAR:isError($sorgu) $sorgu degişkeni ile tanımlanan veritabanı sorgu nesnesinde hata varsa, aynı nesnedeki getMessage() fonksiyonu ile hata mesajını iletir.

http://pear.php.net/manual/en/package.database.mdb2.php adresinden mdb2 manual’ına ulaşabilirsiniz.

MySQL’de verileri seçme, listeleme ve arama işlemleri

Giriş

PHP’de MySQL’i nasıl kullanacağımızı daha önce görmüştük. Bu dökümanda mysql’de verileri nasıl çekip, listeleyip bu verileri iyi biçimde süzgeçleme, üzerinde arama yapma ve oluşan çıktıları nasıl işleyeceğimizden bahsedeceğim. Bu dökümanda da diğer dökümanda kullandığım örnek tabloyu kullanacağım. Hatırlatmak gerekirse “tablo” adında ve kullanici, kayit_tarihi, eposta, ziyaret_sayisi alanlarından oluşuyordu.

Öncelikle mysql bağlantımızı oluşturup tablomuzu seçelim. Bildiğimizi varsayıp geçiyorum bu kısmı..
Veri seçmek için genel bir kalıp vardır. SELECT <alan adı belirteci> FROM `tablo adı` Bu sorguda ilk kısımda seçimden sonra dönecek olan alan adlarını belirtmemiz gerekir. Alan adlarını teker teker de belirtebilir, * ifadesi ile hepsini de ifade edebiliriz.

Daha önce testlerini de yaptığım bir sonuç vardır ki genellikle söylenen birşeydir, MySQL’de ihtiyacımız olan şeyleri kullanarak daha hızlı işletilen sorgular yazabiliriz. Mantıksal olarak da doğru birşeydir. Diyelim ki 25 alanlık ve bunlardan 10 tanesi TEXT türünde olan, üzerinde 100.000 kayıt bulunan bir tablonuz var veya yazdığınız sistem ilerde bu derece büyüyebilecek bir potansiyele sahip, böyle bir durumda sadece 1-2 alana ihtiyaç varken * ile tüm alanları seçmeye çalışmak arasında gözle görülür hız farkı yaşanacaktır. Tüm alanları seçerek bütün bilgilerin tekrar okunmasını istemiş oluruz, örnek verdiğim tablo gibi orta büyüklükte tablolardaki işlemlerde bile performans düşüşü kaçınılmazdır. Onun için sadece kullanacağımız alanları belirtmekte fayda var.
Birinci kısımdan sonra FROM ile veri çekilecek tabloyu belirtiyoruz. Bu kullanımda bütün satırlar seçilecek ve dönülecektir. WHERE kalıbını kullanarak istediğimiz, koşullarımıza uyan kayıtları seçebiliriz.

LIMIT X,Y kalıbı ile sonuçları parçalayabiliriz. LIMIT kalıbı sorgularda en sonda kullanılır. Bu kalıpta önce (X ile ifade edilen) hangi kayıttan başlanacağı, virgül ve sonra da (Y ile ifade edilen) kaç kayıdın sorgudan etkileneceğini belirtiriz. İşlem olarak her işlemde kullanılabilir ancak genellikle kayıt listelerken kullanırız. Sonuç olarak oluşan örnek bir listeleme sorgusu şöyle olabilir :

Bu sorguda tablo tablosundan, kullanici, kayit_tarihi ve ziyaret_sayisi alanlarını seçiyoruz. Koşul olarak da ziyaret_sayisi 0’dan büyük olan kayıtları belirtiyoruz. Sonuç kümemiz ise bu listede oluşacak ilk 5 kayıdı tutuyor.

Kayıtları seçtik ama sıralı değil?

Evet kayıtlar bilgisayarın kontrol sırasına göre çekildi, belirli kriterlere göre bu kayırları sıralayarak çekmek isteyebiliriz. Örnek vermek gerekirse, önceki sorguda ziyaret sayısı 0’dan büyük kullanıcıları çekiyorduk ama sonuç olarak dönen kümede en çok ziyaret eden kullanıcı olmayabilir, bu sorguyu geliştirip ziyaret sayısına göre sıralatalım. Sıralama işlemi için de bir kalıp kullanıyoruz, Kullanımı, ORDER BY <alan adı> <ASC/DESC>. alan adı olarak tek alan adı belirtiyoruz, ondan sonra gelen kısımda ise ASC artan sırada, DESC, azalan sırada sıralamayı belirliyoruz. Bir sorguda birden fazla sıralama koşulu bulunmaz, ayrıca bu sıralama kalıbı, koşullardan sonra, LIMIT kalıbından önce yazılır. Sonuç olarak yukarıdakine göre geliştirdiğimiz sorgumuz şu şekilde olacaktır :

Böylece en çok ziyaret eden 5 kişiyi görmüş olduk.

Bu dökümanda verileri sayfa sayfa listelere parçalamadan bahsetmiyorum çünkü bu işlem sadece mysql ile yapılmıyor, daha önce yazdığım bir dökümanda bu konuda ayrıntılı hesaplamaları ve mysql listeleme işlemleri için nasıl yapıldığına değinmiştim.
Verileri sayfa sayfa listeletmekle ilgili dökümana erişmek için tıklayın!

Verileri göstermek için işlemek

PHP’de mysql işlemlerini mysql fonksiyonları ile yapıyorduk, sorgularımızı mysql_query fonksiyonu ile işletiyorduk Ancak bu fonksiyonu bir değişkene atama şeklinde kullanıyoruz. Örneğin :

Şeklindeki kullanımda, sorgudan çıkan sonuç kümesini $sorgu değişkeninde saklıyoruz. Bu sonuç kaynağını başka mysql fonksiyonlarına sokarak bazı şeyler elde edeceğiz :
Sonuç kümesindeki kayıt sayısını mysql_num_rows() fonksiyonu ile öğrnebiliriz. mysql_fetch_assoc() ve mysql_fetch_array() fonkyisonları ile de sıradaki sonucu dizi şeklinde alabiliriz. Genel kullanım ile bir sorgunun çıktısını elde etmek için şu yöntem kullanılır :

Burada sorgu cümlemizi önce $sql değişkenine atıyoruz. Bazen öyle bir gelişmiş sql yazmamız gerekiyor ki bu cümleyi döngülerle, eklemeli olarak uzun işlem ve kontrollere göre hazırlayabiliyoruz. PHP ile MySQL birlikte kullanıldığında gerçekten çok güçlü olabiliyor. $sql değişkenindeki string’i mysql_query() fonksiyonu ile işletip $sonuc değişkenine atıyoruz sonuç kümesini. Ardından mysql_num_rows() fonksiyonu ile sonuç kümesinin boş olup olmadığını kontrol ediyoruz. Eğer tablo boş olsaydı sonuç kümemiz boş dönecekti, bu kontrol’e else ekleyip “Gösterilecek kayıt bulunamadı” gibi bir çıktı verdirmemiz de mümkün. Eğer sonuç kümesi boş değilse while ile satır satır bilgileri alıyoruz mysql_fetch_assoc fonksiyonu sayesinde. Burada atama işlemi yapıldığı için sonuç kümesindeki kayıtların hepsi bittiği zaman atama işlemi hep false değeri dönecektir. Bu yüzden while ile bu şekildeki kullanım oldukça sağlıklıdır. $satir değişkenine sorguda belirttiğimiz sıralamaya göre çıkan sonuç kümesinden sırayla kayıtlar çekilmektedir. Bu atama işleminde $satir değişkenine hangi alanları seçmişsek o alanları anahtar olarak tutan bir dizi atanır. Kullanırken de anahtar kelimelerle kolayca kullanabiliriz. Çıktıda istediğimiz şekilde bir html çıktısı oluşturabiliriz. Burada basit html çıktısı verdirdim, geliştirilerek tablo şeklinde de çıktı verdirilebilir. Çıktıların işlenişi genellikle bu şekildedir. Fazla denetimlerle ve html çıktısını iyi ayarlayarak daha opsiyonel sonuçlar elde edebilirsiniz.

Listeleme ve gösterme sistemlerinin basit mantığı

Aslında hiçbir farkı yoktur az önce yaptığımız işlemden, listelerken sadece kayıt numaraları, başlıkları ve gerekli alt bilgileri (okunma sayıları vs vs) çekiliyor. Listede link olarak bir sayfaya kayıt numaraları gönderiliyor. siz o başlığa tıkladığınızda ise o sayfaya gitmiş oluyorsunuz. Sayfa da da yapılan şey o kayıt no’ya ait kayıdı seçmek, bütün bilgileri çeker ve başlık, okunma sayısı gibi ayrıtıları verdikten sonra sistemle ilgili asıl işi yapan kodlar çalıştırılır. Yani döküman ise dökümanın içeriğini basar, forum ise forumda yazılanları işler.. Bu tarz sistemler basitlikten gelerek geliştirilir. Zaten herşey de öyle değil midir? 🙂

Basit olarak seçme/listeleme işlemlerinde benzerliği kullanmak ve birşeyler aramak

Bu işlemlerde WHERE kalıbının bir özelliği olan LIKE’ı kullanacağız. WHERE’da belirttiğimiz koşullarda basit operatörleri kulanarak büyük, küçük, eşit, eşit değil koşullarını tanımlayabiliyorduk.. LIKE ile bir değere benzerliği de aratabiliyoruz. LIKE basit olarak 2 joker karakterden oluşur _ (alt çizgi karakteri) ile tek bir karakteri % (yüzde karakteri) ile bir ve birden çok karakteri ifade edebilirsiniz.

Mesela kullanıcılardan a harfi ile başlayanları seçmek istiyorsak;

Farklı şekilde; sadece Ocak 2005’de kayıt olmuş kullanıcıları görmek için;

Siteyi 10-20 arasında ziyaret etmiş olan kullanıcılları görmek için de;

sorguları örnek olarak verilebilir…

MySQL’in kendi dökümantasyonunu veya mysqlferaks’daki gibi bir dökümantasyonu uygulama yaparak öğrenip sonra bu altyapıyı kullanmanızı öneririm. Çünkü güçlü bir sql ve güçlü bir php işlemesi ile çok hızlı ve çok sağlam veritabanları yönetebilirsiniz. Bu konuda her zaman hayret ettiğim bir site vardır. Spymac.com bu sitedeki online kullanıcı sayısı ve yaptıkları işlemleri düşünürsek oldukça sağlam bir altyapı gerekiyor, ki bu altyapının da php ve mysql ile kurulduğunu görünce mysql ve php’nin yapabilecekleri karşısında hayret etmeden duramıyorsunuz.

Bol sorgulu kodlar.. 🙂

PHP’de MySQL kullanımı ve temel işlemler

Giriş

MySQL, sql tabanlı bir dil olduğundan yönetimi tamamen kendine özgü cümlecikler ile olur. Bu cümlecikler o kadar esnektir ki aynen konuşma dilinde emirler vermek gibidir. Sadece bazı kurallara sahiptir. Bu dökümanda mysql’de bu yapılabilecek ana işlemler hakkındaki sql cümleleri oluşturmayı, php ile mysql’i nasıl kullanacağımızı, bağlantı sağlayacağımızı ve temel işlemler için gerekli sql cümle yapılarını göreceğiz.

MySQL sunucusu ile bağlantı sağlamak.

Her protokolde olduğu gibi mysql’de de öncelikle bir bağlantı sağlayıp bu iletişim protokolü üzerinden işlemler yapacağız. MySQL’i komut satırından kullananlar bilir ki, mysql client’da sifremizi girdikten sonra ilk iş olarak bir tablo seçer ve sonrasında da yazdığımız güçlü sql sorgulara bakarız. Temel olarak bağlanıp bir veritabanı seçmemiz gerekiyor sorgularımızı işletmek için. PHP’yi mysql destekli derlemişseniz mysql extension’ı yüklenmiş demektir. Eğer yüklü ise mysql fonksiyonlarını işletebiliriz. MySQL fonksiyonları hakkında daha ayrıntılı bilgiyi php dökümantasyonundan alabilirsiniz.

MySQL’e bağlanabilmek için 3 kritere sahip olmamız gerekir. Birincisi bağlanacağımız host’dur. Üzerinde çalıştığımız bilgisayar olduğundna dolayı genellikle localhosttur. İkinci parametre kullanıcı, son parametre de bu kullanıcının şifresidir. İster php’den ister başka bir client’dan bağlanmaya çalışın; ancak bu bilgiler doğrultusunda bir mysql bağlantısı edinebilirsiniz. PHP’de bağlantı işlemini mysql_connect() fonksiyonu yapıyor. Bu fonksyiona sırasıyla host, k.adi, şifre parametrelerini belirtmemiz gerekiyor. Örnek bir bağlantı sayfası :

Görüldüğü gibi önce bağnatı ayarlarımızı yaptık, ardından bu değişkenleri kullanarak $baglanti adlı değişkene bir mysql bağlantısı atadık. or die kalıbı her komutta kullanabileceğimiz bir kalıptır. or die’dan önceki fonksiyonda işletim hatası olursa die()’da belirttiğimiz ifade ekrana basılır ve script çalışması durdurulur. mysql_error() fonksiyonu ise bir önceki mysql işleminde oluşan hatayı verir.
Şimdi bu bağlantıyı kullanarak bir veritabanı seçeceğiz. Çünkü sorguları çalıştırabilmek için öncelikle bir bağlantı sağlamış ve bir veritabanı üzerinde bulunuyor olmamız gerek.
Veritabanı seçimini de mysql_select_db() fonksiyonu ile yapacağız.

Böylece “veritabanim” adlı veritabanını seçtik. Artık sorgularımızı bu veritabanı üzerinde işletebiliriz.
Sorguları işletmek için ise mysql_query() foksiyonunu kullanacağız. Bu fonksiyon tek parametre ile çalışıyor. Daha önce yapılmış bağlantıyı ve seçilmiş veritabanını kullanıyor. Bu tek parametre de işleteceğimiz sql sorgusunu içeren stringdir.
Şimdi temel mysql işlemlerinde kullandığımız sql sorgularını görelim..

Temel mysql işlemleri nelerdir?

MySQL’de temel (ve genel) olarak yaptığımız işlemler bir tabloya veri eklemek, bu verileri çekmek, güncellemek ve silmektir. Bu işlemler için ayrı ayrı sql yapıları kullanacağız. Bazı işler daha sistem kurulurken kullanılır. Mesela bir veritabanı yaratmak, ya da yeni tablo oluşturmak.. Bu işlemleri sistemlerde her zaman yapılan işler arasına alamayız.. Onun için bu işlemleri bilgisayarınızda sistemi geliştirirken yaparız. Bunları phpMyAdmin programı (http://www.phpmyadmin.net) ile yapmanızı öneririm. Basit bir arabirimi ve Türkçe desteği var. phpMyAdmin ile başlangıç işlerini hatta rutin işleri yapacak olan sorguları da yazarken/geliştirirken bile kullanabilirsiniz.
Aşağıda bazı anlatımlar göreceksiniz, bu anlatımları tablo adlı bir tablo üzerinde yapacağım. Basitçe tabloda; kullanici, kayit_tarihi, eposta ve ziyaret_sayisi alanları var olsun. Birlikte çalışmak için şu sql’i çalıştırıp siz de deneme tablosu oluşturabilirsiniz :

Şimdi rutin işleri yapan sorgularımızı geliştirip, nasıl işleneceğini görelim.

Veri eklemek

Veri eklemek için kullanacağımız sql cümlesi yapısı şöyledir :

Yapı olarak, önce INSERT INTO ‘tablo adı’ ile başlar burada hangi tabloya veri ekleme işlemi yapılacağı belirtilir. Bu kısımdan sonra parantez içerisinde hangi sıra ile veri alanları için verilerin belirtilmesi gerekiyorsa o sırada alanlar yazılması gerekiyor. Boş bırakılması durumunda geçerli sırada veri girilecektir. Bu kısımdan sonra VALUE kalıbı ve tekrar parantez içerisinde az önce belirtilmiş sırada gerekli veri türlerine göre verilerin belirtilmesi gerekir.
Bizim sorgumuzda veriler, meta’ları değerlere eşleyerek göstemek gerekirse;

şeklinde ekleniyor.

Sorguda görüldüğü gibi o andaki zamanı belirtmek için NOW() şeklindeki mysql fonksiyonunu kullandım. MySQL o kadar esnek bir sorgulama dilidir ki, üzerinde çok fazla kalıp, çok fazla tenkin ve çok fazla fonksiyon vardır. Bu fonksiyonlar hakkındaki bilgiyi mysql’in kendi dökümantasyonunda veya mysqlfreaks’da bulabilirsiniz.

Veri silmek

SQL sorguları genelde bazı kalıplardan oluşur. Belirli bir sorguyu filtrelemek için WHERE kalıbını kullanırız. Aynı if gibidir. Belirli bir sorgudan etkilenecek olan kayıtlardan bazılarını seçeriz. Mesela silmek için kullandığımız sorguda ilk başta tüm tablo etkilenir; ama biz belirli kayıtları/kayıdı silebilmek için o kayıt hakkında bazı referanslar verip tüm tabloyu o veri çıkana kadar filtrelemiş oluruz. AND kalıbı ekleyerek birden fazla koşulda filtreleme yapılabilir. Tablomuzda birden fazla aynı kullanıcı adına sahip veri olmayacağı için kullanıcı adlı alan bizim için iyi bir referans olabilir.
Silmek için DELETE FROM ‘tablo adı’ kalıbını kulalnırız. Bu kullanımda tüm tablo etkilenir ve tablo boşaltılmış olur. WHERE kalıbını sorgumuza ekleyerek bir veya daha fazla belirli kayıdı sileceğiz. Örnek olarak az önce eklediğimiz kayıdı silelim..

Bu sorgu ile tek satır (fatih kullanıcısına ait) silinmiş olacaktır.

Veri güncellemek

Veri güncellemek de silmek gibidir. Yani süzgeçlenerek kayıtlar ifade edilir. Süzgeçlenmediği takdirde tüm tablo etkilenecektir. SQL yapısı UPDATE ‘tablo adı’ SET şeklindedir. Az önceki verinin silinmemiş olduğunu varsayarak güncelleyelim.

Bu sorguda fatih kullanıcısının ziyaret_sayisi değerini 1 artırmış oluyoruz. MySQL’de alan adlarını böyle kullanabiliriz, bunun için önce değeri tablodan çekip sonra php ile artırıp buraya girmeye gerek yoktur. MySQL’de bu tarz operatörlerde mevcuttur. Ayrıca güncelleyeceğimiz alan tek olmayabilir, böyle durumlarda aralarına virgül koyarak belirtebiliriz.

Veri çekmek ve veri listelemek oldukça ayrıntılı ve uzun olduğu için bu yapıyı ayrı dökümanda ele alacağım!