Sayfalar

PHP ve Veritabanı Bağlantıları - 4


Bir baska soru ise birden fazla tabloda ayni anda arama yapmak? Iste indeks islemi ile gelen bir baska nimet de budur.Indeksleme yapilmadan iliskisel veritabani veya tablolarda arama gibi islemler,gelismis sorgular ile yapildiginda uzun zaman alacaktir ve temel olarak bunu yapmak kotu bir programcilik uygulamasidir.

Ornek vermek gerekirse, iki tablomuz oldugunu ve bu tabololarin herbirinde yanlizca 500 adet satir oldugunu varsayalim.Boyle bir durumda yapilacak arama islemi icin veritabani yonetim sostemi 250.000 olasiligida (kombinasyonu) da denemek zorundadir.

Indekslenmis bir tabloda ise veritabani yonetim motoru ilk tablonun indeksini kontrol ederek, yanlizca ilk tablodan aranilan kayitlari belirler.Ardindan ikinci tablodan bu kayitlara gore gene inkinci tablonun indeksini kullanarak istenilen kayitlarin cikarilmasini saglar.

Bir baska deyisle indekslenmis veritabani tabolarinda kayitlari boyle “elinizle tutup” cikarir gibi islem yapabilirsiniz.

Kendi ajandanizin fihristini dusunun.Ornegin “Serkan Ceylani” isimli kisinin telefonuna ulasmak icin cevireceginiz ilk sayfa “S” ile baslayan kayitlarin yer aldigi sayfa olacaktir.Eger hepsi karmasik olarak ,belirli bir siraya gore yazilmamis olsaydi benim ismimi nasil bulabilirdiniz? Tabii ki butun kayitlari deneyerek.

Primary Key (birincil anahtar) ozel bir indeks’tir.Bu ozel konuyu yazi dizimizin ilk makalesinde ele almis ve oldukca detayli olarak aciklamistik.Biraz daha ek bilgi vermek gerekirse, her iliskilendirilmis tablo bir adet (ve yanlizca bir tane) primary key olarak belirlenmis alana sahip olabilir.Bu alan tablodaki kayitlari tanimlayabilmek icin kullanilan bir anahtardir.Kisaca her kaydin ID’si yani kimligidir.Nasil sizin 10 tane kimliginiz yoksa/olamiyorsa MySQL veritabani tablolarinda da birden fazla alan Primary Key olarak tanimlanamaz.

Son bir soz soylemek gerekirse bu konu ile ilgili, indeksler ve primary key’ler tablodaki alanlarin kombinasyonlarindan da turetilebilir.(Bu tur turemeler yapilsa bile primary key alanindaki veriler halen biricik (unique) olmak zorundadir.)

Indeksler bu kadar fazla performans artisi sagliyorsa,oldukca fazla kullanilmalidir mantigi hatalidir.En yuksek performansi almak icin birden cok indeks tanimlamak dusuncesi yanlistir.

Bunun temel nedeni indekslerin tablolarda arama yapmak veya kayitlarin web sayfalarinda goruntulenmesi icin veritabanindan dondurulmesi islemlerinde faydali ve hizli olmasina ragmen,kayitlari eklemek veya guncellemek sirasinda karsimiza dezavantaj olarak cikacaklardir.Bir baska neden ise tablonun hacmini (dosya boyutunu) genisletmeleridir.

Indekslenmis bir tabloya veri eklerken veritabani o verinin uygun olacagi satiri secmek icin bir takim islemler yapacaktir.Hesabini siz yapin :)

Eger birden fazla indeks’e sahipseniz bu gibi durumlar icin gececek islem suresi de artacaktir.

Gereksinim duyulandan daha fazla indeks yaratilmamalidir.Gerek duyuldugunda ise yanlizca veritabani performansini arttirmak icin bir secenek olarak gorulmelidir.

Ozet : Halen indeks nedir diye bir soru soruyorsaniz biraz daha anlatmak istiyorum.Indeksler bir tablodaki fihristler gibidir.Bir tablo alanini indeks olarak sectiginiz zaman ornegin “adi” alanini secelim, bir kayidi bu tabloda bulmak istedigimizde veritabani motoru bu indeksi kullanarak “serkan” icin ismi “s” ile baslayan kisilerin bulundugu alandan itibaren kayitlari arayacaktir.

Tablonuzda isterse milyonlarca kayit olsun yanlizca “s” ile baslayanlar arasindan ornegin 500 kayidin aranmasi sonucunda ilgili kayit bulununabilir.Bu sekilde indeks alanlarini nasil belirleyebilcegimizi yazinin ilerleyen kisimlarinda goreceksiniz.

Sorgular

SQL yapi ve komutlari iliskisel veritabanlarinda “sorgu” gerceklestirmek icin kullanilir.Hazirladiginiz uygulama veritabanina bu komutlar ile sorular sorar.Bu sorularin cevabi veritabani motoru tarafindan programa dondurulur.

Dondurulen bu bilgi, istenilen sartlara uyan (SQL yapilariyla istedigimiz sartlari biz belirliyoruz…) ve secilen tablo alanlarina iliskin kayitlarin yer aldigi kayitlar dizisidir.

Burada neden alti cizili olarak “kayitlar dizisi” lafini kullandik?iste isin tum anafikiri burada.Lutfen cok iyi anlamaya calisiniz.

“PHP ve diger bir cok programlama dilleri bir veritabanindan donen sonuc dizisine, kendi icinde olusturulmus bir dizi gibi davranir.Bu baglamda ici veri yuklu olarak donen bu dizileri programimiz icerisinden herhangi bir zorlukla karsilasmadan herhangi bir “dizi degisken” gibi kullanabiliriz.”

Donen bu sonuc dizisine “sonuc seti” ismi verilir.Bu sonuc seti sizin sordugunuz soruya veritabaninin verdigi cevaptir.

Ornegin veritabaninda ilk ismi “serkan” isimli bir kayidin olup olmadigina iliskin bir soru soruldugunda bu kayida iliskin verilerden, “sectigimiz alanlarla” ilgili olanlar dondurulecektir.Eger herhangi bir kayit bulunmaz ise NULL sonucu donecektir.

Null kavramina birazdan bakacagiz.

Bazi SQL komutlari ise veritabanina birseyler sormak yerine, veritabanina bir gorevi yaptirmak icin kullanilirlar.Ornek vermek gerekirse:

    “Serkan ilk isimli kayida ait tum satiri, veritabanindan SIL”

Bu tip SQL komutlari veritabanindan herhangi bir sonuc seti dondurmezler.

NULL

Asagidaki senaryolari inceleyin :

# Okuldaki ogretmen yaptigi testin sonuclarini test devam ederken bilgisayarindaki veritabanina girmek istiyor.Halen sinav devam ediyor ama oldukca fazla test sonucu hazir.Veya bazi alanlari cocuklar once doldurdular ama hocamiz yavas yavas bilgisyara girmek istiyor.Bu durumda ornegin cocuklarin bazilari matematik testini bazilarida fizik testini bitirdiler…

Bu durumda daha girilmesi beklenen veriler oldugu aciktir.Bunu veritabaninina nasil anlatabiliriz?.Ongurulen degerler girmek gordugunuz gibi urada cocuklara haksizlik olacaktir.

# Oyle bir veritabani hazirliyorsunuz ki kuslar hakkinda, veritabanindaki bir alan kuslarin hizi ile ilgili.

Tam penguenin kaydini girerken farkediyorsunuz ki “penguen ucamaz !” dolayisi ile bir ucus hizi da yoktur.

Bu durumda tablonun bu alanina penguen icin ne girebiliriz?.

Iki durumda da ortada tabloya girebilecek bir veri yoktur.Fakat aralarinda cok onemli bir fark vardir.

“Birinci durumda veri bir sureligine yani gecici olarak tablodan eksiktir.” Cunku hocamiz sinavin tamami bitince kensidisine ulasan verilerin hepsini veritabanina girecektir.

“Ikinci durumda ise veri tablodan sonsuza kadar eksiktir.” Cunku penguenler ucamaz.

Iste bu tip durumlarda verinin tablonun o alanindan “eksik” oldugunu belirtmek icin NULL girisi kullanilir.

MySQL tablolarinda Null girisi tablodaki o alanda verinin eksik oldugunu gostermek icin kullanilir.Null belirli bir veri tipine ait degildir.Fakat NULL belirli olan herhangi bir veri tipine ait bir veri ile degistirilebilir.Null bir veri veya veri tipi degildir.Fakat boyle olmasina karsin alanda bir giris olarak konumlandirilabilir.

Deneyimsiz bilgisayar kullanicilari veya programcilari NULL ifadesini “sifir” zannetmektedir.Oysaki sifir bir degerdir.NULL bir deger degildir.

NULL bir veya iki bosluk string veri zannedilmektedir.Veya sifir uzunlukta string gibi dusunulmektedir.String en basta bir veri tipidir.NULL degildir.Sonra bosluk ta bir veridir.NULL degildir.

“NULL hicbirseydir.” yanlizca herseyle ( herhangi bir veri tipine ait herhangi bir veri kastediliyor.) degis tokus edilebilir.

NULL bir veri veya veritipi degildir.

Peki bu kadar anlatimdan sonra bir seyi dusunmeye baslayalim: Ya sorgu sonucundaki bir alanda null degeri varsa ne olacak.Bu durumda bu deger ile yapilacak aritmetik islemlerde onem kazaniyor zira donen sonuc ile ilgili islemler yapiliyor olabilir.

Altin Kural : Null iceren herhangi bir aritmetik islem gene Null sonucunu dondurur.

Bu mantiklidir cunku islemi yapmak icin gereken verinin kendisi zaten oratada yoktur.Yani “sonucumuz” da “hicbirsey” olacaktir.

NULL degerinin sifira bolumu gene NULL dondurur.

NULL kelimesinin Turkceye tersumesi ise “gecersiz” dir.

Sorgu Komutlari

MySQL veritabani icindeki verileri yonetmek icin asagidaki ana komutlar kullanilabilir:

# SELECT : Veritabanindan verileri almak icin kullanilir.

# DELETE : Veritabanindan verileri silmek icin kullanilir.

# INSERT : Veritabani icerisine verileri eklemek icin kullanilir.

# REPLACE : Veritabanindaki verileri degistirmek icin kullanilir.Eger ayni veri varsa tabloda, bu komutla yeni veriler eskilerin uzerine yazilir.

# UPDATE : Tablodaki verileri guncellemek icin kullanilir.

Geriye kalan ana komutlar ise veri’den cok veritabani yapilarini olusturmak veya duzenlemek icin kullanilir.

# CREATE : Veritabani,tablo veya indeks yaratmak icin kullanilir.

# ALTER : Tablo yapisini duzenlemek icin kullanilir.

# _DROP : Veritabani veya Tabloyu yok etmek icin kullanilir.

Tpik bir SQL Select sorgusu asagidaki gibidir.

    mysql > SELECT soyadi, adi FROM kullanicilar WHERE adi = ‘serkan’;

Ilk bahsedecegimiz konu sorgunun sonladirilmasi icin “;” noktali virgulun kullanilmasi zorunlulugudur.Ayni PHP de oldugu gibi burada da sonlandirma noktali virgul ile yapiliyor.

Sorgular birden fazla satirda icra edilebilir.Yukaridaki ornek sorguyu asagidaki gibi de yazabilirdik :

    mysql > SELECT soyadi, adi
    -> FROM kullanicilar
    -> WHERE adi=’serkan’;

Simdi burada gecen FROM ve WHERE yancumlelerine bakalim.FROM turkcedeki “den/dan” ekine karsilik gelir.WHERE ise “nerede” anlamindadir.

Bu durumda yan cumleler kullanarak olusturdugumuz sorgunun acik kelilmelerle olan hali soyl olacaktir:

“kullanicilar tablosunda adi alaninda serkan yazan butun verileri dondur.”

Ornek bir cikti su sekildedir

Ceylani Serkan
Altunergil Serkan
Oner Serkan

Simdi de MySQL ile biraz oyun oynayalim ve ince noktalarini ogrenelim :)

MySQL istemci programi ile calismak

Simdi sizlere “mysql” isimli bu veritabani istemci programi ile calismanin inceliklerini gosterecem.Bu program ile veritabani uzerindeki sorgulari kolaylikla gerceklestirebiliriz.Ilk once birkac kucuk oyun ve ardindan “kullanici izinlerine” giris yapacagiz.

mysql istemcisi nasil calistirrilir?

Linux kullanicilari komut satirindan asagidaki komutu giriniz.Windows kullanicilari MySQL kurulumunda bu programin oldugu dizine gecip asagidaki komutu giriniz : ( > isareti komut satirini temsil etmektedir.Bu isaretin komut ile bir ilgisi yoktur.)

    > mysql -uUSER –pPASSWORD -hHOST

Buyuk harfle yazilan USER,PASSWORD ve HOST argumentlerini kendi kisisel degerleriniz ile degistiriniz.Ornegin sizin veritabani kullanici adiniz “phpuser” ve sifreniz de “phppass” ise komut su sekilde olmalidir :

    > mysql -uphpuser –pphppass –hlocalhost

Bu komuttaki butun argumentler istege baglidir.Hic bir sey girilmediginde ongorulen degerler olarak :

  # -u sizin kabuk kullanici adiniz veya login adiniz.
  # -p sifre yok
  # -h localhost

“mysql” isimli istemci programi artik veritabanina verilen ID/Sifre degeri ile baglanmistir.

Asagidaki gibi bir ekrani goruyor olmaniz gerekmektedir :

    Welcome to the MySQL monitor. Commands end with ; or \g.
    Your MySQL connection id is 10 to server version : 3.22.32

    Type ‘help’ for help.

    mysql>

Eger “mysql” baglanti saglanmiyor diye bir mesj veriyorsa verdiginiz kullanici adi ve sifresinin dogrulugunu kontrol ediniz.

Kullanmak icin veritabani secmek

Server’da hazir bulunan veritabanlarini listesini gormek icin SHOW DATABASES komutunu giriniz.

    mysql> SHOW DATABASES;
    Database
    mysql
    test
    2 rows in set (0.00 sec)

Yukarida bu komutun kullanilmasini ve ciktisini izlemektesiniz.

mysql istemci programi bize iki tane veritabani oldugunu,bunlarin isimlerinin mysql ve test oldugunu, (2) adet sonuc satirinin donduruldugunu ve bu sorgu icin gecen zamanin (0.00 saniye) surdugunu bildirdi.

Bir veritabanini secmek icin USE veritabani_adi yapisini kullanalim :

    mysql> USE mysql;
    Database changed

Windows makinelerde buyuk/kucuk harf ayrimi yapilmamaktadir.Bu nedenle USE MYSQL gibi bir komut ta ayni sekilde mysql isimli veritabaninin kullanilmasini saglar.

Linux ta durum oyle degildir ve mysql,MYSQL veya MySQL hepsi farkli veritabanalarina isaret eder.Gene eyni sekilde tablo alanlarinin isimleri Linux’ta buyuk/kucuk harfe duyarli iken Windows makinlerde durum boyle degildir.