【问题标题】:Delete file if record is not stored in database如果记录未存储在数据库中,则删除文件
【发布时间】:2018-02-18 19:38:04
【问题描述】:

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

型号

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

        }
}

【问题讨论】:

  • 数据库配置中是否开启了数据库调试?通常,这会导致脚本中出现 db 错误。如果它关闭,则强制出错并报告发生的情况:您是否在浏览器或日志中收到任何类型的错误消息(启用错误日志记录)。我看不出你的任何条件语句有什么问题。
  • @Alex 是的,调试已打开,是的,我得到唯一约束失败错误(对于 slug)

标签: php codeigniter file-upload


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 2021-01-12
    • 2015-10-21
    • 2019-03-17
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多