如果记录未存储在数据库中,则删除文件

时间:2018-02-18 19:38:05

标签: php codeigniter file-upload

我正在将文章上传到我的网站。我首先上传文件,然后在数据库中为该文章创建一个条目。因此,如果在数据库中成功创建了文件条目,那么一切正常。但是如果上传文件并且没有创建数据库中的记录,那么我想删除该文件。问题是如果发生数据库错误我不会回到我想要删除文件的状态。 那么我做错了什么?以下是我的代码。

模型

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');
            }

        }
}

1 个答案:

答案 0 :(得分:1)

如果在数据库配置中启用了数据库调试,则脚本执行将通过show_error()暂停以显示数据库错误,从而停止执行else语句。我建议关掉它(特别是在prod环境中)。

您也可以尝试将错误抑制符号放在insert语句(@)的前面 - 但是这个方法我没有经过测试,因为我不认为db驱动程序使用php触发错误。

相关问题