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';
請儘量爲了使更容易閱讀格式化你的代碼。 – manix
嘿,馬尼克斯我不明白你的意思是「格式化你的代碼」。我認爲即使在那之後,我也會正確地給它,如果你告訴我如何使它更容易閱讀,我可以按照這種方式。謝謝 –
他在談論正確的縮進。你的代碼是不可能讀取的。看我的編輯。 –