Sayfalar

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


Veritabani icindeki verilere erismek :

Simdi MySQL sunucusu artik mysql isimli veritabani ile calismaya hazirdir.Kullanilabilir tablolari gormek icin SHOW TABLES komutu verilebilir.

    mysql > SHOW TABLES;

Ekran Gorunutusu : http://www.turk-php.com/ornekler/mysql_2.gif

Simdi de “user” isimli tablonun yapisina bakalim.Bunun icin DESCRIBE komutunun kisaltilmis hali olan DESC komutu kullanilanilabilir.

    mysql > DESC USER;

Ekran Gorunutusu : http://www.turk-php.com/ornekler/mysql_3.gif

Bu komut ile tablonun yapisini gormus olduk.Ornek olarak “Host” alani 60 karektere kadar olan veriyi saklayabilir.Ayni zamanda bu alan “PRI” yani Primary Key(Birincil Anahtar) olarak tanimlanmistir.

Not: “User” isimli alan da Primary Key olarak tanimlidir.Bu demek degildir ki “Host” ve “User” alanlarinin her ikisi de ayri ayri bu tablo icin “Primary Key”.Unutmayin ilk yazilarimizda da degindigimiz gibi bir tablo icin yanlizca bir adet Primary Key alani tanimlanabilir.Buradaki durumda ise bu iki alanin birlesimi (kombinasyonu) Primary Key olarak tanimlanmistir.Yani Host-User ikilisi PRIMARY KEY olarak kullanilmaktadir.Ornegin localhost makinesindeki serkan isimli kullaniciya sunucuya erisme hakki verilmistir.Bu kayidi tabloda tanimlamak icin localhost-serkan primary key (birincil anahtari) kullanilmaktadir.

Bu tabloya herhangi bir sekilde “localhost” makinesi icin “serkan” isimli kullanici eklenemez. Ama ornegin host alanina “turk-php.com” girildiginde “serkan” isimli kullanici tanimlanabilir.

Bu “User” tablosunda Host,User,Password alanlari haric butun alanlar ENUM olarak tanimlanmistir.ENUM tanimlanan alanlar yanlizca onceden belirlenmis deger listesindeki bir degeri alabilir.Burada belirlenen iki deger ( N ve Y ) bu alana girilecek veri icin kesin degerlerdir.Bu iki degerden baska bir veri kesinlikle tablodaki ENUM olarak belirlenmis bu alana girilemez…

Burada “N” ongorulen deger olarak belirlenmistir.Hic bir deger verilmedigi zaman otomatik olarak ongorulen bu deger tabloya yeni bir kayit eklendiginde bu alan icin MySQL sistemi tarafindan atanacaktir.

Lokal makine uzerinde kime erisim hakki verildigini gormek icin asagidaki gibi bir SELECT sorgusu calistirilabilir.

    mysql > SELECT User FROM user WHERE Host=’localhost’;

Ekran Gorunutusu : http://www.turk-php.com/ornekler/mysql_4.gif

Burada dondurulecek kayitlari belrilemek icin WHERE komutu kulanilmistir.Bu komut PHP icerisinde cok kullanilan if yapisi ile cok benzerdir.

Not : MySQL de esitlikleri sinamak icin tek esittir (=) isareti kullanilir.PHP de oldugu gibi esitligi sinamak icin cift esitir isareti (==) kullanilmaz.

Sunucu’nun o anda hazir bulunan butun alanlari dondurmesi icin * karekteri kullanilir.Bu durumda yukaridaki gibi belirli bir alan degilde butun alanlar icin verilerin hepsi secilecektir.

    mysql > SELECT * FROM tabloadi

Bu komut ile isteyen programa “tabloadi” ile verilen tablo icin butun kayitlar dondurulur.

Veritabani icindeki Verilerin Yonetilmesi

Simdi de yeni bir veritabani kullanicisi yaratalim.Bu islemi basitce “INSERT” komutu ile yerine getirebiliriz.Asagidaki sekilde “mysql” veritabani’nin “user” isimli tablosuna “phpuser” isimli kullaniciyi “phppass” sifresi ile nasil ekledigimi gormektesiniz :

Not : INSERT’in Ingilizce karsiligi “Ekle” VALUES ise “degerler” dir. INTO Ingilizcede “icine” anlamina gelmektedir.

    mysql > INSERT INTO user VALUES (
    -> ‘localhost’,
    -> ‘phpuser’,
    -> Password(‘phppass’),
    -> ‘N’, ‘N’, ‘N’, ‘N’, ‘N’, ‘N’, ‘N’,
    -> ‘N’, ‘N’, ‘N’, ‘N’, ‘N’, ‘N’, ‘N’);
    Query OK, 1 row affected (0.00 sec)

Ekran Gorunutusu : http://www.turk-php.com/ornekler/mysql_5.gif

Bu INSERT sorgusu “phpuser” kullanici adi ve “phppass” sifresine sahip “user” tablosu kayidini yaratmaktadir.Burada yaratilan kullaniciya ongorulen olarak herhangi bir erisim hakki verilmemistir.

Tabolaya girlen yeni kayit icin “veriler” tek tirnak isaretinin arasina yazilmistir.Bu konuyu yazinin ilerleyen kisimlarinda daha ayrintili olarak aciklayacagiz.Simdilik bize verilen sonuclari inceleyelim.

MySQL istemcisi (client) yukaridaki ornekte bize, verilen sorgunun basarili bir sekilde yerine getirildigini ve sonucta bir adet satirin istenildigi gibi yaratildigini rapor etmistir.

MySQL sunucusu verilen kullanici sifrelerini “sifreleyerek” saklamaktadir.Bunun icin kendi ozel sifreleme algoritmasini kullanmaktadir.MySQL icindeki bu hazir password () fonksiyonunu kendi veritabani ve tablolariniz icinde kullanabilirsiniz.

Biraz once yarattigimiz bu kullanici ( ki bu kullaniciya hic bir erisim hakki vermemistik) simdi iki tane erisim hakkini( sunucu yonetim hakki) taniyalim.Ornegin Reload_priv ve Shutdown_priv.Bu haklari vermek icin “user” tablosunda bu kullanici icin belirlenen haklari “guncellememiz” gereklidir.

Bu gorevi yerine getirmek icin UPDATE sorgusu kullanilabilir :

    mysql > UPDATE user SET Reload_priv=’Y’, Shutdown_priv=’Y’
    ->WHERE User=’phpuser’;
    Query OK, 1 row affected 0.00 sec)
    Rows matched:1 Changed: 1 Warnings :0

Ekran Gorunutusu : http://www.turk-php.com/ornekler/mysql_6.gif

Mysql istemci programi bize, sorgudaki sartlarla eslesen 1 tane satir bulundugunu ve bu satirin gene sorgudaki sartlara gore basarili bir sekilde guncellendigini rapir etmistir.

Su anda artik “phpuser” isimli kullanici sunucu “tekrar yukleme (yeniden baslatma)” ve sunucuyu kapatma yetkileri ile donatilmistir.

WHERE durum belirleyici secenege bagli olarak kullanilmaktadir.Eger buradaki ornekte oldugu gibi kullanilirsa, verilen sartlara uyan satirlar guncellenir.

WHERE kullanilmadigi zaman sorgu, butun kayitlara uygulanir.

UYARI : Kazara butun kayitlari bu sekilde guncellemek belkide istediginiz sey olmayabilir.Bazen kabuslar gercek hayatta da yasanmaktadir ve eger dikkat etmez iseniz boyle bir sorgu ile istemeyeceginiz sekilde veritabanindaki bazi verileri kaybedebilirsiniz.Dikkatsizce uygulanacak bir UPDATE sorgusu sitenin butun kullanicilarinin sifresini ‘phppass’ olacak sekilde degistirebilir ornegin…

Yanlislikla WHERE kullanilmadan uygulanacak bir sorguda ornegin DELETE ile tablonun butun kayitlari bir anda silinebilir :

    mysql > DELETE FROM test;
    Query OK, 0 rows affected (0.00 sec)

Burada test tablosundaki butun veriler silinmistir.Sakin verilen raporda 0 rows affected satirina aldanmayiniz.Boyle bir sorguda sunucu kac tane satirin etkilendigini (silindigini) elbette bilemez.Zaten olabilecek butun veri gitmistir.

Boyle bir durumla karsilasmamak icin her zaman icin WHERE durum komutu kullanilmalidir :

    DELETE FROM tabloadi WHERE durum(lar);

Simdi fikrimizi degistirip yarattigmiz bu “phpuser” kullanicisina butun erisim izinlerini verelim.Bunu nasil yapabiliriz? Bir diger UPDATE sorgusu veya REPLACE ile butun veri setini degistirerek.Yazilim oldukca basit :

    mysql > REPLACE INTO user VALUES(
    -> ‘localhost’, ‘phpuser’, Password(‘phppass’),
    -> ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’,
    -> ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’);
    Query OK, 1 Row affected (0.00 sec)

Ekran Gorunutusu : http://www.turk-php.com/ornekler/mysql_7.gif

Gordugunuz gibi REPLACE komutu ile bir onceki kayidin uzerine yazilmaktadir.Buradaki onemli nokta yeni kayidin anahtar degerinin , eskisinde belirtilen anahtar degeri ile ayni olmasi zorunlulugudur.Veya burada kullanilan birlesik anahatar gibi ise (Host-User veri anahtari yani Primary Key ) gene yeni kayitta bu (Host-User) ile verilen anahtar ayni olmalidir.

UPDATE ile REPLACE arasindaki ana fark, birinin verilen yeni alan verileri ile kayidi gincellemesi digerinin ise veri setini komple (butun veriler ile) yeniden yaratmasidir.

Son olarak yeni yaratilan bu kullaniciya tanidigimiz yeni yetkilerin aktif hale gecirilmesi icin flush-privileges komutu kullanilmalidir.

    > mysqladmin –uKullaniciAdi –pSifre –hHost flush-privileges

Buna alternetif olarak mysql istemci programinin komut satirindan asagidaki komut verilebilir.

    mysql > FLUSH PRIVILEGES;

Ekran Goruntusu : http://www.turk-php.com/ornekler/mysql_8.gif

GRANT ve REVOKE Komutlarinin Kullanilmasi

Yukarida anlatilan bazi gorevler icin kisaca GRANT komutu ile islemler gercekten cok kolaylastirilabilir.Ayni sonuclar tek bir satirda ve sanki yazi yazarmis gibi gerceklestirilebilir.

GRANT

En basit kullanim sekli asagidaki gibidir :

    mysql > GRANT ALL PRIVILEGES ON *.* TO
    -> phpuser@localhost IDENTIFIED BY ‘phppass’;

Ekran Gorunutusu : http://www.turk-php.com/ornekler/mysql_9.gif

Yukaridaki komut ile sistem uzerindeki butun veritabanlarina, butun erisim haklari, ‘phpuser’ isimli ‘localhost’ makinesinde yer alan kullaniciya verilmis oluyor.MySQL sunucusuna ‘phppass’ sifresini kullanarak baglandiginda butun erisim haklari otomatik olarak kendisine taninacaktir.

Burada dikkat edilmesi gereken sey gordugunuz gibi, “user” ve “host argumentlerinde tek tirnak isaretlerini kullanmadigimizdir.

Eger ‘phpuser’ kullanicisinin yanlizca ‘test’ isimli veritabaninda butun erisim haklari olmasini isteseydik :

    mysql > GRANT ALL PRIVILEGES ON test.*
    -> TO phpuser@localhost IDENTIFIED BY ‘phppass’;

Ekran Gorunutusu : http://www.turk-php.com/ornekler/mysql_10.gif

Burada test.* yapisi ile test veritabanindaki butun tablolar kastedilmektedir.Ayni mantik ile yanlizca “test” isimli veritabanindaki “sample” isimli bir tabloya erisim hakki saglamak icin :

    mysql > GRANT ALL PRIVILEGES ON test.sample
    -> TO phpuser@localhost IDENTIFIED BY ‘phppass’;


Ekran Gorunutusu : http://www.turk-php.com/ornekler/mysql_11.gif

Burada kullanilan “ALL PRIVILEGES” durum komutu ile butun haklar kullaniciya taninmaktadir.Yanlizca sizin belirlediginiz sorgu tiplerini izin olarak kullaniciya vermek icin :

    mysql > GRANT SELECT,INSERT,UPDATE ON test.*
    -> TO phpuser@localhost IDENTIFIED BY ‘phppass’;

Ekran Gorunutusu : http://www.turk-php.com/ornekler/mysql_12.gif

Yukaridaki komut ile “phpuser” kullanicisina“test” veritabanindaki “butun tablolar uzerinde “ yanlizca “SELECT,INSERT,UPDATE” sorgularini yapmasina izin verilmistir.

Ornegin bu kullanici hic bir sekilde “DELETE” sorgularini yapmaya yetkili degildir.

* gibi genel bir araligi tanimlamaya yarayan karekterler gercekten cok kullanislidir.Ornegin yukaridaki komutta ‘localhost’ yerine ‘%’ ozel karekteri kullanilsaydi, ‘phpuser’ isimli kullanicinin butun sunucu makinelerden bu veritabanina erisim hakki verilmesini saglayabilirdik.Su anda kullanici yanlizca ‘localhost’ uzerinden veritabanina baglanabilir…

Hatta daha da ayrintili olarak tablo alanlarina erisim bile ozel olarak tanimlanabilir :

    mysql > GRANT SELECT (User, Host) ON mysql.user
    -> TO phpuser@localhost IDENTIFIED BY ‘phppass’;

Ekran Gorunutusu : http://www.turk-php.com/ornekler/mysql_13.gif

Ornegin yukaridaki komut ile ‘localhost’ makinesindeki ‘phpuser’ kullanicisina yanlizca ‘User’ ve ‘Host’ tablo alanlarinda SELECT sorgusu yapma izni verilmistir.

WITH GRANT OPTION komutu ile kullanicinin baska kullanicilara da kullanici izni tanimlayabilme yetkisi verilmesi saglanabilir.Kullanici kendine ait butun yetkileri bir baska kullaniciya da taniyabilir.

Bu komut kullanilirken dikkatli olunmalidir.Zira degisik sevityedeki izinlere sahip kullanicilar kolayca takim haline gelip birbirlerine taninan yetkileri paylasabilir.

    mysql > GRANT ALL PRIVILEGES ON test.*
    -> TO phpuser@localhost IDENTIFIED BY ‘phppass’ WITH GRANT OPTION;

Ekran Gorunutusu : http://www.turk-php.com/ornekler/mysql_14.gif

Yukaridaki komut ile test isimli veritabani icin bir baska super kullanici yaratmis olduk…

REVOKE

Revoke komutu kullaniciya verilen izinlerin iptali icin kullanilmaktadir.ornegin ‘phpuser’ isimli kullaniciya verilen butun yetkilerin iptali icin kisaca asagidaki komut kullanilabilir:

    mysql > REVOKE ALL PRIVILEGES ON *.* FROM phpuser;

Birden fazla kullanci adi tanimlamak icin virgul karekteri araya konmalidir :

    mysql > REVOKE ALL PRIVILEGES ON *.* FROM phpuser,phpuser1,phpuser2;

Burada adi gecen butun kullanicilar tanimli, ve kendilerinden alinmak istenen yetkinin zaten kendilerine ait olmasi, komutun basarili sekilde isletilmesi icin gerekli sartlardir.

Orneklere devam edersek,asagidaki komut ile ‘phpuser’ isimli kullanicidan SELECT sorgu yetkisi alinmaktadir :

    mysql > REVOKE SELECT ON *.* FROM phpuser;

Gene ilk konumuzda GRANT komutunda anlatildigi gibi tablo alanlari icinde verilen yetkiler asagidaki gibi kaldirilabilir :

    mysql > REVOKE SELECT (User, Host) ON mysql.user FROM phpuser;