Şekil URL'ler yapmak

3 Eylül Pazar ´06
url
Dikkat: Bu yazının yazılma tarihinin üzerinden en az 60 gün geçmiş. İçerisindeki bilgiler güncelliğini yitirmiş olabilir. Yorumları ve güncellemeleri göz önünde bulundurarak yazıyı takip ediniz.

Sebep?

Bizim için önemli olan ne? Hava atmak mı? Yoksa gerçekten de fark yaratmak mı? Buna karar verdikten sonraki adım sizler için gerçekten de "belirleyici" olacaktır.

Nasıl?

Genel olarak siteler GET methodu ile gelen değişenlerini php'de sunucu öntanımlı değişkenleri ile kolaylıkla alabilmekte. Fakat bu anlatacağım döküman size bu sitedeki url yapısını anlayabilmenizi ve istediğiniz gibi uygulayabilmenizi sağlayacaktır.
Sunucu öntanımlı değişkenleri arasında QUERY_STRING olduğunu biliyoruz. Bu değişken url çağrısındaki "?" (soru işaretinden) sonraki kısmı string olarak verir.

Yani :
http://www.domain.com/dosya.php?kategori=php&no=130
adresine göre QUERY_STRING, "kategori=php&no=130" olarak dönecektir.

Aslında normalde php'nin yaptığı şey bize bu string'i önce "&" işaretine göre parçalayıp ardından "=" işaretine göre parçalamak ve bir diziye ilk kısımları anahtar (key), ikinci kısımları da değer olarak $_GET dizisinde yayınlamak olmaktadır.

Şimdi stemizde url'lerimizde kullanmayacağımızı düşündüğümüz bir ayraç belirlememiz gerekiyor ("#" işareti hariç. Çünkü html'de sayfa içerisi çapa (anchor) olarak tanımlanır ve bize QUERY_STRING ile dönmez). MFYZ.Com'da bu ayraç normaldeki ile aynı yani "&" işareti parametre ayracı olarak kullanılmaktadır (bknz : "mfyz.com/?forum&php").

Tabiki daha da ilgiç şeyler yapmak isteyebilirsiniz;
http://www.mfyz.com/?forum.php.5
http://www.mfyz.com/?forum~php~5
http://www.mfyz.com/?forum_php_5
http://www.mfyz.com/?forum/php/5
gibi şekillere sokmanız da mümkün. Değişen tek şey diziyi parçaladığınız ayraçtır..

Yavaş yavaş koda girelim :
$parametreler = $_SERVER["QUERY_STRING"];
ilk önce $parametreler değişkenine alalım bu kısmı. Ardından $parametreler değişkenini dizi olarak &'lere göre parçalayalım.
$parametreler = explode("&", $parametreler);
Şu anda $parametreler dizisinde ?'den sonra gelen tüm parametreler parçalanmış şekilde bulunuyor.
Ben sitemde modüler bir yapı izlediğim için, her sayfa aslında bir modül tarafından oluşturuluyor ve ben de alt parametrelerle modüllerin içindeki alt işlemleri uygulayabiliyorum.

Her modüle bir mantıksal sıra koyarak url'de parametrelerin sırasını belirli şeyler olarak algılatabilirim (ki öyle yapıyorum). Şimdi her sayfada modül adı şart olduğuna göre ?'den sonraki ilk parametreyi HER ZAMAN modül adı olarak alıyorum. Geri kalan kısımı da $parametreler adında bir dizi içinde saklıyorum.

Gelelim ilk elemanı nasıl alıp diğer kısmı dizide tutuyorum.
$modul = array_shift($parametreler);
Bu kod, daha doğrusu array_shift fonksiyonu bir dizinin başındaki elemanı atar ve o attığı elemanı döner. Yukarıdaki kullanım sayesinde, $parametreler dizisinin ilk elemanını hem atmış oluyorum hem de bu atılan elemanı $modul değişkeninde saklamış oluyorum.

Bundan sonra da modül işlemimi $modul değişkeni ile yapıyor, modüller içerisindeki parametreleri de doğrudan $parametreler dizisi ile kullanabiliyorum.

Eğer modüler sistemi bu şekilde nasıl kullanacağınızı bilmiyorsanızhttp://www.mfyz.com/?/dokuman/52/ dökümanından öğrenebilirsiniz. Yapacağınız tek şey var, orada index.php?module=bilmemne şeklinde aldığınız ve direk _GET ile kullandığınız modul kontrolu ve çalıştırma mantığını buradaki değişken alımını yapıp uygulayacaksınız :-)


Hazırlayan : Mehmet Fatih YILDIZ

Yorumlar

8 Şubat Cuma ´08 19:22
Tesekkürler, güzel bir makale olmus.
29 Mart Cumartesi ´08 01:42
Güzel ve açıklayıcı, teşekkürler...
Üye Resmi merve aksu
7 Temmuz Pazartesi ´08 12:04
$parametreler = $_SERVER["QUERY_STRING"];
 $parametreler = explode("&", $parametreler);    
      $modul = array_shift($parametreler);
 
bu kodları hangi dosyaya kaydedicez anlayamadım.
.htaccess dosyası kullanmıcazmı??
biraz daha açık izah edebilirseniz sevinirimm
7 Temmuz Pazartesi ´08 12:37
.htaccess'a koymayacaksınız.

bu url ile index.php dosyası üzerinde tek dosyada çalışıyormuş gibi görüneceksiniz. Dolayısıyla index.php'de kullanacaksınız. Önce bu kodla örneğin & işaretine göre parametreleri ayıracak, sonra ilk parametrenin modül olduğunu kabul edersek buna göre gerekli modul dosyasını include edeceksiniz.
Üye Resmi omscelik
4 Kasım Salı ´08 14:02
çok güzel bir paylaşım.sagolun
Üye Resmi murat
19 Aralık Cuma ´08 05:07
Bu aydınlatıcı yazınız için tesekkür ederim. Benimde bir sorum olacak inş cevaplarsınız

http://www.domain.com/dosya.php?kategori=php&no=130

mesala Bu urldeki "kategori" yi get le cekiyoruz  

'&' bu karakterden sonraki  "no" yu da get le cekiyoruz  

peki Biz buna nasıl oluyorda  dosya.php de ulasıyoruz  yani anlatmak istedigim  
<a href"" >  seklinde linkler vererekmi
yani tam olarak ogrenmek istegim urlde birden fazla get degeri nasıl yapılıyor örnegimizdeki gibi  
http://www.domain.com/dosya.php?kategori=php&no=130

yardımlarınız için Tesekkür ederim    
Üye Resmi Sinan POSTACI
4 Ocak Pazar ´09 13:43
Sayın Murat,

Mesela veritabanımızdan haber çekelim. Veritabanında 3 tane kolonumuz varsayalım. id, baslik, kategori, haber.

Anlaşıldığı üzere;
id: primary key,
başlık,
kategori: haberi içeren kategori ( unique olmasını tavsiye ederim),
ve son olarak haber: içeriğimiz.

Haberi çekmek için haber.php?kategori=guncel&id=35
cat: kategori ve id haberimizin birincil anahtarı. Bunu anasayfada liste halinde göstermek için vt'den son verilerini çekiyorsun veya güncel kategorisinin linkine tıklanınca çektirmek istiyorsun.. şu şekilde yapıyoruz.

$sorgu = mysql_query("SELECT * FROM `haber` ORDER BY `id` desc LIMIT 10");
while( $haber = mysql_fetch_array( $sorgu) ){
     echo "<a href=\"haber.php?cat=$haber[cat]&id=$haber[id]\">$haber[baslik] </a>";
}
mysql_free_result($sorgu);

şeklinde bir kod basarsan index.php'de son 10 haberi göstermiş olursun. Mantık bu. Çok dolandırdım sanırım ama umuyorum anladın   :-)
Üye Resmi murat
9 Ocak Cuma ´09 16:27
Tesekkür ederim Sinan POSTACI Eline Diline yüregine saglık ....
Üye Resmi Sinan POSTACI
28 Ocak Çarşamba ´09 09:31
Rica ederim. İşinize yaradıysa çok sevinirim.   :-)
Üye Resmi Vehbi PEKPAK
26 Aralık Cumartesi ´09 11:57
Arkadaşlar.
Ben bu sistemi uyguladım ve gayette güzel çalışıyor.
Biliyosunuz 404 sayfalarıyla yapılmadığından google tarafından filan hiçbir sıkıntı yok tek dezavantajı linkte "?/" işaretinin ahengi zedelemesi ama oda göz ardı edilebilinir.

Benim sıkıntım şu;
Bir form'u post ettiğimizde işlemleri yapıyoruz (Post edilen sayfada) ama geri dönüşü sağlıyamadım. Malum php'de asp'ninki gibi "response.redirect()" yok.
Örnek vericek olursak: Gönder'e tıklıyoruz, veriler post ile islem.php sayfasına gidiyor orda işlendikten sonra tekrar formun olduğu sayfaya gelmesi gerekiyor ama bunu yapamadım.  
26 Aralık Cumartesi ´09 12:37
"Malum php'de asp'ninki gibi "response.redirect()" yok."
Niye olmasın, tabiki var.

header('Location: ./?/gidecek/url/');
header('Location:http://www.gidecek.url/');

veya javascript ile yönlendirme de yapabilirsin.
die('<script>window.top.location="http://www.gidecek.url/";</script>');
Üye Resmi Vehbi PEKPAK
27 Aralık Pazar ´09 12:39
Yanılmıyorsam ( Bu arada PHP'ye yeni başladım sayılır ) "header" kodu hata veriyordu; başına "ob_start()" bu kodu eklemezsen...

Yorum gönderme işleminide: eski yollardan yapmaktan vazgeçtim ve JQuery-AJAX ile yaptım. Şimdiki sıkıntım ise yorum gönderildikten sonra şu kodu uyguluyorum ( Kodun tamamından kesit );
success: function(sonuc){
setTimeout(window.location.reload(),0);
}
böyle bişey yapıyorum ve yorum anında ekleniyor(Ziyaretçi sayfayı kendisi yenilemeden).

Buna "gereksiz bir takıntı" diyebilirsiniz ama istediğim, yorum anında eklenirken sayfanın favicon yerinde (firefox,ie filan) "yükleniyor" simgesi çıkmaması.Ama kendimce şöyle bir sonuca vardım: eğer "window.location.reload()" kodu işleme girdiği anda İLLAki o yükleniyor simgesi çıkıyor. TEŞEKKÜRLER
27 Aralık Pazar ´09 14:46
header'ın kullanımı şöyledir :

php ekrana hiçbirşey basmadan bütün program işletilmeli sonra çıktı verilmelidir.
Siz çıktı içinde header fonksiyonu kullanırsanız client'a çıktının bir parçası gönderiliyorken giden meta'ları (headerları yani) düzenleyemeyeceğiniz için hata alırsınız. ob_start, yazdığınız betik tamamen işletilmeden çıktı verilmemesini daha doğrusu tamponlanmasını ifade eder. Böylece çıktı oluşurken header kullanabilirsiniz ve metaları oynayabilirsiniz.

Ama idealist olarak hiçbir server-side betik dilinde (asp, php, python farketmez) önce uygulama işletilmeli, tüm aksiyonlar tamamlanmalı, sonra çıktı verilmelidir.
Üye Resmi aslı yılmaz
7 Ekim Perşembe ´10 08:36
slm.bilgisayar kullanmaya yeni başladım ve kendi çabamla bişeyler yapmaya çalışıyorum.googleden araştırıken sizi buldum..banada yardımcı olursanız çok sevinecem..ben harf yada işaretlerden çizgilerden şekiller yapmak istiyorum..mesela kelebek resmi yapıp yada şekilli yazı yazıp facebook ta msn de kullanmak istiyorum..veya bunları kaydetip geekince kullanabilirmiyim? bunu nasıl ve hangi yolları takip ederek yapacağım..acemiliğimi gözönünde bulundurarak açıklarsanız çok sevinirim..şimdiden teşekkür ederim.
7 Aralık Salı ´10 22:53
Teşekkürler Abi İlk Defa Senden Ögrendim.
Üye Resmi şafak saraçoğlu
7 Mayıs Cumartesi ´11 23:44
üstadım harika bilgi script projemde takıldığım konuydu çok sağolasın
11 Ağustos Perşembe ´11 02:43
Eğer mfyz.com'daki gibi istiyorsanız, (yani /?/modul_adi şeklinde) bir adet daha array_shift ekleyebilirsiniz. Daha açıklayıcı olmak adına bir örnek vereyim:

$parametreler = $_SERVER["QUERY_STRING"];
$parametreler = explode("&", $parametreler);    
array_shift($parametreler); // burada soru işaretinden sonraki ilk slash'e kadar olan yer atılıyor.
$modul = array_shift($parametreler);
Üye Resmi ismet
17 Ocak Cumartesi ´15 15:19
hocam şu  uri mantığını anlayamdım gitti /kategori/nelervar.html
veya kategori/oyuncak/gemi
bunlar nasıl parçalanıyor sayfalanıyor anlayamadım gitti
Yeni Yorum *
İletişim Bilgileri
*
*
E-Posta adresiniz gösterilmeyecektir.
(unut)
Güvenlik Kodu *

Gönderiliyor