Uyarı: Bu yazı mysql kodlarını, tablo yapılarını ve admin panel ayarlamalarını barındırmaz.

Şu WordPress’teki gibi link ayarlamalarını nasıl yapabilirim tarzı birkaç soru geldi Msn’den. Ben de bunun üzerine kendi yazdığım ve bir iki projede kullandığım fonksiyonu paylaşayım dedim. Öncelikle mantıktan bahsedelim. Hani WordPress’te Kalıcı Bağlantılarla çeşitli desenler girerek sitemizin link yapısını ayarlayabiliyoruz ve oraya ne yazarsak yazalım sitemiz 404 hatası vermeden o yapıya geliyor (istisnaları mevcut ama neyse).

İşte ben de bunu nasıl yapacağımızdan bahsedeceğim daha doğrusu gelen link içinden istediğimiz verileri nasıl elde edeceğimizden bahsedeceğim. Öncelikle benim kurguladığım admin panelin ayarlar kısmındaki kodlar şöyle:
{%id%} : İçeriğin İdsi için kullanılacak kod
{%link%}: İçeriğin linki kullanılacak kod
Bu iki kodla script kullanıcısı linklere istediği şekli verebilecek. Şimdi gelelim bizim siteye gelen urlyi nasıl anlayacağımıza. Öncelikle bizim gelen tüm linkleri index.phpye yönlendiren bir .htaccess e ihtiyacımız var. Yalnız bir şartımız olacak o da eğer gelen link herhangi bir dosya veya klasör değilse yönlendirecek. Yoksa sitedeki tüm linkleri yönlendirirse karmaşa çıkar. Bunun için de WordPress’in klasik .htaccess’i yeterli.

# Kodlar yazılmamıştır direk WordPress'ten alınmıştır.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Bu aşamayı halledip gelen linkleri index.phpye yönlendirdikten sonra gelelim bu gelen linkin hangi idye veya hangi linke sahip olduğunu nasıl anlayacağımıza. Bunun için de

function linkbul($desen,$link)
{
    //http://www.ilyasbat.com.tr/php-admin-panelden-link-yapisini-belirleme
    if(strstr($desen,'{%id%}'))
    {
        //Desenimizde id var burada amaç eğer id varsa mysqlde id üzerinden sorgu yapmak ve performans kazancı sağlamak.
        $desen = str_replace(array('-','.','{%id%}','{%link%}'),
                             array('\-','\.','(.+[0-9])','.*'),
                             $desen);
        $desen = '"'.$desen.'"';
        //Desenimizi oluşturduk.Bakalım idmiz desenin neresinde ve gelen id kaç
        preg_match($desen,$link,$sonuc);
        $id   = $sonuc[1]; //Daha sonra buradaki sonucu mysql güvenlik fonksiyonunuzdan geçirmeyi unutmayın.
        $sart = "id=$id";
    }
    else
    {
         $desen = str_replace(array('-','.','{%link%}'),
                             array('\-','\.','(.*)'),
                             $desen);
         $desen = '"'.$desen.'"';
        //Desenimizi oluşturduk.Bakalım idmiz desenin neresinde ve gelen link ne
        preg_match($desen,$link,$sonuc);
        $link = $sonuc[1]; //Daha sonra buradaki sonucu mysql güvenlik fonksiyonunuzdan geçirmeyi unutmayın.
        $sart = "link='$link'";
    }
    return $sart;
}

Gelelim fonksiyonun çalışma mantığına. Gördüğünüz gibi fonksiyona iki parametre gidiyor:

  1. $desen
  2. $link

Bunlardan desen değişkeni script kullanıcısının admin panelden yazmış olduğu {%id%} li {%link%} li yapı. İkinci değişkenimiz link ise ziyaretçinin talep ettiği link. Bunu da $_SERVER globalinden alırsınız artık. :)

Fonksiyon önce bakıyor desen içinde {%id%} var mı varsa idyi bulur sartta id=$id yi döndürüyor eğer yoksa da link=’$link’ i döndürüyor. Burada farklı metod da uygulayabilirdik ama direk bunları return etmesini kolaylık olarak düşündüm. Böylece fonksiyonu direk bir değişkene atayıp mysql sorgumuz içinde kullanabiliriz. Tabii id ve link adlarını kendi tablolarımıza uyarlamak şartıyla.

Son olarak bir örnekle bitirelim :

$desen  = '{%link%}izle{%id%}.html';
$link   = 'blo-bloizle1324651321654.html';
echo linkbul($desen,$link);

Çıktımız ise şöyle oldu

id=1324651321654

Hatırlatma: Eğer sizin de aklınıza takılan PHP sorusu varsa, şu şunu nasıl yapmış veya şöyle bir şeyi nasıl yaparım tarzı aklınızı kurcalayan şeyler varsa iletişim kısmından sorun lütfen. Dilim döndükçe, zaman buldukça böyle yazı olarak yanıtlamaya çalışırım.