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;
Saglicakla Kalin,
Serkan Hadi Ceylani
serkan@turk-php.com
|