MySql
SQL, (Structured Query Language, Yapısal Sorgu Dili) veritabanı endüstrisinin
standart dilidir. Fakat HTML konusunda farklı firmaların sadece kendi Browserlarının
tanıdığı türden etiketler geliştirmeleri gibi, SQL alanında da farklı firmaların ekleri ve dilde
yaptıkları değişiklikler vardır.
MySQL, teknik tabiriyle sunucuda daemon olarak çalışır ve arzu eden programa,
bildireceği (ve erişim hakkı bulunan) veritabanı dosyasından veri çekerek, sunar. Bir
veritabanında farklı sayıda tablolar olabilir. Bir veritabanı dosyasında yer alan tablolarda,
sütunlar ve satırlar vardır: bunların kesiştikleri yerlere biz verilerimizi yazarız. Bir SQL
veritabanı dosyasında her bir kutunun ne tür veri kabul edeceği önceden belirlenir;
dolayısıyla türü sayı olan verinin yazılacağı kutuya, alfanümerik değer yazılmaz. MySQL,
sayısal verilerin türünü INT, belirli bir sınıra kadar değişen sayıda karakterden oluşacak
verilerin türünü VARCHAR komutuyla belirler.
mySQL veri türleri
MySQL'de bir çok veri türü oluşturulabilir. Ancak Web programları açısından önemli
olan bir kaçı ve özellikleri şöyle saralanabilir:
INT Tamsayı: -2147483648'den 2147483647 kadar değişen diziye
"signed" (işaretli), 0'dan 4294967295'e kadar değişenine
"unsigned" (işaretsiz) denir.
VARCHAR(n) n sayısını geçmemek şartıyla değişen boyutta karakter olabilir.
CHAR(n) Kesinlikle n sayısı kadar karakter olabilir.
TEXT En fazla 65535(2^16-1) karakter alabilen metin alanı.
MEDIUMTEXT En fazla 16777215(2^24-1) karakter alabilen metin alanı.
DATE 1000-01-01'den 9999-12-31'e kadar değişebilen tarih alanı.
TIMESTAMP 1 Ocak 1970'den 18 Ocak 2038'e kadar olan ve
Yıl+Ay+Gün+Saat+Dakika+Saniye biçimindeki zaman bilgisi.
MySQL'de bir tablo oluşturmak için gerekli CREATE TABLE komutu şöyle kullanılır:
CREATE TABLE uyeler (adi VARCHAR(30), soyadi VARCHAR(30), üye_no INT ) ;
Bu komutla, "uyeler" isimli üç sütunlu bir tablo oluşturulur: birinci ve ikinci
sütunlarda en fazla 30, karakterlik değişen boyutta alfanümerik değerler yer alırken,
üçüncü sütunda sadece tam sayı olan değerler bulunabilir. Bu komutla oluşturulan tabloya
INSERT INTO komutuyla veri girebilirsiniz:
INSERT INTO uyeler (adi, soyadi, uye_no) VALUES ('Muharrem','Taç','1234')
Bir tablonun oluşturulması ile içine veri yerleştirilmesi komutları ayrı ayrı
zamanlarda, ayrı işlemler olarak yapılabileceği gibi, toplu bir metin halinde, otomatik
olarak da yapılabilir.
MySQL veritabanından bilgi edinmek için SELECT komutunu kullanırız:
SELECT * FROM uyeler ;
Bu, MySQL'e, uyeler adlı tablodaki bütün değerlerin okunmasını bildirir. Buradaki
"*" işareti, "bütün sütunlardaki bütün değerler" anlamına gelir. Diyelim ki yukardıda
oluşturduğumuz tablonun sadece "adi" ve "soyardi" sütunlarındaki bilgileri almak
isteseydik, bu komutu şöyle yazacaktık:
SELECT adi soyadi FROM uyeler ;
Bir veritabanındaki bilgilerin yenileriyle değiştirilmesini, yani veritabanı dosyasının
güncelleştirilmesini UPDATE komutu sağlar. Bu komutu kullanarak veritabanımızdaki bazı
kutucukların içindeki bilgileri değiştirebiliriz. Veritabanı dosyalarını güncelleştirme
zorunluğu bulunması ise bize veritabanı tasarımının çok önemli olduğunu gösterir.
Örneğin:
UPDATE uyeler SET adi = "Şahika" ;
Bu komut, veritabanındaki bütün satırlarda, birinci sütundaki değerleri "Şahika"
olarak değiştirmekle sonuçlanırdı. Amacımız bu ise, sorun değil; ancak çoğu kez MySQL'e
hangi satırda (veritabanı tekniğindeki terimle söylersek, hangi kayıtlarda) değişiklik
yapılacağını daha ayrıntılı sölememiz gerekir. Veritabanı dosyamızı oluştururken, her
kaydın diğer kayıtlarda olmayan (unique) bir sütun (bunu da veritabanı tekniğindeki
terimle söylersek. alan) bulunmalıdır, ki MySQL'e yapılacak değişikliğin tam yerini
söyleyelim. Örneğin
UPDATE uyeler SET adi = "Şahika" WHERE uye_no = 1234;
MySQL bu komutu alınca sadece üye numarası 1234 olan kişinin (yani uye_no
alanındaki değer 1234 olan kaydın) "adi" alanındaki değeri silecek ve yerine verdiğimiz
yeni değeri yazacaktır. Böyle birincil alanı bulunan, iyi düşünülmüş bir veritabanından
seçim yapmak da kolay olur. Örneğin:
SELECT adi soyadi FROM uyeler WHERE uye_no >= 123;
deyimi ile tablomuzda bulunan kayıtlardan sadece üye numarası 123'den büyük olanları
seçebiliriz.
Bir MySQL veritabanındaki kaydı silmek için DELETE komutunu kullanırız:
DELETE FROM uyeler WHERE uye_no = 1234;
Vveritabanında sadece bir kayıtta üye numarası 1234 olacağı için bu komutla
sadece bir satır silinecektir. Bu komutu, diyelim ki üyelik kaydını yenilememiş kişilerin
tümünü silmek için de kullanabiliriz. Veritabanımızda üyelik kaydının yenilendme tarihini
gösteren bir alan bulunduğunu varsayalım:
DELETE FROM uyeler WHERE yenileme_tarihi < 2000-01-31;
Bu komutla, üyeliğini yenileme tarihi 31 Ocak 2000'den eski olan bütün
üyelerimizin kaydını veritabanından silmiş oluruz.
Bu komutların MySQL'in DOS komut işlemcisi ile komutsatırından yapılacağını
belirtmemiz gerekir. Bunu yapabilmek için MySQL Server'ın Windows'da çalıştırılması
gerekir. MySQL'in paylaşım sürümünü kullanmak için Windows sistemlerinde mysqldshareware.exe
programını çalıştırmanız gerekir. Bunun için DOS komut istemcisi
penceresinde "C:/mysql/bin" dizinine giderek, şu komutu vermemiz yeter:
mysqld-shareware
MySQL sürücülerinizin kişisel Web sunucusunda başarıyla çalıştığına, kitapçığın baş
tarafında belirttiğimiz küçük alıştırmayı yaparak emin olduktan sonra gerçek bir veritabanı
dosyası yazabiliriz.
Yukarıda gördüğümüz komutları komut istemci satırından tek tek verebileceğimiz
gibi, bir düzyazı dosyasında toplayıp, MySQL programına da otomatik olarak yaptırabiliriz.
Bu dosyaya, içindeki verileri alıp veritabanına boca edeceğimiz için, Dump dosyası denir.
Aşağıdaki metni MySQL programının kurulu olduğu dizindeki /bin/ alt-dizinine
(muhtemelen c:\mysql\bin) veri.dump adıyla kaydedin (Notpad kullanıyorsanız, dosya
adına .txt eklendiğine dikkat edin!)
Kod:
CREATE TABLE calisanlar ( id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (id), adi
VARCHAR(20), soyadi VARCHAR(20), adres VARCHAR(60), pozisyon VARCHAR(60));
INSERT INTO calisanlar VALUES (1 , 'Sahika' ,'Tabak' ,'PCLife Dergisi,
Istanbul' , 'Yazar');
INSERT INTO calisanlar VALUES (2 , 'Muharrem' , 'Tac' , 'Işık Kultur Merkezi,
Bursa' , 'Yonetmen');
Bu metnin sadece üç satır olmasına, örneğin Notpad'de Düzen menüsünde Sözcük
Kaydır maddesinin işaretsiz olmasına dikkat edin. Daha sonra yine DOS komut istemcisi
penceresinde MySQL programının dizininde /bin alt-dizinine gidin ve şu komutu yazın:
mysqladmin -u root create veri
MySQL veri adlı veritabanının oluuştuğunu bildirecektir. Şimdi içi boş bir veri
dosyamız oldu. Yazdığımız dump dosyasındaki bilgileri veritabanı dosyasına işletmek işini
MySQL yapacakatır. Bunu, şu komutla yapabiliriz:
mysql –u root veri < veri.dump
İşlerin yolunda gidip gitmediğini c:\mysql\data dizininde veri adlı bir klasör
oluşturulduğunu kontrol ederek anlayabiliriz. Bu klasörün içinde calisanlar.frm,
calisanlar.isd ve calisanlar.ism adında dosyalar bulunması gerekir.
PHP-MySQL İlişkisi
Böylece, MySQL ile bir veritabanı dosyası oluşturma işlemi bitmiş oldu. bir PHP
programı yazarak bu veritabanındaki kayıtları okutabiliriz. Bunu yapmadan önce yine hızlı
şekilde PHP-MySQL ilişkisinini sağlayan fonksiyonlara gözatalım.
PHP programlarımızda veritabanından yararlanabilmek için programın önce Web
sunucusu aracılığıyla veritabanı dosyası ile bağlantı kurması gerekir. Başka bir deyişle, PHP
programının veri ile arasında bir yol açması gerekir. MySQL açısından ise bu bağlantı, veri
sunucusunda yeni bir oturum açılması anlamına gelir. İki program arasındaki bu ilişkiyi
PHP'nin mysql_connect() fonksiyonu yapar. Bu fonksiyonun alabileceği üç parametre
vardır:
$veri_yolu = mysql_connect ("localhost" , "root" , "parola" );
Burada "localhost" yerine MySQL programının parçası olarak çalıştığı sunucunun adı
yazılır. "root" bu MySQL sunucusunda açılacak oturumun kimin adına açılacağını belirter.
"root" kelimesi, sunucunun yönetici olarak oturum açılacağı anlamına gelir: "parola"
kelimesinin yerine de MySQL'i kurarken belirlediğimiz bir kullanıcı parolası varsa, onu
yazarız. Bu komutta yer alan $veri_yolu değişkeni, açılacak veri yolunun, PHP ile MySQL
veritabanı sunucusu arasındaki bağın tanıtıcı işareti olacaktır. Bu bağlantı kurulduktan
sonra, açtığımız veri yolundan gelecek bilgiler ve veritabanına gidecek bilgiler bu değişken
aracılığıyla gerçekleşecektir. Veri sunucusu ile veri yolu bağlantısı kurulursa, bu değişken
değer tutar hale gelir; bağlantı kurulamazsa bu değişken boş kalır. mysql_connect()
fonksiyonunun başarılı olup olmadığını bu değişkenin durumunu sınayarak anlayabiliriz.
Örneğin:
Kod:
$veri_yolu =mysql_connect("kara-murat", "root");
if ( ! $veri_yolu) die ("MySQL ile veri bağlantısı kurulamıyor!);
Burada veri sunucusunun bulunduğu Web sunucusunun adının "kara-murat"
olduğuna, ve ooturumun "root" yetkileriyle açıldığına dikkat edin. İkinci satırdaki if deyimi,
$veri_yolu değişkeninin değer içerip içermediğine bakıyor ve değişkende bir değer yoksa,
bağlantı kurma girişini durdurarak, ziyaretçiye hata mesajı gönderiyor.
Bağlantı başarıyla kurulduktan sonra PHP programı, bu yoldan, veritabanı
sunucusuna, hangi veritabanı dosyasından yararlanmak istediğini bildirmelidir. Buna
veritabanı dosyası seçme işlemi denir ve mysql_select_db() fonksiyonu ile yapılır:
Kod:
mysql_select_db( "veritabanın_adı" , $veri_yolu ) or die ("Veritabanı
açılamıyor!".mysql_error() );
Bu fonksiyonun başarıyla icra edilip edilmediği fonksiyondan dönen değerin
true/doğru veya false/yanlış olmasından anlarız. Bu değer false ise bu deyimin die()
bölümü icra edilecek ve Browser penceresine veritabanının açılamadığı mesajıyla birlikte
MySQL'in hata mesajı da gönderilecektir. PHP'nin MySQL veritabanını seçememesi çoğu
zaman kullanıcı yetkilerinin Internet ziyaretçilerini kapsayacak şekimde düzenlenmemiş
olmasından kaynaklanır. Bu durum gerçek Web sunucusunda ortaya çıkarsa, Web
sunucusu yönetimine başvurmak gerekir.
Şimdi bu anlattıklarımızı biraraya getiren kolay bir PHP programıyla biraz önce
oluşturduğumuz "veri" adlı veritabanından bir birinci kişiye ait verileri "okutarak, HTML
sayfamızda kullanalım. Aşağıdaki programı, veri_01.php adıyla kaydedelim:
Kod:
<HTML>
<TITLE>PHP ile Veri Örnegi</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<?php
$veri_yolu = mysql_connect("kara-murat", "root");
if ( ! $veri_yolu ) die ("MySQL ile veri bağlantısı kurulamıyor!");
mysql_select_db("veri" , $veri_yolu)
or die ("Veritabanına ulaşılamıyor!" . mysql_error() );
$sonuc = mysql_query("SELECT * FROM calisanlar",$veri_yolu);
printf("Adı: %s<br>\n", mysql_result($sonuc,0,"adi"));
printf("Soyadı: %s<br>\n", mysql_result($sonuc,0,"soyadi"));
printf("Adresi: %s<br>\n", mysql_result($sonuc,0,"adres"));
printf("Görevi: %s<br>\n", mysql_result($sonuc,0,"pozisyon"));
?>
</BODY>
</HTML>
Burada, mysql_connect() fonksiyonu ile "kara-murat" isimli sunucuda root adına
MySQL sunucu ile bağ kurduktan sonra mysql_select_db() fonksiyonu ile bu bağı
kullanarak veri isimli veritabanından veri çekeceğimizi bildiriyoruz. Daha sonra
mysql_query() fonksiyonu ile bu veritabanındaki “calisanlar” isimli tablodan “herşeyi”
seçiyoruz ve seçilenleri $sonuc dizi-değişkeninde topluyoruz. $sonuc değişkenin değerlerini
görüntülemek için PHP'nin özel bir fonksiyonu olan mysql_result() fonksiyonu kullanıyoruz.
Burada metin biçimlendirmekte yararlandığımız printf() fonksiyonunu daha önce
tanımıştık.
mysql_query() fonksiyonu, PHP'nin SQL dilini kullahnarak veritabanı işlemleri
yapmasını sağlayan başlıca aracıdır. Yukarıda kısaca değindiğimiz bütün SQL komutlarıyla
yazacağımız bütün "query" deyimlerini bu fonksiyon ile icra ettireceğiz. mysql_result() ise
SQL değil, Data Manipulation Language (DML) denen başka bir veri-biçimlendirme dilinin
inceliklerinden yararlanmamızı sağlar. Burada $sonuç değişkeninde veritabanı kayıt
biçiminde tutulan verileri PHP'nin ve dolayısıyla HTML'in anlayacağı biçime çeviren bu
fonksiyondur.
Şimdi bu programı biraz geliştirilim ve daha önce kendi kendine bilgi veren Form
örneğimizi buraya uygulayalım; ancak bu kez, ziyaretçimizin vereceği bilgileri veritabanına
ekleyelim; ve kendi adının veritabanına eklendiğini sayfadaki tabloyu güncelleyerek
bildirelim. Önce şu programı, veri_02.php adıyla kaydedelim:
Kod:
<?php
// Form doldurulduktan sonra program buradan başlıyor
if ( isset ( $HTTP_POST_VARS )) {
$veri_yolu = mysql_connect("server", "root");
if ( ! $veri_yolu ) die ("MySQL ile veri bağlantısı kurulamıyor!");
mysql_select_db("veri" , $veri_yolu) or die ("Veritabanına ulaşılamıyor!" .
mysql_error() );
$ekle = mysql_query("INSERT INTO calisanlar ( adi , soyadi , adres , pozisyon )
VALUES ('$adi', '$soyadi', '$adres', '$pozisyon' )", $veri_yolu );
echo ("
<HTML>
<HEAD>
<TITLE>PHP'de Veritabanı</TITLE>
<meta http-equiv='content-type' content='text/html; charset=ISO-8859-9'>
<meta http-equiv='Content-Type' content='text/html; charset=windows-
1254'>
");
$sonuc = mysql_query("SELECT * FROM calisanlar", $veri_yolu);
echo ("
<TABLE>
<TR>
<TD><B>Uzmanın Adı</B></TD>
<TD><B>Çalıştığı Yer</B></TD>
<TD><B>Görevi</B></TD>
</TR>
\n");
while ($satir = mysql_fetch_row($sonuc)) {
printf("<TR><TD>%s %s</TD><TD>%s</TD></TD><TD>%s</TD></TR>\n", $satir[1],
$satir[2], $satir[3], $satir[4]);
}
echo ("
</TABLE>\n
<p><B>Teşekkür ederiz.</B></P>
<A HREF='index.php'>Ana sayfaya dönmek için tıklayınız</A>
");
}
// program ilk kez açılıyorsa buradan başlayacak
else {
echo ("
<HTML>
<HEAD>
<TITLE>PHP'de Veritabanı</TITLE>
<meta http-equiv='content-type' content='text/html; charset=ISO-8859-9'>
<meta http-equiv='Content-Type' content='text/html; charset=windows-
1254'>
</HEAD>
<BODY>
<p><B>Mevcut Üyelerimiz</B></P>
");
$veri_yolu = mysql_connect("server", "root");
mysql_select_db("veri", $veri_yolu);
$sonuc = mysql_query("SELECT * FROM calisanlar", $veri_yolu);
echo ("<TABLE>
<TR>
<TD><B>Uzmanın Adı</B></TD>
<TD><B>Çalıştığı Yer</B></TD>
<TD><B>Görevi</B></TD>
</TR>
\n");
while ($satir = mysql_fetch_row($sonuc)) {
printf("<TR><TD>%s %s</TD><TD>%s</TD></TD><TD>%s</TD></TR>\n", $satir[1],
$satir[2], $satir[3], $satir[4]);
}
echo ("
</TABLE>\n
<p></p>
<p><B>Siz de aramıza katılmak ister misiniz?</B></P>
<FORM ACTION='$PHP_SELF' METHOD='POST'>
<TABLE>
<TR><TD>Adınız: </TD><TD><INPUT TYPE='TEXT' NAME='adi'></TD></TR>
<TR><TD>Soyadınız: </TD><TD><INPUT TYPE='TEXT' NAME='soyadi'></TD></TR>
<TR><TD>İş Yeriniz: </TD><TD><INPUT TYPE='TEXT' NAME='adres'></TD></TR>
<TR><TDALIGN='left'>Göreviniz: </TD><TD><INPUT TYPE='TEXT'
NAME='pozisyon'></TD></TR>
<TR><TD ALIGN='center'><INPUT TYPE='SUBMIT' VALUE='Defteri
imzala!'></TD><TD ALIGN='center'><INPUT TYPE='RESET' VALUE='Tümünü
sil!'></TD></TR>
</TABLE>
</FORM>
</BODY>
</HTML>
");
}
?>
Program, ilk kez çalıştığında, çalışmaya ikinci yarısındaki else() deyiminden itibaren
icra ediliyor; ziyaretçilerimize mevcut üyelerimizin listesini veriyor ve üye olmak isteyip
istemediğini soruyor. Arzu edenin üye olabilmesi için gerekli Form'u da sunuyoruz.
Programın her iki bölümünde de veri okuyan ve bunu görüntüleyen, yani programın
canalıcı noktası, mysql_fetch_row() fonksiyonudur. PHP'nin DML araçlarından olan bu
fonksiyonun marifeti, bir veritabanından elde edilen sonucu satır-satır okumasıdır. Nitekim,
burada bu fonksiyondan dönen değeri $satir adını verdiğimiz dizi-değişkene yazıyoruz ve
sonra printf() bu dizinin elemanlarını sırayla Browser penceresine gönderiyor. (Burada
olduğu gibi $satır değişkenin içinde kaç kaç sütun olduğunu bildiğimiz durumlarda printf()
fonksiyonunu döngüsüz kullanmak mümkündür. Ancak veritabanının sütun sayısını
bilmiyorsak bunu sözgelimi count($satir) yoluyla öğrenip, bu bilgiyle bir for döngüsü
kurmak yerinde olur.
Programın iki bölümü arasındaki tek fark, $HTTP_POST_VARS dizi-değişkeninin bir
değer tutması halinde (yani ziyaretçi sayfayı açtığında karşısına çıkan Form'u doldurduğu
ve gönderdiği zaman) çalışan birinci bölümünde, mysql_query() fonksiyonunun bu kez
veritabanı dosyasına ziyaretçinin verdiği bilgileri işlemek üzere farklı bir SQL deyimi
içermesidir. Nasıl yazıldığını daha önce ele aldığımız bu fonksiyon "calisanlar" tablosundaki
dört alana elimizdeki dört değişkenin değerlerini SQL'in INSERT komutuyla ekliyor.