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
嘿,马尼克斯我不明白你的意思是“格式化你的代码”。我认为即使在那之后,我也会正确地给它,如果你告诉我如何使它更容易阅读,我可以按照这种方式。谢谢 –
他在谈论正确的缩进。你的代码是不可能读取的。看我的编辑。 –