1

我想爲使用CI的項目製作一個url縮短器。我可以簡短的網址,但問題是,短暫之後,我不能重定向它原來的網址。如何在codeigniter中將短url重定向到原始網址

這是我的控制器代碼。

<?php 
if (!defined('BASEPATH')) {exit ('No direct script access allowed');} 

class Shorten extends CI_Controller{ 

    public function __construct(){ 
     parent::__construct(); 
     $this->load->model('shorten_mdl'); 
    } 

    public function index(){ 
     $this->load->view('home'); 
    } 

    public function create(){ 
     $short_url = ""; 
     $url = prep_url($this->input->post('url')); 
     $link_length = $this->config->item('link_length'); 
     $existing_alias = $this->shorten_mdl->alias_from_url($url); 
     $this->form_validation->set_rules('url','URL','trim|required|xss_clean'); 

     if ($this->form_validation->run()== FALSE) { 
      $this->index();} 
     else { 
      if ($existing_alias == "") { 
       $alias = random_string('alnum',$link_length); 
       while($query = $this->shorten_mdl->does_alias_exist($alias)){ 
        $alias = random_string('alnum',$link_length);} 
        $this->shorten_mdl->save_new_alias($url,$alias); 
        $short_url = $alias; 
      } 
      else { 
       $short_url = $existing_alias; 
      } 

      $this->get_short_url($short_url); 
    } 

    public function get_long_url(){ 
     $alias = $this->uri->segment(1); 
     redirect($this->shorten_mdl->get_long_url($alias)); 
    } 

    public function error_404(){ 
    echo "Nothing! Fool"; 
    } 
} 

?> 

這裏是我的模型代碼

<?php 
if (!defined('BASEPATH')) {echo "No direct script access allowed";} 

class shorten_mdl extends CI_Model{ 

    public function __construct(){ 
     parent::__construct(); 
    } 

    public function save_new_alias($url, $alias){ 
     $data = array('alias'=>$alias,'url'=>$url,'created'=>date('Y-m-d H:i:s')); 
     $this->db->insert('links',$data); 
    } 

    public function alias_from_url($url){ 
     $alias = ""; 
     $this->db->select('alias'); 
     $query = $this->db->get_where('links', array('url'=>$url),1,0); 

     if ($query->num_rows() > 0) { 
      foreach ($query->result() as $row){ 
       $alias = $row->alias; 
      } 
     } 
     return $alias; 
    } 

    public function does_alias_exist($alias){ 
     $this->db->select('id'); 
     $query = $this->db->get_where('links', array('alias'=>$alias), 1,0); 

     if ($query->num_rows()>0){ 
      return TRUE; 
     } 

     else { 
      return FALSE; 
     } 
    } 

    public function get_long_url($alias){ 
     $alias=""; 
     $this->db->select('url'); 
     $query = $this->db->get_where('links', array('alias'=>$alias),1,0); 

     if ($query->num_rows()>0) { 
      foreach ($query->result() as $row) { 
       return $row->url; 
      } 
     } 
return '/error_404'; 
    } 
} 
?> 

這裏是我的看法。

<h1>Short your url with CI</h1> 

<div id="urldiv"> 
    <a href=""><?php echo base_url() . $shorturl;?></a> 
</div> 

我在路線文件中做了一些更改。

$route['default_controller'] = "shorten"; 
    $route['404_override'] = 'shorten/get_long_url'; 
    $route['error_404'] = 'shorten/error_404'; 
+0

請儘量爲了使更容易閱讀格式化你的代碼。 – manix

+0

嘿,馬尼克斯我不明白你的意思是「格式化你的代碼」。我認爲即使在那之後,我也會正確地給它,如果你告訴我如何使它更容易閱讀,我可以按照這種方式。謝謝 –

+0

他在談論正確的縮進。你的代碼是不可能讀取的。看我的編輯。 –

回答

1

雅虎!最後我得到了它。在模型

public function get_long_url($alias){ 

    $this->db->select('url'); 
    $query = $this->db->get_where('links', array('alias'=>$alias),1,0); 

    if ($query->num_rows()>0) { 
     foreach ($query->result() as $row) { 
      return $row->url; 
     } 
    } 
return '/error_404'; 
} 

需要改變需要改變控制器

public function get_long_url($alias=""){ 

     $alias = $this->uri->segment(1); 
     redirect($this->shorten_mdl->get_long_url($alias)); 
} 
相關問題