| MYSQL KURULUMU VE SQL'E GİRİŞ |  |  |  |
PHP ve Veritabanı
Kişisel bilgisayarınızdaki kişisel Web sunucusuna PHP
öğretme işlemine geçmeden önce, hemen hemen PHP'nin ikiz kardeşi sayılan
MySQL'den ve onun rakibi PostgreSQL'den kısaca söz edelim.
PHP'nin varlık sebeplerinin başında, ticarî Unix ve
Microsoft Windows işletim sistemlerinden ayrı, ticarî olmayan Açık Sistem
ortamlarında çalışan bir Script dili ile bu dille kullanılabilecek yine Açık
Sistem ürünü bir veritabanı erişim ve yönetim aracına sahip olmak gelir. Perl,
gerçi PHP'den çok önce Açık Sistem ürünü olarak, isteyen Web Programcısı'nın
ücretsiz edineceği bir CGI programlama dili olarak Web'in ilk gününden beri Web
Programcısının emrinde idi. Ama Perl, metin dosyalarından yazı çekmek ve bunları
biçimlendirerek rapor haline getirmek amacıyla geliştirilen bir dil olduğu için,
özellikle veritabanına dayalı işlemlerde programcıya çok güçlük çıkartıyordu.
ASP ise (ASP desteği sağlayan ve ücretsiz Web sitesi veren firmaların giderek
artmasına ve veritabanı konusunda hem kolaylık, hem de büyük bir etkinlik
sağlamasına rağmen) çoğunlukla ücretli Web sitesi aldığımız ticarî amaçlı
evsahibi (Hosting) firmalarının sağladığı bir teknoloji olarak görüldü. PHP,
tasarımcılarının MySQL ve PostgreSQL teknolojilerini geliştiren kurum ve
firmalarla yaptığı yakın işbirliği sonucu ikinci sürümünden itibaren
veri-yönlendirmeli Web uygulaması alanında önemli bir araç olarak belirdi.
Dolayısıyla, PHP kurulumu dendiği zaman, kendiliğinden, MySQL kurulumu da
kastedilmiş olur. Şimdi PostgreSQL da ekleyebiliriz.
PHP, bir dildir; MySQL ve PostgreSQL ise bir demet
sürücüdür. PHP ile, Web Server'a sayfanızı Internet ziyaretçisine göndermeden
önce bir takım komutları icra etmesini, bir takım veri dosyalarını açıp içindeki
bilgileri alıp bunları HTML kodlarıyla bezeyip, Browser'a bildiğimiz klasik HTML
sayfası olarak göndermesi talimatını veririz. MySQL ve PostgreSQL ise, Windows
sistemlerinde Denetim Masası'nda gördüğünüz ODBC Veri Kaynağı Yönetmeni adlı
araç gibi, bir vertabanı sunucusu, yani Database Server programlarıdır. Yakın
zamana kadar bu iki veritabanı yönetim aracı arasında fazla bir çekişme yoktu.
Ancak şimdi özellikle Linux kullanıcıları topluluklarında iki program arasında
verimlilik testleri yapılıyor; hangisinin daha iyi olduğnuna ilişkin yoğun bir
tartışma sürüyor. PHPBuilder.com uzmanları, yaptıkları bir çok denemede,
MySQL'in daha hızlı ve daha etkin çalıştıkları sonucuna varıyorlar. (Bu konuda
daha geniş bilgi edinmek için Internet'te
www.PHPbuilder.com/columns/tim20000705.PHP3 adresine bakabilirsiniz.)
MySQL, bir kullanıcı lisansı 200 Dolar olan ticarî bir
program iken 2000 yılı ortalarında GPL (GNU General Public License/GNU Kamusal
Lisans) uygulamasına geçmiş ve ücretsiz dağtılır hale gelmiş bulunuyor. Buna
göre MySQL'i bir ticarî uygulamanın içinde motor olarak kullanacaksanız üreteci
firmaya lisans ücreti ödemeniz gerekir; bunun dışındaki uygulamalar için
programı Internet'ten indirerek kullanabilirsiniz. PHP için MySQL'e gerek
yoktur. PHP, bir NT veya Win9x tabanlı Web Server'da çalıştırılıyorsa,
Microsoft'un ODBC sürücüleri ile çalışabilir; ve ODBC'nin okuduğu bütün
veritabanlarından veri çekebilir. (ODBC'nin Unix-Linux sürümü de vardır.)
Ayrıca PHP için Adabas, dBase, Empress, FilePro, Informix, InterBase, mSQL,
Oracle, Solid, Sybase, Velocis ve bir çok Unix veritabanı yöneticisi için
geliştirilmiş add-on (sonradan eklenen) modüller vardır. PHP, bir çok LDAP
istemci programı için yazılmış API'lere de sahiptir. PHP ile IMAP, SMTP gibi
Internet elektronik mektup protokollerini kullanmak da mümkündür.
MySQL Veritabanı ve SQL
SQL çok geniş bir dildir. Burada yapabileceğimiz giriş
ancak ilk alıştırmamaızı yapmamıza yetebilir.
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 Kurulumu
- MySQL veritabanını burayı tıklayarak indirin.
- ZIP dosyasını açın ve SETUP.EXE’ yi çalıştırın.
- Program yüklendikten sonra MS-DOS ekranına geçin.
- cd\mysql\bin yazıp ENTER'a basın.
- ren mysqld-shareware.exe mysqld.exe yazıp ENTER'a basın.
- c:\mysql\bin\mysqld --standalone yazıp ENTER'a basın.
- Eğer işletim sisteminiz NT ise, 6.maddeyi atlayın, c:\mysql\bin\mysqld --install yazıp ENTER'a basın.
- Eğer Win95/98 kullanıcısıysanız, 6.maddedeki komutu bilgisayarınızı her yeniden kapatıp açtığınızda tekrar yazıp çalıştırmanız gerekir, Başlat | Çalıştır (Start | Run) ekranından aynı komutu verip çalıştırabilirsiniz.
- exit yazıp ENTER'a basın ve DOS ekranını kapatın.
- NT kullanıyorsanız MySQL'i başlatmak için; Başlat | Ayarlar | Denetim Masası | Hizmetler (Start Menu | Settings | Control Panel | Services) seçeneklerine tıklayın ve MySql i seçip Başlat (Startup) tuşuna basın.
Artık MySQL sistemimizde kurulu. MS-DOS ekranına
geçip bir deneme yapalım. DOS ekranında cd\mysql\bin yazın. Bu klasör MySQL'in
bütün çalıştırılabilir dosyalarının bulunduğu yer.
C:\mysql\bin> mysqladmin version
Bu komutu verdiğinizde karşınıza MySQL ile ilgili
bilgiler gelecektir. Bu, programı doğru bir şekilde yüklediğinizi ve programın
kullanıma hazır olduğunu gösterir. Eğer "cannot connect to localhost" gibi bir
hata mesajı alıyorsanız, "--standalone" ekini koyup koymadığınızı kontrol edip
tekrar "mysqld" yi çalıştırın.
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
sıralanabilir:
| 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), uye_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 = "Fatma" ;
Bu komut, veritabanındaki bütün satırlarda,
birinci sütundaki değerleri "Fatma" 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öylememiz 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 = "Fatma" 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;
Veritabanı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 yenilenme 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
komut satı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 mysqld-shareware.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
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!)
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' , 'Is 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.
Birden Fazla Tablo Kullanımı
SQL'de birden fazla tablodan veri çekmekte özel
bir notasyon kullanılır. Tabloların birbirine bağlanması işlemine "join" adı
verilir. Birleştirmenin "left join" ve "right join" olmak üzere iki çeşidi
vardır. Öğrenci sınav sonuçlarının bulunduğu bir tabloyla öğrenci ad, soyad ve
diğer bilgilerinin bir arada olduğu tabloda ortak noktayı sağlayan bir alan
olmalıdır. Her iki tabloda da öğrenci numarası ortak alan olarak
belirtilmelidir. Bu sayede öğrenci numarası belirtilerek sınav sonuçları bulunan
tablodan sınav sonuçları, diğer bilgilerin bulunduğu tablodan da isim soyad
bilgileri çekilebilir.
select
ad, soyad, sinav1, sinav2, sinav3
from
sinavsonuc, bilgi
where
sinavsonuc.ogrencino = bilgi.ogrencino;
Bu sorguyla bilgi tablosundan ad, soyad,
sinavsonuc tablosundan sinav1, sinav2 ve sinav3 alanları çekiliyor. İki farklı
tablodan bilgi çekildiği için "from" alanında her iki tablo isminin de
belirtilmesi gerekiyor. Sorgudaki "where" alanında her iki tabloda eş olması
gereken alanın belirtilmesi için farkı bir formatta yazılım kullanılıyor. Sınav
sonuçları tablosundaki öğrenci numarası için "sinavsonuc.ogrencino", diğer
bilgilerin yer aldığı bilgi tablosundaki öğrenci numarası için de
bilgi.ogrencino kullanılıyor. En sonda yer alan "where" bölümü sayesinde
bilgiler eşleştirilerek veritabanından çekilebiliyor.