انجمن عمومی گسترش فناوری آگو
ساخت کوتاه کننده لینک با PHP به صورت Ajax - نسخه‌ی قابل چاپ

+- انجمن عمومی گسترش فناوری آگو (http://forums.ago.ir)
+-- انجمن: انجمن های عمومی گسترش فناوری آگو (/forumdisplay.php?fid=1)
+--- انجمن: برنامه نویسی (/forumdisplay.php?fid=13)
+--- موضوع: ساخت کوتاه کننده لینک با PHP به صورت Ajax (/showthread.php?tid=2269)



ساخت کوتاه کننده لینک با PHP به صورت Ajax - agotd - 12-31-2013 04:50 PM

به احتمال زیاد تا به حال به سایتهایی برخوردید که یک لینک بزرگ میگیرن و به یک لینک کوچیک تبدیلش میکنن.سایتهایی مثل tinyurl.com , bit.ly و … . در این پست میخوام آموزش ساخت کوتاه کننده لینک به وسیله PHP به صورت ای جکس رو آموزش بدم.امیدوارم به دردتون بخوره.

دیتابیس این پروژه رو میسازیم :

کد php:
CREATE TABLE IF NOT EXISTS `urls` (
  `
idint(11NOT NULL AUTO_INCREMENT,
  `
urlvarchar(500NOT NULL,
  `
short_codevarchar(15NOT NULL,
  `
create_timetimestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `
visitsint(11NOT NULL,
  
PRIMARY KEY (`id`)
ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=

بعد از ساخت دیتابیس بالا در فایل config.php کدهای زیر رو بنویسید و مقدار دهی کنید :

کد php:
<?php

define
('DB_HOST','localhost');
define('DB_NAME','database_name');
define('DB_USERNAME','database_username');
define('DB_PASSWORD','database_password');
define('SITEURL','http://url.phpro.ir/');

date_default_timezone_set('Asia/Tehran'); 

حب برای ساخت لینکهای کوتاه و ذخیره در دیتابیس کلاسی مینوسیم به نام UrlShortener که در زیر به توضیح کلاس میپردازیم :

این کلاس ۶ متد داره و از کتابخانه PDO برای اتصال با Mysql استفاده میکنه :

کد php:
<?php
/**
* UrlShortener Class

* @author Saeed Moghadam Zade
* @author URL : http://phpro.ir


* Database Create :
* CREATE TABLE `url_shortener`.`urls` (
* `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
* `url` VARCHAR( 500 ) NOT NULL ,
* `short_code` VARCHAR( 15 ) NOT NULL ,
* `visits` int NOT NULL ,
* `create_time` TIMESTAMP NOT NULL
* ) ENGINE = MYISAM ;
*/
class UrlShortener
{

    private 
$pdo;

    function 
__construct()
    {
        
$this->pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME,DB_USERNAME,DB_PASSWORD);

    }

    
/**
    * Create short code
    * 
    */
    
function createShortCode($url '')
    {
        
$chars "123456789bcdfghjkmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ";
        
$short_code '';
        while(
strlen($short_code) < 7)
        {
            
$short_code .= $chars[rand(0,strlen($chars))];
        }
        
// check in db
        
$stm $this->pdo->prepare('select * from urls where short_code = :short');
        
$stm->execute(array('short'=>$short_code));
        
$res $stm->fetch();
        
print_r($res);

        return 
$short_code;
    }

    
/**
    * return true if url format valid
    * 
    */
    
function validUrl($url)
    {
        return 
filter_var($url FILTER_VALIDATE_URL FILTER_FLAG_HOST_REQUIRED);
    }

    
/**
    * Check url exist in db
    * @param $url String
    */
    
function existInDb($url)
    {
        
$stm $this->pdo->prepare('select * from urls where url = \''.$url.'\'');
        
$stm->execute();
        
$res $stm->fetch();

        return ( empty(
$res['short_code']) ? false $res['short_code']);
    }

    function 
insertInDb($url)
    {
        
// if url exist in db return short code
        
if(($short_code $this->existInDb($url)) !== false)
        {
            return 
$short_code;
        }
        
// insert in db and return short code
        
if($this->validUrl($url))
        {
            
$short_code $this->createShortCode($url);
            
$stm $this->pdo->prepare('insert into urls (url , short_code,create_time)values(:url,:short_code,:time)');
            
$param = array('url'=>$url,'short_code'=>$short_code,'time'=>date('Y-j-m'));
            
$stm->execute($param);
            return 
$short_code;
        }else
        {
            return 
'invalid';
        }

        return 
false;
    }

    
/**
    * return url
    */
    
function getUrl($short_code)
    {
        
$stm $this->pdo->prepare('select * from urls where short_code = :short');
        
$stm->execute(array('short'=>$short_code));
        
$result $stm->fetch();

        return 
$result['url'];
    }

    function 
addCount($url)
    {
        
$stm $this->pdo->prepare('update urls set visits = visits +1 where url = :url');
        
$stm->execute(array('url'=>$url));
    }



در متد سازنده یک شیء از کلاس pdo ساختیم و رشته اتصال به دیتابیس رو بهش پاس دادیم.
متد createShortCode : این متد یک رشته به صورت تصادفی ایجاد میکنه اگر رشته در دیتابیس بود یکی دیگه میسازه و برمیگردونه.
متد validUrl : یک url میگیره و فرمت url رو چک میکنه در صورت صحیح بودن true بر میگردونه.
متد existInDb : این متد یک url میگیره و چک میکنه که آیا در دیتابیس ذخیره شده یا خیر
متد insertInDb : این متد هم url مورد نظر رو میگیره . ابتدا چک میکنه اگر در دیتابیس وجود داشت لینک کوتاهش رو برمیگردونه اگر نبود لینک رو به دیتابیس اضاضه میکنه و لینک کوتاه رو برمیگردونه.
متد getUrl : این متد کد کوتاه شده رو میگیره و آدرس مربوط رو برمیگردونه
متد addCount : این هم به اضای هر بازدید از آدرس ها یکی به تعداد فیلد visits اضافه میکنه.

در فایل index.php فقط قسمت کدهای jquery رو توضیح میدم.

کد php:
<script src="js/jquery.min.js"></script>
        <script>
            $(document).ready(function(){
                $('.btn').live('click',function(e){
                    e.preventDefault();
                    var url = $('#url').val();
                    $('.result').html('<img src="images/loading.gif" />');
                    $.post('shortener.php',{url: url},function(data){
                        if(data.short != 'invalid')
                            $('.result').html('<a href="'+data.short+'" target="_blank" >'+data.short+'</a>');
                        else
                            $('.result').html('<div class="error">لینک را درست وارد کنید</div>');
                    },'json');
                });
            });
        </script> 

در این قسمت هنگامی که کلید ارسال فرم کلیک میشه یک درخواست به صورت post به صفحه shortener.php ارسال میشه و جواب این درخواست با فرمت json دریافت میشه.

دستور e.preventDefault برای جلوگیری از ارسال فرم هنگام کلیک روی دکمه submit فرم میباشد.

فایل shortebner.php

کد php:
<?php

include 'includes/config.php';

if(isset(
$_POST['url']))
{
    
$url $_POST['url'];
    include 
'includes/UrlShortener.php';
    
$short = new UrlShortener();
    
$short_code $short->insertInDb($url) ; 
    
//echo '$short_code';
    
$msg['short'] = ($short_code == 'invalid') ? 'invalid' SITEURL.$short_code;
    echo 
json_encode($msg);    


در این فایل هم روال کار بسیار ساده است.ابتدا فایل مربوط به تنظیمات رو include کردیم.سپس یک شیء از کلاس UrlShortener ایجاد کردیم . سپس آدرس URL رو در دیتابیس ذخیره میکنیم و نتیجه رو با فرمت json نمایش میدیم.

تا اینجا یک لینک از کاربر گرفتیم . برای این لینک یک کد کوتاه ساختیم و در دیتابیس ذخیره کردیم.حالا برای اینکه کاربر بتونه با کلیک رو لینک به url اصلی بره یک فایل با نام goto.php میسازیم و کدهای زیر رو داخلش مینویسیم :

کد php:
<?php

include 'includes/config.php';
include 
'includes/UrlShortener.php';

$short = new UrlShortener();

$url $short->getUrl($_GET['url']);
if(empty(
$url))
{
    echo 
'<h1>404 Not Found</h1><br><a href="'.SITEURL.'">Back To Main Page</a>';
}else
{
    
$short->addCount($url);
    
header('Location:'.$url);


در این فایل کد کوتاهی که در متغیر $_GET['url'] قرار گرفته رو در دیتابیس پیدا میکنیم و URL مربوط به این کد رو از دیتابیس میخونیم.در نهایت با دستور header صفحه رو به url مورد نظر انتقال میدیم .در صورتی که کد کوتاه در دیتابیس وجود نداشته باشه صفحه ۴۰۴ به کاربر نمایش داده میشه.

بعد از ایجاد فایل goto.php که در مرحله قبل انجام شد یک فایل .htaccess میسازیم تا به جای آدرس :

دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.


آدرسهایی با فرمت زیر داشته باشیم :

دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.


پس از ساخت فایل htaccess کدهای زیر رو داخلش بنویسید :

کد php:
RewriteEngine on

RewriteCond 
%{SCRIPT_FILENAME} !-d
RewriteCond 
%{SCRIPT_FILENAME} !-f

RewriteRule 
^(.*)$ goto.php?url=$
خب پروژه ما آماده است.

در این آموزش سعی کردم مطالب رو به سرعت بگم چون تقریبا تمام مباحثی که توی این آموزش بود رو قبلا در موردش حرف زدیم و یادگرفتیم.فقط جاهایی که نیاز به توضیح داشت رو توضیح دادم اگر جایی رو متوجه نشدید یکی دوبار کدهارو بالا و پایین کنید دستتون میاد چیکار کردیم.اگر هم سوال داشتید که توی کامنتها بپرسید.