我正在将文章上传到我的网站。我首先上传文件,然后在数据库中为该文章创建一个条目。因此,如果在数据库中成功创建了文件条目,那么一切正常。但是如果上传文件并且没有创建数据库中的记录,那么我想删除该文件。问题是如果发生数据库错误我不会回到我想要删除文件的状态。 那么我做错了什么?以下是我的代码。
模型
public function create($file_name) {
$new_article=new Article_model();
$new_article->active=1;
$new_article->name= $file_name;
$needles=array(' ','_','%','$','#','/','\\');
foreach($needles as $needle)
{
$file_name=str_replace($needle, '-', $file_name);
}
$new_article->slug= $file_name;
$new_article->author_id=$user;
$new_article->approved=0;
$new_article->views=0;
$new_article->downloads=0;
if($this->db->insert(static::$table_name,$new_article))
{
$new_article->id=$this->db->insert_id();
return $new_article->id;
}
else
{
return FALSE;
}
}
控制器
public function upload_article()
{
$config['upload_path']= ARTICLES_PATH;
$config['allowed_types'] = 'docx|doc|pdf|txt|odt';
$config['max_size'] = 10000;
//the following line is in accordance with the auto_load
$this->upload->initialize($config);
if ( ! $this->upload->do_upload('article'))
{
$error = array('error' => $this->upload->display_errors());
$error['upload_path']=$config['upload_path'];
$this->pmp->header('article/new_article', $error);
}
else
{
$upload_data=$this->upload->data();
$result=$this->article->create($upload_data['file_name']);
if($result!==FALSE)
{
$this->session->set_flashdata('message','Article Submitted Successfully.');
redirect('/article/view/'.$result);
}
else
{
//delete file
if( ! unlink(ARTICLES_PATH.$upload_data['file_name']))
{
$this->session->set_flashdata('message','Article Submission Failed.');
}
$this->session->set_flashdata('message','Article Submission Failed.');
redirect('/article/upload_article');
}
}
}
答案 0 :(得分:1)
如果在数据库配置中启用了数据库调试,则脚本执行将通过show_error()
暂停以显示数据库错误,从而停止执行else
语句。我建议关掉它(特别是在prod环境中)。
您也可以尝试将错误抑制符号放在insert语句(@
)的前面 - 但是这个方法我没有经过测试,因为我不认为db驱动程序使用php触发错误。