<?xml version="1.0" encoding="iso-8859-9"?>
<config>
<item>
<name>databasename</name>
<data><![CDATA[turbulance]]></data>
</item>
<item>
<name>username</name>
<data><![CDATA[eternity]]></data>
</item>
<item>
<name>password</name>
<data><![CDATA[8f10d078b2799206cfe914b32cc6a5e9]]></data>
</item>
<item>
<name>dbtype</name>
<data><![CDATA[mysql]]></data>
</item>
</config>
Gördüğünüz gibi son derece basit yapıda bir XML dosyası kullanacağız. <item> etiketleri arasına dosyada bulunmasını istediğimiz kayıtlar bulunuyor. Her kayıdın ismi <name> etiketi içerisinde, verisi ise <data> etiketi içerisinde yer alıyor. Dosyadaki <![CDATA[****]]> bölümleri gözünüzü korkutmasın. Bu blok sayesinde yazdığımız string içerisindeki < > gibi karakterlerin gözardı edilmesini sağlıyoruz.
Şimdi geldik işin asıl büyülü kısmına
PHP ile bu tip konfigürasyon dosyalarını okuyabilmeli, güncelleyebilmeli veya sıfırdan yaratabilmeliyiz. Bunun için Config isimli bir class yazacağız. XML dosyalarını parse etmek için bildiğiniz gibi iki aytı API var. Bizim için hız önemli olduğu için SAX (Simple API for XML) kullanacağız. İşte class'ımız:
class Config
{
var $tag; // Bulunduğumuz tag
var $file; // Konfigürasyon dosyası
var $itemData = array(); // Verilerin tutulacağı array
var $encoding; // XML dosyasında kullanılacak olak karakter seti
/**
* Class constructor'i. Bu classa ait herhangi bir obje oluşturmak için kullanacağımız
* class metodu.
*
* @param $encoding XML dosyasında kullanılacak olak karakter seti
*/
function Config($encoding = 'iso-8859-9')
{
// Başlangıç verileri
$this->encoding = $encoding;
$this->tag = "";
$this->counter = 0;
}
/**
* Kayıt için kullanılacak XML dosyasını belirleyen metod.
*
* @param $file Dosya adı
*/
function setFile($file) {
$this->file = $file;
}
/**
* Bu metod PHP'nin SAX API'si olan EXPAT için gereklidir.
* Bu metodu kullanarak XML parser herhangi bir açılış etiketine rastladığında ne yapacağını
* belirleyebiliriz.
*
* @param $parser Parser handle
* @param $name Parser'ın karşılaştığı etiket ismi
* @param $attributes etikete ait özellikler
*/
function startElementHandler($parser, $name, $attributes)
{
// Şuanda üzerinde çalıştığımız etiket ismini hafızaya al
$this->tag = $name;
}
/**
* Bu metod PHP'nin SAX API'si olan EXPAT için gereklidir.
* Bu metodu kullanarak XML parser herhangi bir kapanış etiketine rastladığında ne yapacağını
* belirleyebiliriz.
*
* @param $parser Parser handle
* @param $name Parser'ın karşılaştığı etiket ismi
*/
function endElementHandler($parser, $name)
{
// Hafızadaki etiket ismini temizle.
$this->tag = "";
// Eğer etiket adı ITEM ise kayıt sayacını bir arttır.
if ($name == "ITEM")
{
$this->counter++;
}
}
/**
* Bu metod PHP'nin SAX API'si olan EXPAT için gereklidir.
* Bu metodu kullanarak XML parser herhangi bir veri bloğuna geldiğinde ne yapacağını
* belirleyebiliriz.
*
* @param $parser Parser handle
* @param $data Açılış ve kapanış etiketleri arasında yer alan veri
*/
function characterDataHandler($parser, $data)
{
// Okunan veriyi temizle
$data = trim(htmlspecialchars($data));
// Eğer üzerinde çalıştığımız etiket NAME ise
if ($this->tag == "NAME")
{
// itemData array'ine isim kaydını gir
$this->itemData[$this->counter][0] .= $data;
} elseif ($this->tag == "DATA") {
// Eğer üzerinde çalıştığımız etiket DATA ise
// itemData array'ine veri kaydını gir
$this->itemData[$this->counter][1] .= $data;
}
}
/**
* Bu metod belirtilen dosyanın XML parser tarafından parse edilmesini sağlar
*/
function parseXml()
{
// Parser'ı oluştur
$this->xmlParser = xml_parser_create();
// Obje referansını gir (Bu xml parser'ı bir class içinde kullandığımız için gerekli)
xml_set_object($this->xmlParser, $this);
// Parser'a ait bazı özellikleri belirle
// Büyük küçük karakter ayrımı yapmaması için:
xml_parser_set_option($this->xmlParser, XML_OPTION_CASE_FOLDING, TRUE);
// White Space olarak tabir edilen boşluk, satırsonu karakteri gibi karakterleri gözardı
// etmesi için:
xml_parser_set_option($this->xmlParser, XML_OPTION_SKIP_WHITE, TRUE);
// Daha önceden tanımladığımız metodların XML parser tarafından kullanılması için tanımladığımız
// bu fonksiyonları bildiriyoruz.
xml_set_element_handler($this->xmlParser, "startElementHandler",
"endElementHandler");
xml_set_character_data_handler($this->xmlParser, "characterDataHandler");
// Dosyayı oku
if (!($fp = fopen($this->file, "r")))
{
die($this->file . " dosyası okunamadı");
}
// Parse etmeye başla
while ($data = fread($fp, 2048))
{
if (!xml_parse($this->xmlParser, $data, feof($fp)))
{
die("Şu hata meydana geldi: " .
xml_error_string(xml_get_error_code($this->xmlParser)));
}
}
// Parser'ı yoket
xml_parser_free($this->xmlParser);
}
/**
* Varsayılan karakter seti olarak kullandığımız iso-8859-9 karakter setinden
* başka bir karakter seti kullanmak için bu metodu çağıracağız.
*
* @param $encoding Geçerli kılınacak karakter seti
*/
function setEncoding($encoding) {
$this->encoding = $encoding;
}
/**
* Konfigürasyon verileri içerisinde isme göre arama yapabilmemizi sağlayan
* metod. İsmini verdiğimiz veriyi bize döndürür.
*
* @param $name Arama yapılacak olan kayıt ismi
*/
function getByName($name) {
foreach ($this->itemData as $item) {
// Eğer verilen isim ile kayıt ismi tutuyor ise kayda ait veriyi döndür.
if ($name == $item[0]) return $item[1];
}
// Eğer bu satıra erişilmiş ise kayıt bulunamamış demektir. False döndür.
return false;
}
/**
* Konfigürasyon verileri içerisinde kaydın bulunduğu sıra biliniyorsa bu method
* ile daha hızlı erişim sağlanabilir. Bu method kayıt ismine göre arama yapma
* ihtiyacı duymadığı için daha hızlı çalışmaktadır.
*
* @param $id Verisi görüntülenecek kayda ait id numarası. Dosyadaki ilk kaydın numarası 0 olacak şekilde.
*/
function getById($id) {
if(isset($this->itemData[$id])) {
// Eğer verilen id'ye göre bir kayıt var ise verisini döndür.
return $this->itemData[$id][1];
} else {
// Kayıt bulunamadı ise false döndür.
return false;
}
}
/**
* Konfigürasyon verileri içerisindeki herhangi bir kaydı güncellemek için
* kayıt ismine göre arama yaparak kullanabileceğimiz method.
*
* @param $name Kayıt ismi
* @param $data Kayıda ait yeni veri
*/
function setByName($name, $data) {
$i = 0; // Kayıtlar arasında arama yaparken kullanacağımız sayaç
foreach($this->itemData as $item) {
// Eğer verilen kayıt ismi ile şuan geçerli kayıt ismi tutuyor ise
// döngüden çık, tutmuyor ise sayacı bir arttır.
if($name == $item[0]) break;
else $i++;
}
// Sayaç hala 0 ise ve ilk kayıdın (id'si gerçekten 0 olan) ismi verilen isimden
// farklı ise false döndür.
if($i == 0 && $this->itemData[0][0] != $name) {
return false;
} else {
// Eğer yukarıdaki şartlar gerçekleşmedi ise kayıt bulundu demektir.
// Kayıda ait veriyi güncelle
$this->itemData[$i][1] = $data;
return true;
}
}
/**
* Id'si verilen kayda ait veriyi günceller
*
* @param $id Kayıt id'si
* @param $data Kayıda ait yeni veri
*/
function setById($id, $data) {
// Verilen id'de bir kayıt var mı kontrol et.
if(isset($this->itemData[$id])) {
// Kayıt var ise verisini güncelle.
$this->itemData[$id][1] = $data;
return true;
} else {
// Kayıt yok ise false döndür.
return false;
}
}
/**
* Yeni bir konfigürasyon kaydı ekler.
*
* @param $name Kayıt adı
* @param $data Kayıda ait veri
*/
function addField($name, $data) {
// Şuandaki kayıt sayısına göre yeni bir elemanı itemData
// arrayine ekle.
$this->itemData[$this->counter][0] .= $name;
$this->itemData[$this->counter][1] .= $data;
// Kayıt sayacını arttır.
$this->counter++;
}
/**
* Mevcut kayıt verilerini dosyaya yazar.
*/
function saveXml() {
// XML dosyasını string olarak oluştur
$xmlData = "<?xml version="1.0" encoding="" . $this->encoding . ""?>n";
$xmlData .= "<config>n";
foreach ($this->itemData as $item) {
$xmlData .= " <item>n";
$xmlData .= " <name>".$item[0]."</name>n";
$xmlData .= " <data><![CDATA[".$item[1]."]]></data>n";
$xmlData .= " </item>n";
}
$xmlData .= "</config>";
if (!$fp = fopen ($this->file, "w")){
die("Dosyaya yazılamadı. Dosya üzerindeki yetkilerinizi kontrol ediniz.");
} else {
// Oluşturulan stringi dosyaya yaz.
fwrite($fp, $xmlData);
fclose($fp);
return true;
}
}
// Class sonu
}
?>
Yukarıda gördüğünüz class'ın çalışma mantığını anlayabilmeniz için kodu okumanız aslında yeterli, eklediğim comment'ler ile kodun açıklayıcı olmasına çalıştım. Ama parse edilen dosyadan okunan bilgilerin nasıl bir veriyapısı içerisinde tutulduğunu anlatmak istiyorum, böylece kod içerisinde kullanılan bazı metodların çalışma prensiplerini daha rahat anlayabilirsiniz. Class içerisindeki itemData array'inin örnek olarak verdiğim XML dosyası parse edildikten sonra nasıl bir hal aldığını anlamak için PHP'nin var_dump() fonksiyonundan yararlanabiliriz.
array(4) {
[0]=>
array(2) {
[0]=>
string(12) "databasename"
[1]=>
string(10) "turbulance"
}
[1]=>
array(2) {
[0]=>
string(8) "username"
[1]=>
string(8) "eternity"
}
[2]=>
array(2) {
[0]=>
string(8) "password"
[1]=>
string(32) "8f10d078b2799206cfe914b32cc6a5e9"
}
[3]=>
array(2) {
[0]=>
string(6) "dbtype"
[1]=>
string(5) "mysql"
}
}
Peki bu class'ı nasıl kullanacağız ? Aşağıdaki örnek kodu inceleyelim:
<?
// Öncelikle class'ımızı include edelim.
require_once('confmanager.php');
// Yeni bir conf nesnesi yaratalım.
$conf = new Config();
// Nesnemizin kullanacağı konfigürasyon dosyasy adını belirleyelim
// Burada dosyanın tam yolunu vermemiz gerekiyor.
$conf->setFile('config1.xml');
// Dosyaya kaydedeceğimiz konfigürasyon verilerini girelim.
$conf->addField("databasename", "turbulance");
$conf->addField("username", "eternity");
$conf->addField("password", md5("deneme"));
$conf->addField("dbtype", "mysql");
// Oluşturduğumuz verileri dosyaya yazalım.
$conf->saveXml();
?>
Yukarıdaki kodu kullanarak bir konfigürasyon dosyası oluşturduk. İnanmıyorsanız gidin bakın :P.. Şimdi ise oluşturduğumuz bu dosyayı nasıl kullanacağız ona bir bakalım…
<?
// Öncelikle class'ımızı include edelim.
require_once('confmanager.php');
// Yeni bir conf nesnesi yaratalım.
$conf = new Config();
// Nesnemizin kullanacağı konfigürasyon dosyasy adını belirleyelim
// Burada dosyanın tam yolunu vermemiz gerekiyor.
$conf->setFile('config1.xml');
// Dosyayı parse edelim ve verileri alalım
$conf->parseXml();
// Örneğin dbtype isimli konfigürasyon verisini almak istersek
$dbType = $conf->getByName('dbtype');
echo "Veritabanı tipi $dbType<br />n";
// Ya da ikinci sırada olduğun bildiğimiz username verisini almak için
// Dikkat ilk kaydın indexi 0 2. kaydın 1…
$userName = $conf->getById(1);
echo "Kullanıcı adı $userName<br />n";
// Şimdi kayıt içerisindeki password verisini değiştirelim
$conf->setByName('password', md5('yenisifre'));
// Hatta yeni bir kayıt daha ekleyelim
$conf->addField('siteName', 'infinity');
// Oluşturduğumuz verileri dosyaya yazalım.
$conf->saveXml();
?>
Evet bu makaledeki uygulama ile nesne tabanlı olarak EXPAT ile xml dosyalarını nasıl parse edebileceğinizi bu verileri kullanmanın ne kadar kolay olduğunu görmüş oldunuz. Yukarıdaki uygulama tabii ki mükemmel değil, eksiklerini ve olabilecek hatalarını gidermek size kalmış.
kaynak: ordan burdan
Tags: 12, aşk, bölüm, counter, din, etme, hata, html, ince, izle, kar, kayıt, korku, kum, nasıl, nedir, para, php, rar, RTL, scripti, Scriptler, sex, site, tanı, vePhp - Xml Kullanarak Sık Kullandığınız Konfigürasyon Verilerinin Saklanması (scripti, nasıl, nedir?) konusu
Benzer yazılar:
- Benzer yazı yok