Hocam eline sağlık ama çok karışık olmuş. Geliştirmek, değiştirmek isteyen biri için çözmesi bile belki saatler alır. Ben de kendi yazdığımı paylaşayım.

// Link kısaltma fonksiyonu, Hkan @ r10.net (biggboss35@gmail.com)
function shortenLink($q, $l = 5)
{
	$uc = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; // uc = usable chars;
	
	$return = '';
	for($i=0; $i < $l; ++$i)
	{
		$return .= $uc[rand(0, strlen($uc)-1)];
	}

	// MySQL controls
	$check = mysql_query("SELECT `abbr` FROM `link` WHERE `abbr` = '$return'");
	
	if($check && mysql_num_rows($check) > 0)
		return shortenLink($q, $l);
	elseif($check || @mysql_num_rows($check) == 0)
		$newLink = mysql_query("INSERT INTO link (`abbr`, `to`) VALUES ('$return', '$q')");
	// MySQL controls - end

	return $return;
}
Çalışma mantığı ve kullanımı:
  • shortenLink('http://site.com', '7') şeklinde kullanılabilir. 7 ibaresi oluşturulacak kısa bağlantının uzunluğunu belirler. Dilerseniz yazmayabilirsiniz.
  • Fonksiyon önce kullanılabilr karakterleri tanımlar.
  • return isimli boş bir değişken oluşturur.
  • For döngüsüyle 1'den başlayarak (PHP'de ilk sayı 0'dır. Döngüde bu yüzden $i = 0 yazıyor.) belirtilen uzunluğa ulaşana kadar return değişkenine rastgele bir karakter ekler.
  • Oluşturulan return değişkeninin daha önce kaydedilmiş olup olmadığına bakar, eğer varsa işlemi en baştan tekrarlar.
  • Son olarak kullanılmamış bir kısaltma bulduğunda bunu veritabanına kaydeder ve değeri döndürür.
  • Öneri: Veritabanı kullanmak istemezseniz 2 // MySQL controls etiketi arasındaki kodları silmeniz yeterli olur.

    MySQL Yapısı:
    +----+----------+-------+------------+
    | id | abbr     | to    | time       |
    +----+----------+-------+------------+
    |    |          |       |            |
    +----+----------+-------+------------+