MySQL XML Dump-I
Merhaba, Geçen yazımızda PHP-XML hakkında konuşmuştuk ve PHP"nin XML dokumanlarını kullanmak için bulunan araçlarından olan Expat fonksiyonlarını incelemiştik. Geçen sürede phpMyadmin"in son sürümlerinden birisini incelerken hepimizin bildiği veritabanı bilgisini dump etme özelliklerine bir de veriyi XML olarak dump etme özelliğini eklemiş olduklarını gördüm. Ama ne yazıkki XML verisini mysql"e dump etme özelliğini bulamadım,galiba yoktu...
İşte bugünkü yazımızın konusuda bu oldu böylece, yazı 2 bölümden oluşacak
1- PHP ile mysql verisini XML"ye dump etme işlemi
2- XML verisini mysql"e dump etme işlemi.
Başlayalım ...
MYSQL"İ DUMP EDELİM
Öncelikle bugünkü yazımın kod ağırlıklı olacağını söyleyeyim, kendi yazacağımız 2 adet class dosyası ile yukarıda bahsettiğimiz iki işlemi yapacağız. Peki ama neden class yani OOP kullanacağız ? 1- Yazacağımız kod başka programcılar tarafından da kullanılabilir olacak 2- Script oldukça basit bi şekilde çalışacak bu yüzden başkaları tarafından da kolay bi şekilde geliştirilebilinir olmasını isteyeceğiz. Class içinde eksik olan - ver her API benzeri şeyde olması gereken - error kontrolü, işlemler sırasında oluşan durumlar hakkında bilgi veren fonksiyonlar çok karmaşık olmaması için class yapılarına eklenmedi.
XML dokumanının yapısı :
Bir mysql veritabanı bilgisini tutacak olan XML dokumanının yapısı sizce nasıl bir şey olmalıdır ? XML dokumanı bir ağaç yapısı içerdiğine göre veriler de onun içinde hiyerarşik olarak tutulacaktır. Yani hiyerarşi şöyle bi şey olacaktır
-<Veritabani adi> ---<Tablo1> ------<Alan1> --------Veri ------</Alan1> ------<Alan2> --------Veri ------</Alan2> ----</tablo1> ---<Tablo1> ------<Alan1> --------Veri ------</Alan1> ------<Alan2> --------Veri ------</Alan2> ----</tablo1> |
Aynen bu şekilde her <tablo1> etiketi içinde bir kayıt olacak şekilde kayıtlar altalta aynı hiyerarşik düzeyde sıralanacaktır. Farklı tablo kayıtları ise mesela <tablo2> gibi o tablonun ismini alan bir etiket ile aynen tablo1 de olduğu gibi kayıtlar sıralanacaktır. Örnek bir mysql bilgisi içeren XML dokumanı şöyle bi şeyler olmalıdır : Mysql veritabanı şöyle olsun
Üyeler tablosu _____________________ |uye_id| isim | soyisim | ----------------------------- | 1 | mustafa | Karabulut | ----------------------------- | 2 | Hakan | Müştak | -----------------------------
Makaleler tablosu
|m_id | baslik | yazar | ---------------------------------- | 1 | php ve expat | mkarabulut| ------------------------------------ | 2 | html ve table| TheBozo | ------------------------------------- | 3 |Raistin klav..| Raist | -------------------------------------
<?xml version="1.0" encoding="ISO-8859-9" ?> <veritabanim> <uyeler> <uye_id>1</uye_id> <isim>mustafa</isim> <soyisim>Karabulut</soyisim> </uyeler> <uyeler> <uye_id>2</uye_id> <isim>Hakan</isim> <soyisim>Müstak</soyisim> </uyeler> <makaleler> <m_id>1</m_id> <baslik>php ve expat</baslik> <yazar>mkarabulut</yazar> </makaleler> <makaleler> <m_id>2</m_id> <baslik>html ve table</baslik> <yazar>TheBozo</yazar> </makaleler> <makaleler> <m_id>3</m_id> <baslik>Raistin klav..</baslik> <yazar>Raist</yazar> </makaleler> </veritabanim> |
Yukarıda görüldüğü gibi veritabanımızı XML olarak dump etmek için bize gerekenler şunlardır :
1- DVeritabanı adı (Root node olarak)
2- Tablo isimleri
3-Tablolarda bulunan alan (field) isimleri
4-Veriler,yani kayıtların kendileri
Programcının yapması dikkat etmesi gereken noktalar :
1- DVeritabanı adı (Root node olarak)
2- Tablo isimleri
3-Tablolarda bulunan alan (field) isimleri * Tablo içindeki kayıtlar mysql den alınacak * Bir sorgu ile de tablo içindeki alan isimleri alınacak * Tablo ismi etiketi içinde her kayıt döngü içinde XML dok. dönüştürülücek
Veritabanı içindeki tabloların listesi :
Bir veritabanı içindeki tabloların listesini almak için 2 yolumuz var. Birinci yol PHP"nin mysql_list_tables($dbname,$conn) fonksiyonunu kullanmak : Bu fonksiyon varolan bir veritabanı bağlantısı bilgisini ve veritabanı ismini alır ve veritabanındaki tablo bilgilerini mysql result bilgisi olarak geri dönderir.Sonuçları almak için mysql_result() veya mysql_fetch_array() gibi fonksiyonlar kullanılmalıdır.
İkinci yol ise mysql sorgusu kullanarak öğrenmektir : Yapacağımız işlem "SHOW TABLES" sorgusunu veritabanına göndermektir.Örneğin :
<? $conn=mysql_connect ($localhost,$user,$password); mysql_select_db($database,$conn); $sorgulama=mysql_query("SHOW TABLES"); while ($kayit=mysql_fetch_array($sorgulama)) echo "Tablo :".$kayit[0]."<br>"; mysql_free_result($sorgulama) ; ?> |
Biz class yapısı içinde daha doğal bir yöntem olan 2. metodu kullandık.
Tablo alan isimlerinin alınması :
Bir tablo içindeki alanların alınması,mesela yukarıdaki uyeler tablosu için uye_id,isim,soyisim şeklinde olan alan isimlerinin alınması işlemi için yine 2 ayrı metod kullanılabilir. Birinci metod yine PHP"nin bir fonksiyonu olan mysql_list_fields($dbname,$tablename,$conn) fonksiyonunu kullanmak: Bu fonksiyon aldığı 3 parametre ile sırasıyla veritabanı adı,tablo adı ve bağlantı bilgisini alır. Geriye mysql_result(),mysql_fetch_array() gibi fonksiyonlar tarafından alınabilecek sonuç bilgisi dönderir.
İkinci yok ise yine mysql"in sağladığı sorguları kullanmaktır : Bu sefer kullanacağımız sorgu "SHOW FIELDS FROM tablo" dır.
<? $conn=mysql_connect ($localhost,$user,$password); mysql_select_db($database,$conn); $sorgulama=mysql_query("SHOW FIELDS FROM uyeler"); while ($kayit=mysql_fetch_array($sorgulama)) echo "Alan ismi :".$kayit[0]."<br>"; mysql_free_result($sorgulama) ; ?> Yine class yapisinda 2. metodu kullandik. ?> |
Böylece veritabanı içindeki tabloların ve tablo alanlarının isimlerini nasıl alınabileceğini görmüş olduk. Geriye son adım olarak kayıtların alınması kalıyor, o da çok aşina olduğumuz "SELECT * FROM tablo" sorgusu ile yapacağımız bi işlemden ibaret. Kod sırasında dikkat etmemiz gereken nokta döngüleri doğru kurarak , tabloları listelemek, tablolar listelenirken kayıtları ve alan isimlerini alarak XML dokumanını döngüler içinde oluşturabilmektir.
Class yapısını inceleyip metodları ve özellikleri üzerinde konuşmaya başlamadan önce genelde bilinen fonksiyonlar kullanmama rağmen 2 tane yeni olabilecek fonksiyondan bahsetmek istiyorum :
$number= count($degisken) : count() fonksiyonu kısaca verilen dizi değişken gibi bir değişkenin eleman sayısını geri dönderir. Örneğin
<? $dizi = array ("mkarabulut","hmustak","yemre","ab","duzgun","sahin"); echo "dizide ".count($dizi)." tane eleman var"; /* Çiktisi : dizide 6 tane eleman var */ ?> | İkinci fonksiyon ise number_format fonksiyonu() :Verilen bir sayısı binler basamağı,ondalıkları gibi bilgileri istenilen gibi düzenlenerek formatlayıp geri döndürür. Fonksiyonun paramereleri number_format ($sayi,$ondalik_sayisi,$ondalik_ayrac_stringi,$binler_ayrac_stringi); Örnek kullanım
<? $sayi = 12345.345678; echo number_format ($sayi,2,","," "); /* Çikti : 12 345,34 */ ?> | Şimdi scriptimize geçebiliriz. Class dosyamızın adı mysql2xml...
|