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)); 
} 
相关问题