nedir

Ozellike kod yazma asamasinda programimizin cesitli yerlerinde gerceklesen hatalari gorebilmek, bir degiskenin script'imizin cesitli satirlarinda hangi degerlerde oldugunu gormek icin echo() print() fonksiyonlarini kullanarak kendimize has mesajlari uretiriz.

Ornegin 'echo "Burasi satir 72. Bu satirda isim degiskeni = $isim' turu programdaki hatalari bulmaya yonelik satirlar oldukca sIk kullanilir.

Fakat bu mesajlari hem bir standarda uymadigindan hem de hatanin script'in tam olarak neresinde meydana geldigini belirtmediginden cok kullanisli degildirler.

trigger_error() fonksiyonu bu sorunlari guzel bir bicimde cozuyor.

Ornegin yukaridaki ornekteki '$isim' degiskenine bir deger atanmamis olmasini kabul edip mesaji veren bir kod soyle olabilir.

<?
if(!isset($isim))
{
trigger_error("$isim 'e deger atanmamis", E_USER_ERROR);
}
$>

Eger buraya ulastiginda $isim degiskeni yaratilmamis ise asagidaki gibi bir mesaji uretilip, script'in calismasi duracaktir.

Fatal error: $isim 'e deger atanmamis in
/phpkod/turk-/trig_er. on line 34

Boylelikle hem profesyonel gorunuslu hem de programdaki hatalari bulmakta faydali bir mesaji uretmis oluyoruz. Tek yapmamiz gereken belirtilen satira gidip hatanin sebebini aramak.

kaynak: ordan burdan

<?
$tarih1 = "11/15/1999";
$tarih2 = "/10/2000";

list ($ay1, $gun1, $yil1) = explode ("/", $tarih1);
list ($ay2, $gun2, $yil2) = explode ("/", $tarih2);

$zamanpulu1 = mktime (0, 0, 0, $ay1, $gun1, $yil1);
$zamanpulu2 = mktime (0, 0, 0, $ay2, $gun2, $yil2);

$fark = ($zamanpulu1 > $zamanpulu2) ? ($zamanpulu1 - $zamanpulu2) : ($zamanpulu2 - $zamanpulu1);

print "Iki zaman arasindaki fark ";
print date ("Y", $fark) - 1970;
print "yil, " . (date("m", $fark) - 1);
print "ay " . (date ("d", $fark) - 1);
print "gundur.";
?>

kaynak: ordan burdan

<?

$baglanti = fsockopen("www..org.tr", 80, $errno, $errstr, 30);

if (!$baglanti) {
die($errstr);
}

fputs($baglanti, "GET / /HTTP/1.0

");
while (!feof($baglanti)) {
$satir = fgets($baglanti, 2048);
echo $satir;
}
fclose ($baglanti);
?>

Bir diger cozum ise 'nin soket kutuphanesini kullanmaktir.( icerisinden bu modulu kullanabilmek icin configure betigi –enable-sockets parametresi ile calistirilmalidir.)

<?
$url = 'www..org.tr';

$serv_port = getservbyname('www', 'tcp');
$adres = gethostbyname($url);

$sock = socket (AF_INET, SOCK_STREAM, 0);
if ($sock < 0) {
die(strerror($sock));
}

$res = connect($sock, $adres, $serv_port);
if ($res < 0) {
die(strerror($res));
}

$veri = "HEAD / HTTP/1.0

";

write ($sock, $veri, strlen($veri));

while (read($sock, $cevap, 2048)) {
print $cevap;
}

close ($sock);
?>

Her iki programda ayni islevi gormektedir.Ilk programda fsockopen () hazir fonksiyonu yardimiyla sokete baglanmak icin bir arayuz olustrulmustur.

Ikinci programda, programciya daha fazla kontrol sunan soket modulu kullanilmistir.Bu kutuphane ile daha dusuk seviyeli C API'lerine direkt erisim saglanmaktadir.

kaynak: ordan burdan

Problem : Degisken icerigini bir yerde saklamak istiyorsunuz.

Cozum : serialize () unserialize () hazir fonksiyonlarini kullanarak kendi fonksiyonlarinizi yazin.

loadsave.inc

<?
//
// File: loadsave.inc
// Library functions for saving and loading data to and from a file
//
//

//
// int save (string varname) :
// Save the value of varname to file
//

function save($var) {
global $$var;
$data = serialize($$var); // String Rep. of $$var
$filename = "php_serialized_vars/" . $$var . ".txt";
$fp = @fopen($filename, "w") or die ("Cannot open $filename for write ");

fwrite($fp, $data);
@fclose($fp) or die ("Cannot close $filename");
return(true);
}

//
// int load (string varname)
// Load the value of varname from a file
//
function load($var)
{
global $$var; // Put the saved variable in the global
// namespace
$filename = "php_serialized_vars/" . $$var . ".txt";
$fp = @fopen($filename, "r") or die ("Cannot open $filename for read ");

$data = fread($fp, filesize($filename));
@fclose($fp) or die("Cannot close $filename");

$$var = unserialize($data);
return(true);
}
?>

Simdi de bu fonksiyonlari programlariniz icinden nasil kullanacaginiza bakalim :

save.

<?
$foo = "merhaba";
save ('foo');
?>
<a href="load.">Burayi tiklayiniz</a>

load.

<?
load('foo');
print $foo;
?>

Tartisma : Verinin dizi,nesne vb. ne olduguna bakilmadan serialize () fonksiyonu ile string seklinde bir sikistirma yapilir.unserialize fonksiyonu bu string okuyarak tekrar eski haline getirir.

Birden fazla degiskenin ayni anda serialize edilmesi islemi

Bu islem ile ayni zamanda diger programlama dilleri veya surecleri ile verilerinizi paylasabilirsiniz.

Cozum : WDDX fonksiyonlari ile sikistirma yapiniz.( http://www.wddx.org/ )

<?
$ice_cream = array ("Mint Chocolate Chip","Vanilla","Chocalate","Coffee");
$packet_id = wddx_packet_start("");
wddx_add_vars($packet_id, "ice_cream");
$packet = wddx_packet_end($packet_id);
?>

Web Distributed Data sXchange formati, " Uygulamalar arasinda kompleks veri alis-verisi icin gelistirilmis bir mekanizmadir."Bu fonksyionlar ile sikistirma yapildiginda veri "paketleri" hazirlanir.Bu pakelter degiskeninizin sakladigi veri ile ilgili bilgi icerir.Bu pakelter saklanir istendiginde programiniz tarafindan tekrar okunur.

WDDX Deserialization

WDDX-ile sikistirilmis paket var cozmek, yani degiskenin degerini okumak istiyorsunuz.

wddx_deserialize fonksiyonu ile WDDX string'ini degiskenine donusturun :

<?

$favorite_tv_shows = array("M*A*S*H", "Seinfeld", "The Simpsons");
$text = wddx_serialize_vars($favorite_tv_shows);
$favorite_tv_shows_again = wddx_deserialize ($text);

foeeach ($favorite_tv_shows_again as $show) {
print "$shown<br>n";
}

?>

kaynak: ordan burdan

MySQL veritabani tablolarinda kullanilan bir tablo alaninin
AUTO_INCREMENT olarak tanimlanmasi sonucu her satirdaki verinin kolayca
indexlenebildigi (MySQL Primary olarak tanimalanan alani ayni
zamanda indexler.) birbirinden essiz olarak ayrilabildigi alanlari tutup
da verilerinizi web uzerinde gosterirken numaralandirmak icin kullanmayiniz.

Unutmayin tablodaki her alan PRIMARY (birincil anahtar) olarak
tanimlanabildigi gibi bu tablo alanlarinin birlesimi olarak da PRIMARY
tanimlanabilir.Sonucta bir veriyi sildiginizde artik o alana ayrilmis olan
sayisal deger tabloda bir asimetriklik yaratir.Ornegin verileriniz 1,2,3,4,5…
olarak siralaniyor ise dogal olarak siz 4 degerine sahip veriyi sildiginizde
artik bu sayisal siralama da bozulur.

Bu durumda direkt olarak bu alandan aldiginiz verileri,asagidan yukari dogru
siralama yaparken sayfasinda index olarak kullanirsaniz,sonucta ilk
baslarda basarili olsaniz dahi sonradan yeni veriler eklendiginde veya
silindiginde sizde bu isten zararli cikarsiniz…

Bu ornegimizde sizlere bir dongu icinde verilerinizi nasil kolayca
numaralandirabileceginizi gosterecegiz.Boylece veritabanindaki bir alani alip
gostermek yerine dongu sayacini siralama araci olarak kullanacagiz.

Veritabani tablosundaki 1,2,3,4,5,7,9, gibi degerler artik bizim icin herhangi
bir sorun teskil etmeyecek.Hem zaten o alanlar verileri kullaniciya gosterirken
siralama araci olarak degil,verileri tanimlamak icin birer essiz anahtar olmasi
amaciyla kullaniliyorlar…

Simdi elimizde bir veritabani tablosu var bizde bu tablodan yapilan arama
sonuclarini ekranda listeleyecegiz.Bu listeleme ornegin 8 kayit arama sonucunda
bulunmus ise 1 den 8'e kadar yapilacak.Ornegimizde bir kitapcidaki veritabaninda
ornegin degisik kategorilerdeki kitaplari verdigimiz anahtar kelimelerle
aradigimizi dusunelim.Kullanici bir cek-birak menuden kategoriyi seciyor
altindaki kucuk arama kutusuna ise istedigi anahtar kelimeyi yaziyor.

Simdi bu arama sayfasini gormek icin asagidaki linke tiklayiniz :

http://www.turk-.com/ornekler/mysql/kitap_ara.

Evet bu basit sayfayi gordugunuze gore simdi bu sayfadan alinan verilerin MySQL
veritabaninda, kullanilarak nasil uygulandigina bakalim.Hersey belirli bir
sira ile normal sekilde gerceklestiriliyor.Tek fark ciktisi alinirken
buldugumuz arama sonucuna gore tum kayitlari 1 den baslayarak numaralandirarak
listeliyoruz…

Sozu fazla uzatmadan koda gecelim :

<>
<head>
<title>Arama Sonuclari</title>
<body>
<h1> .::: Arama Sonuclari :::.</h1>
<?
trim ($aranan_kelime); //Kelimenin saginda solundaki beyaz bosluklari sil

if (!$aranan_kategori || !$aranan_kelime)
{
echo "Arama ile ilgili tum detaylari girmediniz";
exit;
}

$aranan_kelime = addslashes($aranan_kelime); //Gerekli olan yerlere slash ekle
$aranan_kategori = addslashes($aranan_kategori);

$db = mysql_pconnect("localhost","turkphp_user","*******");
if (!$db)
{
echo "Veritabani ile ilgili bir problem var";
exit;
}

mysql_select_db("turkphp_veritabani");

$sorgu = "SELECT * FROM kitaplar";
$sorgu .= " WHERE ". $aranan_kategori ." LIKE '%". $aranan_kelime ."%'";

$sonuc = mysql_query ($sorgu);

$sonuc_sayisi = mysql_num_rows($sonuc);

echo "<p>Bulunan Sonuc Sayisi : ". $sonuc_sayisi ."</p>";

for ($i=0; $i<$sonuc_sayisi;$i++)
{
$satir = mysql_fetch_array($sonuc);
echo "<p><strong>". ($i+1) ."Baslik:";
echo htmlspecialchars(stripslashes($satir["baslik"]));

echo "</strong><br>Yazar:";
echo htmlspecialchars(stripslashes($satir["yazar"]));

echo "<br>ISBN:";
echo htmlspecialchars(stripslashes($satir["isbn"]));

echo "<br>Fiyat:";
echo htmlspecialchars(stripslashes($satir["fiyat"]));
echo "</p>";

}
?>
</body>
</>

kaynak: ordan burdan

Bir diziyi kendi belirlediginiz kurala gore siralamak istiyorsunuz.Buna sebep 'nin hazir siralama fonksiyonlarinin yetersizligi olabilir.

Cozum : usort () fonksiyonu, kullanici tanimli bir fonksiyona gore bir diziyi siralayabilir.

Ornek :

<?
function borcu_sirala ($a,$b)
{

if ($a[1]==$b[1]) return 0;
return ($b[1] > $a[1]) ? 1 : -1;

}

/*
Diyelim ki her gun poker oyunu oynadiginiz arkadaslarinizin size olan borcunu bir dizide
sakliyorsunuz bu diziyi en buyuk borctan en kucuge dogru siralamak istiyorsunuz.
*/

$poker_borclari = array(array("Oktay",31),array("Tayfun",),array("Kris",18));

usort ($poker_borclari,'borcu_sirala');

foreach ($poker_borclari as $borclar) {

print $borclar[0]." isimli kisinin bana olan borcu :".$borclar[1];
print "<br>";

}
?>

Aciklama : usort () fonksiyonu argument olarak bir dizi kullanici tanimli bir fonksiyonun ismini alir.Ilk argumentte aldigi diziyi,ikinci argumentte yer alan fonksiyona gore siralar.Bu kullanici tanimli fonksiyon mutlaka "-1,0 veya 1" sonuclarindan birini dondurmelidir.

kaynak: ordan burdan

Ayni bir dosyadan satir satir veri okur gibi bir klasorun icindeki butun dosyalari da ayni mantikla sira ile isleyebilirsiniz.Bunu yapmak icin iki yol var.Birincisi nesne yonelimli bir kod ile nesne arayuzunu kullanmak,digeri 'nin hazir fonksiyonlari ile sonuca gitmek :

<?
$klasor_ismi = "C:\nusphere\apache\nsdocs\ornek_klasor";
$dh = dir ($klasor_ismi);
while ($entry = $dh->read()) {

print $entry ."
";
print "<br>";

}
$dh->close ();
?>

Simdi de diger cozum :

<?
$klasor_ismi = "C:\nusphere\apache\nsdocs\ornek_klasor";
$dh = opendir($klasor_ismi);
while ($entry = readdir ($dh)) {

print $entry . "
";
print "<br>";

}
closedir($dh);
?>

kaynak: ordan burdan

Islem basamaklarini yazarsak kisaca :

1- Resmi veritabanina (resimekle.)

2- Resmi secme (resimgoster.)

3- Resmi ekranda gösterme (resimgetir.)

1- Öncelikle resmi veritabanindan okuma islemleri için kisa bir seyler yazayim,
resimlerimizi asagida belirtilmis vt içinde saklayacacagimiz, verilmis vt
yapisina bakarsak çogu sey tanidik, belki longblob için biraz bilgi edinmek
lazim, blob(binary-large-object) çesitli bilgi çesitlerini tutabilen bir
tiptir. Deger olarak maximum 4294967295 (2^32 - 1) karakterdir. Blob'da da
Varchar'da oldugu gibi bir degisken kendisine atanan kisimda, girilen bilgi
kadar yer tutar. Yani 10 karakterlik bir tanimlama yapilip eger 4
karakterlik bir bilgi girilirse toplam alan 5 olacak(1 byte string ifade
uzunlugunu tutar). Blob'ta da benzer bir mantik vardir. Evet bu kadar bilgi
yeter.

"turkphp_veritabani" veritabani içindeki "" isimli tablonun yapisi :

id int,auto_increment,primary
aciklama varchar (50)
dosyaadi varchar(50)
boyut varchar(50)
resimdata longblob
dosyatip varchar(10)

Tablo icin SQL semasi :

CREATE TABLE (
id MEDIUMINT(5) DEFAULT '0' NOT NULL AUTO_INCREMENT,
aciklama VARCHAR(50),
dosyaadi VARCHAR(50),
boyut MEDIUMINT(8),
resimdata LONGBLOB,
dosyatip VARCHAR(10),
PRIMARY (id)
);

Ilk önce yapacagimiz dosyalari makineden vt'ye aktarmak ,asagidaki
yardimi ile yerel makineden seçilen bir dosyayi bir açiklama ile beraber
vt'ye kaydediyoruz. islemi ardindan her bir dosya için
mysql_insert_id komutu ile bir id numarasi saglaniyor resimlere.(Bu
komut, AUTO_INCREMENT kolon için sorgu sonrasi bir ID üretir.)

Burada birde içindeki birkaç olaydan kisaca söz etmek
isterim,biliniyordur ama ben yinede söyleyeyim ki yazacak bir seyler olsun :
)
içinde gelen bilginin tür olarak(enctype) multipart/-data seçilmis,
gizli parametre olarak dosya boyutu 2400000 byte olarak belirtilmis, daha
yukarisi dosyalar için ben bölümlemenizi ederim, dosya çekme islemi
içinde <input type ="file" > tip olarak file seçildi. Böylece dosyayi "gözat "
butonu ile seçip form_data degiskenine aktarmis oluyoruz.

Resimekle.

<?
if ($submit)
{
mysql_connect("localhost","turk_user","******");
mysql_select_db("turkphp_veritabani");
$data = addslashes(fread(fopen($form_data, "rb"),filesize($form_data)));
$sonuc=mysql_query("INSERT INTO
(id,aciklama,dosyaadi,boyut,resimdata,dosyatip) ".
"VALUES
('null','$form_aciklama','$form_data_name','$form_data_size','$data','$form_data_type')");
$id= mysql_insert_id(); // ID verildi.
print "<p>Database ID No: $id";
mysql_close();
echo "<BR>n";
echo "<a href="http://www.turk-.com/ornekler/mysql/resimgoster.">Yuklediginiz resme bakabilir veya bilgisayariniza indirebilirsiniz…</a>";
echo "<BR>n";
echo "<a href="http://www.turk-.com/">Anasayfaya donebilirsiniz….</a>";
}
else
{
print "<a href="$PHP_SELF">Ana Sayfa</a>";
?>
< method="post" action="<? echo $PHP_SELF; ?>"
enctype="multipart/-data">
Saklanacak dosya için aç&yacute;klama:

<input type="text" name="form_aciklama" value="Yorum Yapilmamis…" size="40">
<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="10000">
<br> Database gonderilecek dosyayi secin: <input type="file"
name="form_data" size="40">
<br>
<BR>NOT : Bu demoda maximum dosya boyutu "10000" byte olarak ayarlanmistir… <BR>
<input type="submit" name="submit" value="Veritabanina EKLE">
</>
<?
}
?>

2- Simdide ekledigimiz resmi gösterelim. Vt içindeki tüm resimleri göstermek
veya belli bir resmi seçmek için çesitli yöntemler kullanabiliriz.Bir
yardimi ile dosyaadi veya id degiskenlerini kullanabiliriz. Basitçe id si
veya dosyaadi girilen degisken vt'den sorgu ile çagrilip. Bir nesne olarak
fetch ediliyor,burada istenirse degerler array olarak da çekilebilir, bir
fark yok sanirim ama sadece kullanim farki var. (Array kullanimi : echo
$sira["dosyaadi"] , nesne kullanimi: echo $sira->dosyaadi (pointer gibi))
Burada resimleri localhost/resimgoster.?id=2 seklinde id parametresini
göndererek resmi çagiriyoruz, eger kisi herhangi bir id yazmamissa tüm
resimleri gösteriyor.

Formu hazirlayalim…iste hazir asagida : )

resimgoster.

<?
$i=0;
mysql_connect("localhost","turk_user","******") or die("server baglantisi
olmadi");
@mysql_select_db("turkphp_veritabani") or die("Veritaban&yacute; seçilemedi");
//e&eth;er id k&yacute;sm&yacute;nda bir de&eth;er yoksa tüm resimleri göster
if ($id==0 || $id==" ")
{
$sonuc=mysql_query("SELECT * FROM ");
while($sira=mysql_fetch_object($sonuc))
{
$i++;
// burada resimgetir dosyas&yacute;na id ile ekrana ç&yacute;kart&yacute;l&yacute;yor,dosyaadi
// aç&yacute;klama ile beraber.
echo "<a href="resimgetir.?id=$sira->id"><IMG SRC="resimgetir.?id=$sira->id"></IMG></a>";
echo "tt";
echo "Dosya adi : " . $sira->dosyaadi . "";
echo "tt";
echo "Dosya açiklamasi: ". $sira->aciklama . "";
echo "<BR>n";
}
echo "Toplam dosya sayisi:$i";
echo "<BR>";
exit();
}
//eger id kisminda bir deger varsa sadece olani göster
$sonuc=mysql_query("SELECT * FROM where id='$id' ") or die("Sorgu
calismadi");
if ($sonuc==NULL)
{
echo "Böyle bir yok..";
exit();
}
$sira=mysql_fetch_object($sonuc);
echo "<IMG SRC="resimgetir.?id=$sira->id">";
?>

3- Bunlar&yacute;n ardindan gelelim en önemli kisma :) (finali en son yapalim
dedim). Burada hazirlayacagimiz dosya ile resimgoster'den gelen id'yi (tabi
bir id gelmi&thorn;se) kullanarak vt'den uygun olan resmi, eger id gelmemisse tüm
resimleri gösterecek. Burada önemli nokta gösterilecek veri bir oldugu
için content-type için image/gif veya iamge/pjpeg seçilecek (ama herhangi
bir tanesi için çalisiyor :) )
resimgetir.

<?
Header("Content-type: Image/gif");// veya image/pjpeg
mysql_connect("localhost","turk_user","*******") or die("server baglantisi
olmadi");
@mysql_select_db("turkphp_veritabani") or die("Veritabani Secilemedi");
$sonuc=mysql_query("SELECT * FROM WHERE id='$id' ") or die("Sorgu
çalistirilamadi");
$sira=mysql_fetch_object($sonuc);
echo $sira->resimdata;
?>

Bu olayi daha gelistirebiliriz. Örnegin resimleri bir combobox içine alip
oradanda seçildigi anda (onchange olayi) resmi göstermek gibi.Örnegin;

< method="post" action="resimgetir1." name="gonder" >
<SELECT name="id" onchange="submit()">
<?
While($row=mysql_fetch_object($result))
{
?>
<option> <?echo $row->dosyaadi?></option>
<?
}
?>
</SELECT>
<INPUT TYPE="SUBMIT" name="gonder" value="GONDER">
</>

kaynak: ordan burdan

"@" isaretleri olasi mesajlarinin ekrana yazilmasini onlemek için kullanılır

@OCIExecute($iSorguIfadesi, OCI_COMMIT_ON_SUCCESS);

gibi

kaynak: ordan burdan

OCILogon ()

Veritabani ile iletisime gecer baglantiyi kurar.Bu baglanti referans gosterilerek diger fonksiyonlarin calismasi saglanir.Bazi fonksiyonlarda boyle bir baglantinin halihazirda kurulu olmasi gerekliligi vardir.

OCIParse ()
Bu fonksiyon herhangi bir sorguyu,veritabani uzerinde uygulanmadan once hazirlamak icin kullanilir.

OCIBindByName ()
OCIParse () ile kullanilarak,kullanici tanimli data'nin sorgunun bir parcasi olmasi saglanir.Bir baglac olarak dusunulebilir…

OCIExecute ()
Hazirlanmis bir sorguyu veritabaninda uygulamak icin kullanilir.

OCIError ()

Herhangi bir sorgumuzda olusan hatalarimizi bilgilendirmek icin kullanilir.

OCIFetchInto ()
Veritabanindan donen sonuclari donguye sokmak icin kullanilir.

OCICommit ()

Bu fonksiyon ile veritabaninda tum yaptigimiz islemlerin kalici olarak gerceklesmesi saglanir.Yaptiginiz tum degisiklikleri veritabanina kayit eder.

OCIRollback ()
Bu fonksiyon ile veritabani bir onceki haline dondurulur.

Veritabanina Baglanmak

Veritabanina baglanti yapabilmek icin OCILogon () fonksiyonu kullanilir.Bu fonksiyon toplam uc parametre alir :

kullaniciadi

sifre

veritabani

<?

$db = " (DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
(CONNECT_DATA = (SID = ORCL))
)";

$iDBConn = OCILogon("scott","tiger",$db);

?>

NOT : Yukaridaki kod icerisinde dort noktayi ozellikle kendinize gore ayarlamalisiniz :

"scott" yazan yere kendi kullanici adinizi yazin.

"tiger" yazan yere kendi sifrenizi yazin.

HOST = 127.0.0.1 (Veritabaninin uzerinde calistigi makinenin IP )

SID = ORCL (Baglanilacak olan veritabaninin SID degeri,yani Veritabani ismi…)

Bu dort degeri kendi kullaniciadiniz,sifreniz,IP adresiniz Veritabani isminiz ile degistiriniz.

Simdi yukaridaki bilgiler ile veritabanina baglanti yapacak kisimi yazabiliriz.

Bazen kullanicilar boyle bir kodun ardindan mesajlari alirlar.Buna en ORACLE_HOME cevre degiskeninin sistem genelinde tanimlanmamis olmasidir.Simdi asagidaki gibi bir kod ile bu degiskenin yaratilip tum sistem programlari tarafindan (elbette 'de buna dahil) kullanilmasini saglayabilirsiniz.

<?

putenv("ORACLE_HOME=/usr/local/oracle/product/8.1.7");

?>

Tabii ki yukaridaki yolu kendi sisteminize gore oracle'i hanig klasore kurduysaniz onu girmelisiniz…

Tabloya yeni bir kayit girilmesi

Simdi de "calisanlar" tablosuna yeni kayit eklemeye calisalim :

<?
//
// Calisanlar tablosuna eklenecek veriler…
//

$strAdi = 'Serkan Hadi';

$strSoyadi = 'CEYLANI';

$strTelefon = '813.222.22.22';

$strEposta = 'serkan@turk-.com';

?>

Verileri tamamladigimiza gore bu veriyi alip veritabanina ekleyecek sorguyu olusturabiliriz :

<?

//
// Sorguyu hazirliyoruz…
//

$qsvCalisanEkle = "

INSERT INTO calisanlar
(calisan_id_no,adi_tx,sadi_tx,
telefon_tx,eposta_tx,guncel_dt,yaratma_dt)
VALUES (calisan_id_no.nextval,:adi_tx, :sadi_tx, :telefon_tx, :eposta_tx, SYSDATE, SYSDATE)";
?>

Yukarida gorulen kod icerisinde size yabanci gelebilecek tek nokta VALUES icinde kulanilan ":adi_tx" turundeki programlamadir.Burada yapilan aslinda cok basit bir referans verme islemidir.Daha onceden veriyi isleyip ardindan da burada ":adi_tx" gecen yere ornegin yerlestirilmesini saglayacagiz.(Bu konuya yazinin ilerleyen kesimlerinde deginecegiz.Simdilik ne oldugunu kafanizda canlandirmakla yetinin…Ingilizcede bu notasyona yapilan isleme "placeholder" denilmektedir.Oraya gelecek kullanici-tanimli veriyi isledikten sonra oraya yazmak icin kullanilmaktadir.)

calisan_id_no.nextval notasyonu ile tabloda o alanda kayitli degerden sonra (SEQUENCE komutunda belirtilen arttirma sayisi kadar yani INCREMENT BY olarak verilen deger kadar) gelecek deger yaziliyor.

SYSDATE ile alanina sistem tarihi yaziliyor.Burada herhangi bir "placeholder" kullanmadim cunku oraya yazilan veri direkt sistemden geliyor benim bir kontrol yapmama bu nedenle gerek yok.

Sorguyu tamamladigimiza gore OCIParse () fonksiyonu ile "uygulama islemine hazirlanmasini" saglayabiliriz :

<?

$iSorguIfadesi = @OCIParse($iDBConn, $qsvCalisanEkle);

?>

OCIParse () fonksiyonu bir "sorgu tanimlayicisi" yani ingilizcesi "statement identifier" olarak ifade edilen bir sonuc dondurur.Biz bu sonucu asagidaki gibi inceleyip sorgunun veritabani uzerinde uygulanmasina veya OCIRollback () fonksiyonu ile veritabaninin ilk haline dondurulmesine verebiliriz.Kisaca anlatilmak istenen, sorgunun icinde bir olup olmadigini sorgu ile ilgili veritabanindan donen sonucu asagidaki gibi irdeleyebiliyoruz :

<?

//
// SQL Ifadesi gecerli mi?
//

$arrError = OCIError($iSorguIfadesi);

if ($arrError['code'])

{
print $arrError['message'];

OCIRollback($iDBConn);

exit;
}

?>

ONEMLI : Burada deginilmesi gereken en onemli nokta OCIRollback () fonksiyonu ile veritabani ilk haline getirilse de INCREMENT BY ifadesi ile olarak arttirilan tablo alanina sorgu sirasinda atanan deger asla geriye donderilmez.Yani tabloda o alanda 3 degeri varken sizin sorgunuzdan sonra o alana olarak 4 atanmis ise OCIRollback () ile geriye dondugunuzde o alan icin tekrar sorgulama yaparsaniz bu sefer size ornegin 5 degerinin atandigini goreceksiniz…

Simdi referans olarak verdigimiz alanlara gelecek verileri olusturalim.Bu islemi OCIBindByName () fonksiyonu ile yapiyoruz :

<?

//
//Referans olarak verilen yerler icin verileri olustur.
//

@OCIBindByName($iSorguIfadesi, ':calisan_id_no', &$iCalisanNo, 4);

@OCIBindByName($iSorguIfadesi, ':adi_tx', &$strAdi, 64);

@OCIBindByName($iSorguIfadesi, ':sadi_tx', &$strSoyadi, 64);

@OCIBindByName($iSorguIfadesi, ':telefon_tx', &$strTelefon, 14);

@OCIBindByName($iSorguIfadesi, ':eposta_tx', &$strEposta, 255);

?>

Burada iki onemli noktaya deginilmesi gerekiyor.Birincisi bu yontem ile fazladan addslashes () kullanimina gerek kalmiyor (verinin icindeki tirnak isaretleri benzeri zararli datayi elimine etmek icin kullanilan fonksiyon), ikincisi ise eger islenen veri "bos" degere sahipse onu NULL olarak veritabanina yazabilmesidir…

En son olarak OCIExecute () fonksiyonu ile sorgunun veritabani uzerinde uygulanmasini sagliyoruz.(Tabii ki yukarida gorulen sekilde butun degiskenler referans edildikleri yere baglandiktan sonra)

Fonksiyonun kullaniminda onemli olan nokta OCI_DEFAULT parametresi ile Oracle'a auto-commit,yani sorgu basarili sekilde uygulanirsa olarak degisiklikleri kaydetmesi ozelliginin kapatilmasinin soylenmesidir.Her ne kadar yararli gibi gorunsede bazen coklu tablolar uzerinde yapilan UPDATE islemlerinde bu ozelligin kapatilmasi verinin zarar gormesini onleyecektir.Eger sorgu basarili sekilde uygulanirsa OCICommit () fonksiyonunu cagirarak sorgunun sonuclarinin veritabani uzerinde kayit edilmesini saglayabilecegiz…

<?

//
// Sorguyu veritabani uzerinde uygula….
//

@OCIExecute($iSorguIfadesi, OCI_DEFAULT);

// olusmadigindan emin olalim…

$arrError = OCIError($iSorguIfadesi);

if ($arrError['code'])
{

print $arrError['message'];

OCIRollback($iDBConn);

exit;

}

OCICommit($iDBConn);

?>

Veritabanindan Verileri Dondurup Formatinda Goruntulemek

Yukarida anlatilan sekilde oldugu gibi veritabanindan veri dondururkende ayni siralama izlenir.Once sorgu hazirlanir,ardindan bu sorgu denetlenir,eger bulunmaz ise veritabani uzerinde uygulanir,uygulama islemi sorunsuz olarak tamamlanirsa degisiklikler veritabanina kayit edilir…

SELECT sorgularinin yapisi geregi herhangi bir sekilde veritabanindaki veri bir sekilde degisiklikge ugramaz.Yanlizca veri istenilen sekil format istegi yapan cihaz, vb. araclara dondurulur.

Boylece yukarida anlatilan adimlardan OCIBindByName (), OCIRollback (), OCICommit () fonksiyonlarinin kullanildigi bolumlerin uygulanmasina gerek kalmaz.

<?
//
// Veriyi dondurmek icin sorguyu hazirlayalim…
//

$qsvCalisanGoruntule = "

SELECT calisan_id_no,
adi_tx,
sadi_tx,
telefon_tx,
eposta_tx,
FROM calisanlar
ORDER BY sadi_tx ASC,
adi_tx ASC ";

$iSorguIfadesi = @OCIParse($iDBConn, $qsvCalisanGoruntule);

@OCIExecute($iSorguIfadesi, OCI_COMMIT_ON_SUCCESS);

//
//Sorguyu kontrol et
//

$arrError = OCIError($iSorguIfadesi);

if ($arrError['code'])
{

print $arrError['message'];

exit;

}

?>

<table border="1" width="600">
<tr>

<td>ID</td>
<td>SOYADI</td>
<td>EPOSTA</td>
<td></td>

</tr>

<?

//
//Kayitlarimizi bir dongu icerisine sokup her satirda
// bir tane olacak sekilde gosterelim.
//OCI_ASSOC ile OCIFetchInto ile donen degerlerin,dizi icerisinde tablonun alan adi ile //anahtarlanmasini istiyoruz.Normalde index kullanilarak sonuclar dondurulur.
//

while (OCIFetchInto($iSorguIfadesi, &$arrCalisan, OCI_ASSOC))
{
?>

<tr>

<td><?= $arrCalisan['CALISAN_ID_NO'] ?></td>
<td><?= $arrCalisan['ADI_TX'] ?></td>
<td><?= $arrCalisan['SADI_TX'] ?></td>
<td><a href="mailto:<?= $arrCalisan['EPOSTA_TX'] ?>">
<?= $arrCalisan['EPOSTA_TX'] ?></a></td>
<td><?= $arrCalisan['TELEFON_TX'] ?></td>

</tr>

<? } ?>
</table>
</body>
</>

Evet buraya kadar olan tum aciklamalarimizda ORACLE veritabani icin tablonun yaratilmasi,verinin eklenmesi bu eklenen verinin web uzerinden goruntulenmesini inceledik…Yukaridaki mantik kod yapisi ile UPDATE,DELETE gibi sorgulari veritabaninda uyuglamak co zor olmayacaktir.

Bu makalenin size yararli olmasini dilerim…

Kontrat

Bu islemlerin cok uzun oldugunu birisinin sizin icin gerceklestirmesini istiyorsaniz, uygun fiyatlarla tum veritabani problemlerinize cozum satin alabilirsiniz.Iletisime gecemekten cekinmeyiniz…

Iletisim : serkan@turk-.com

Ornek Dosyalar

http://www.turk-.com/ornekler/ora_kayitekle.phps

http://www.turk-.com/ornekler/ora_kayitgoster.phps

NOT1 : Programin icerisinde kullanilan "@" isaretleri olasi mesajlarinin ekrana yazilmasini onlemek icin kullanilmistir.
NOT2 : Kendi programlarinizda kullanidiginiz "kullaniciadi" "sifre" degerlerini ayri bir dosyada saklayip,o turdeki dosyalarin kullaniciya goruntulenmesini engelleyerek guvenligi arttirabilirsiniz…

kaynak: ordan burdan

ini_set("display_errors", 0);

kaynak: ordan burdan

<?
// son_guncellenme_tarihi.
// . uzantılı sayfanızın herhangi bir yerine ekleyebilirsiniz

echo "Son güncelleme:<br>n";
$last_modified = filemtime("$PHP_SELF");
print(date("d.m.Y G:i", $last_modified));
?>

kaynak: ordan burdan

<?
if (empty($ara)){ // doldurulmadıysa veya sayfaya ilk girilişse formu göster
$denetim = TRUE;?>
< action="<?=$PHP_SELF?>" method="post">
Aranacak Kelime: <input type=text name= ara>
<input type=submit value=ara>
</>
<?}
else
{
$klasor = "$DOCUMENT_ROOT"; //web sunucusunun ana dizini klasor değişkenine geçiriyoruz
$dir= opendir($klasor);
while (($klasorler = readdir($dir)) !== false){ //while döngüsüyle ana dizin içindeki bütün klasörler dizin değişkenine geçiriliyor
if (is_dir($klasorler)){
$dizin = $klasorler;
}

$dizinac = opendir($dizin);
$i=0;
while ($dosya = readdir ( $dizinac)){
if (stristr($dosya, ".") or stristr($dosya,".")){ //aranacak olan dosya uzantıları
$ac[$i]=$dizin."/".$dosya;
$oku[$i]= get_meta_tags ("$ac[$i]",1); //ana dizin içindeki klasörlerde bulunan dosyalarının keyword meta tagı alınıyor

if (@eregi ($ara, $oku[$i][keywords])){ //tarama işlemi gerçekleştiriliyor eregi komutuyla aranan kelimenin keyword metataglarının içinde olup olmadığı bulunuyor
echo "<li><a href="$dizin/$dosya">$dosya</a></li><br>"; //eğer bulunursa burada gösteriliyor
$denetim = TRUE; //denetim değişkeni dosyanın bulunduğunu belirtiyor eğer dosya bulunmazsa böyle bir değişken atanmıyor

}

$i++;
}
}

}

}
if(!isset($denetim)){
print "Dosya yok"; //dosya bulunmadığında denetim değişkeni boş olacağından ekrana dosya yok yazısı çıkartılıyor
}

?>

Scriptin açıklaması:
$DOCUMENT_ROOT
Bu değişken web serverınızın ana dizinini verecektir.

is_dir
Belirilen arguman klasörse 1 dosyaysa 0 değerini döndürür.

get_meta_tags
Belirtilen dosyanın metataglarını dizi değişkenine yükler.Örneğin:
dosya. dosyasının içine
<meta name="keywords" CONTENT="anahtar kelimeler">
<meta name="description" CONTENT="açıklamalar">
<meta name="author" CONTENT="Yazar">
satırlarını ekleyin.
metatag. dosyasına da bunları:
<?
$degisken = get_meta_tags("dosya.",1);
echo $degisken[keywords];
echo $degisken[description];
echo $degisken[author];
?>

stristr:
Bir metin değişkenin içinde belirtilen başka bir metnin bulunup bulunmadığını göndürür.Kullanımı:

eregi:
Metin içinde arama yapmak için kullanılır

kaynak: ordan burdan

ucwords($degisken);

Degerdeki alfabe karakteriyle başlayan her sözcüğün ilk karakteri büyük olur

kaynak: ordan burdan

ucfirst($degisken);

$degisken e atanmış degerin ilk harfi büyük olur

kaynak: ordan burdan

strtolower($degisken);

$degisken e atanmış degerdeki bütün harfler küçük olur

kaynak: ordan burdan

Yazi Degerlerinin büyük-küçük harf durumunu değiştirmek ise çok basittir:

strtoupper($degisken)

$degisken e atanmış degerdeki bütün harfler büyük olur.

kaynak: ordan burdan

Bu fonksiyon da çok ilginç bir fonksiyondur görevi şudur : Bir stringin içindeki tüm yeni satırları <BR> etiketiyle değiştirir. Bu uzun bir stringi browser da görüntülemekte faydalı olabilir.

echo nl2br($mailkonu);

kaynak: ordan burdan

ltrim() chop() da trim() e benzer; üçünün arasındaki fark ise şudur :

trim() bir stringin başında sonundaki tüm saydığımız boşlukları siler.

ltrim() sadece başlangıctaki beyaz boşlukları atar.

chop() sadece sondaki boşlukları atar.

kaynak: ordan burdan

<?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 ;) 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 $; // sayısı

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-> = 0;

}

/**

* için kullanılacak XML dosyasını belirleyen metod.

*

* @param $file Dosya adı

*/

function setFile($file) {

$this->file = $file;

}

/**

* Bu metod '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 şı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 '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 şılaştığı etiket ismi

*/

function endElementHandler($parser, $name)

{

// Hafızadaki etiket ismini temizle.

$this->tag = "";

// Eğer etiket adı ITEM ise sayacını bir arttır.

if ($name == "ITEM")

{

$this->++;

}

}

/**

* Bu metod '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ış 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->][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->][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 mladığımız metodların XML parser tarafından kullanılması için 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 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 ismi

*/

function getByName($name) {

foreach ($this->itemData as $item) {

// Eğer verilen isim ile ismi tutuyor ise kayda ait veriyi döndür.

if ($name == $item[0]) return $item[1];

}

// Eğer bu satıra erişilmiş ise 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 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 var ise verisini döndür.

return $this->itemData[$id][1];

} else {

// bulunamadı ise false döndür.

return false;

}

}

/**

* Konfigürasyon verileri içerisindeki herhangi bir kaydı güncellemek için

* ismine göre arama yaparak kullanabileceğimiz method.

*

* @param $name 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 ismi ile şuan geçerli ismi tutuyor ise

// döngüden çık, tutmuyor ise sayacı bir arttır.

if($name == $item[0]) break;

else $i++;

}

// Sayaç hala 0 ise 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 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 id'si

* @param $data Kayıda ait yeni veri

*/

function setById($id, $data) {

// Verilen id'de bir var mı kontrol et.

if(isset($this->itemData[$id])) {

// var ise verisini güncelle.

$this->itemData[$id][1] = $data;

return true;

} else {

// yok ise false döndür.

return false;

}

}

/**

* Yeni bir konfigürasyon kaydı ekler.

*

* @param $name adı

* @param $data Kayıda ait veri

*/

function addField($name, $data) {

// Şuandaki sayısına göre yeni bir elemanı itemData

// arrayine ekle.

$this->itemData[$this->][0] .= $name;

$this->itemData[$this->][1] .= $data;

// sayacını arttır.

$this->++;

}

/**

* Mevcut 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 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 bir hal aldığını anlamak için 'nin var_dump() fonksiyonundan yararlanabiliriz.

array(4) {

[0]=>

array(2) {

[0]=>

string() "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'ı kullanacağız ? Aşağıdaki örnek kodu inceleyelim:

<?

// Öncelikle class'ımızı include edelim.

require_once('confmanager.');

// 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ı kullanacağız ona bir bakalım…

<?

// Öncelikle class'ımızı include edelim.

require_once('confmanager.');

// 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 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 içerisindeki password verisini değiştirelim

$conf->setByName('password', md5('yenisifre'));

// Hatta yeni bir 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ı 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 olabilecek hatalarını gidermek size kalmış.

kaynak: ordan burdan

Bir dizinin belirli bir kisiminin kesilip alinmasi (Array Slice)

Bir dizinin sizin belirlediginiz bir bolumunu cikarip almak icin array_slice ()
fonksiyonu kullanilir.Bu fonksiyon daha cok duz karekter icerige sahip normal degiskenler
(string veri tipindeki degiskenler) icin kullanilan substr () fonksiyonun
calismasina benzemektedir:

array_slice ($dizi_degisken,baslangic,uzunluk)

baslangic ile cikarilmak istenen dizi parcasinin baslangic indeksi degeri,

uzunluk ile baslangictan itibaren kac elementin cikarilacagi belirtilmektedir

<?

//Diziyi yaratalim,

$renkler = array("kirmizi","yesil","mavi","sari");

//Array_slice ile istedigimiz bir parcasini cikarip alalim

$renk_parcasi = array_slice($renkler,1,2)

//Dizilerimizin son sekilleri,

$renkler = array("kirmizi","yesil","mavi","sari");

$renk_parcasi = array("yesil","mavi");

?>

kaynak: ordan burdan

Uzunlugunu daha onceden sizin belirlediginiz sekilde diziler yaratmak icin (sizin
girmediginiz degerler bos elemetler olarak kalirlar) array_pad () fonksiyonu
kullanilir

<?

//Diziyi yaratalim

$ogrenciler = array ();

// 4 tane Null (Bos) element iceren bir dizi haline getiriyoruz,

$ogrenciler = array_pad($ogrenciler,4,"");

?>

kaynak: ordan burdan

array_unshift () fonksiyonu ile dizinin en basina elementler eklenir

<?

// Dizimizin son sekli,

$tatli = array("tiramisu", " elmali kek", " cukulatali pasta", "visneli pasta");

//En basina tekrar cukulatali kek eklemek istiyorum,

array_unshift($tatli,"cukulatali kek");

// Dizinin son sekli,

$tatli = array("cukulatali kek", "tiramisu", " elmali kek", " cukulatali pasta", "visneli

pasta");

?>

kaynak: ordan burdan

Dizinin en basindan element silmek icin array_shift() fonksiyonu kullanilir

<?

// Diziyi yaratalim,

$tatli = array("cukulatali kek", "tiramisu", " elmali kek", " cukulatali pasta", "visneli

pasta");

//En basindaki cukulatali kek elementini yok edelim,

array_shift($tatli);

// Dizimizin son sekli,

$tatli = array("tiramisu", " elmali kek", " cukulatali pasta", "visneli pasta");

?>

kaynak: ordan burdan

Dizinin en sonundan bir element silmek icin array_pop () fonksiyonu kullanilir

<?

// Dizimiz bu sekilde olsun,

$tatli = array("cukulatali kek", "tiramisu", " elmali kek", " cukulatali pasta", "visneli

pasta","dondurma");

//En sonundaki dondurma elementini silelim,

array_pop($tatli);

// Dizimizin son sekli,

$tatli = array("cukulatali kek", "tiramisu", " elmali kek", " cukulatali pasta", "visneli pasta");

?>

kaynak: ordan burdan