نوشته شده توسط
MMSHFE
کار پیچیده ای نیست. شما کافیه یک رشته کوتاه و غیرتکراری (یعنی توی دیتابیس موجود نباشه) تولید کنید (مثل 2Xt0) و بعد، اون رشته رو همراه با لینک اصلی، توی دیتابیس ذخیره کنید. حالا یک فایل htaccess. اینطوری میسازین:
RewriteEngine on
RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]
و بعد، توی فایل index.php سایتتون کدی شبیه این رو میگذارین:
mysql_connect('localhost', 'db_user', 'db_pass') or die('Connection error');
mysql_select_db('dbname') or die('Database error');
mysql_query('SET NAMES \'utf8\'');
if(isset($_GET['url']) {
$url = mysql_query("SELECT * FROM `urls_table_name` WHERE (`short_url`='{$_GET['url']}') LIMIT 1");
if($url && mysql_num_rows($url) > 0) {
$url = mysql_fetch_assoc($url);
header('Location: '.$url['original_url'];
exit();
}
}
توی کد فوق، فرض بر اینه که شما لینک کوتاه شده (2Xt0) رو توی فیلد short_url و لینک کامل (
http://www.w3schools.com/php/default.asp) رو توی فیلد original_url ذخیره کردین.
موفق باشید.
سلام
مسئله ی اصلی همون ساختن اون رشته اس . من با جستجویی که کردم به دو راه رسیدم.
1- ساخت یه رشته ی تصادفی (رندوم)
2- تبدیل به یک رشته ی یکتا شبیه اعداد
1- توی مسئله ی اول من اینطوری فهمیدم که با تابع رندوم یه رشته میسازیم و اون میشه آدرس لینک
function genRandomString() {
$length = 3;
$characters = '0123456789abcdefghijklmnopqrstuvwxyz';
$string = '';
for ($p = 0; $p < $length; $p++) {
$string .= $characters[mt_rand(0, strlen($characters))];
}
return $string;
}
2- توی مسئله ی دوم هم یه راه کار اینطوری بود که آدرس رو میگیریم و اون رو با md5 هش میکنیم و سپس رشته ی هش شده رو تقسیم بر 8 میکنیم و یه رشته ی 4 کاراکتری بدست میاریم.
function shorturl($input) {
$base32 = array (
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
'y', 'z', '0', '1', '2', '3', '4', '5'
);
$hex = md5($input);
$hexLen = strlen($hex);
$subHexLen = $hexLen / 8;
$output = array();
for ($i = 0; $i < $subHexLen; $i++) {
$subHex = substr ($hex, $i * 8, 8);
$int = 0x3FFFFFFF & (1 * ('0x'.$subHex));
$out = '';
for ($j = 0; $j < 6; $j++) {
$val = 0x0000001F & $int;
$out .= $base32[$val];
$int = $int >> 5;
}
$output[] = $out;
}
return $output;
}
1- در روش اول ما یک رشته ی تصادفی میسازیم که شاید برای تعداد لینکهای کم خوب باشد اما به نظرم اگر تعداد رکوردها افزایش پیدا کنه ممکنه رشته های تکراری افزایش پیدا کنه و برنامه مجبور باشه برای ساخت هر لینک تعداد بسیار زیادی کوئری برای امتحان تکراری نبودن در پایگاه داده انجام بده.
2- روش دوم به نظرم بهتره ولی شاید تعدادی کلمه 4 کلمه ی اولشون مشابه باشه و اون وقت برنامه دچار مشکل بشه.و در ضمن اگه چند کاربر لینک های مشابه وارد کردند و خواستند کوتاه کنند تکلیف چی میشه!؟
خودم یه چیز دیگه ای تو ذهنمه که نمیدونم چقدر درست باشه.
من میگم بهتر بود که مثلا آی دی یکتا هر رکورد رو تبدیل به یک رشته میکردیم اینطوری سیستم بهتری میشد.
مثال:
record id
1
2
.
.
2000
.
.
.
encode:
1 -> aaaa
2-> aaab
2000 -> gdrt
decode:
$x = gdrt -> 2000
بعد موقعی که میخواستیم لینک رو بگیریم اون رشته رو تبدیل به آی رکورد مورد نظر میکردیم و به راحتی نتیجه میگرفتیم
"SELECT * FROM `urls_table_name` WHERE`short_url`='$x' LIMIT 1"
خوشحال میشم نظرات شما و دوستان رو بدونم