首页 > 解决方案 > 如果在 csv 文件导入过程中发生错误,如何回滚数据库?

问题描述

我做了一个上传表单供用户上传 csv 文件。csv中的数据将被导入数据库。如果没有错误发生,数据将被导入数据库。我对 csv 文件的每一行进行验证。但是如果第 1 行和第 2 行已经验证并插入到数据库中,则第 3 行有验证错误。我可以知道如何回滚数据库(删除第 1 行和第 2 行)吗?

我尝试$dbcon->rollBack();在 else 语句上做。但它不起作用。数据库在 InnoDB 中。

if(isset($_POST["Import"])){

$dbcon->beginTransaction();

echo $filename=$_FILES["file"]["tmp_name"];

if($_FILES["file"]["size"] > 0){

    $file = fopen($filename, "r");
    while(($emapData = fgetcsv($file, 10000, ",")) !== FALSE){
        if(is_string($emapData[0]) && is_string($emapData[1]) && is_string($emapData[2]) && is_numeric($emapData[3])){
            $sql = "INSERT INTO Diary(id, diary, remarks, status) VALUES('$emapData[0]','$emapData[1]','$emapData[2]','$emapData[3]')";
        }
        else{
            echo " There is data type error on row " . $row . " ";
            $dbcon->rollBack();
            break;
        }
        $res=$dbcon->query($sql);
        $row = $row +1;
    }
    fclose($file);
    echo "CSV File has been succesfully Imported";
    }
    else
        echo 'Invalid File:Please Upload CSV File';}

标签: phpsqlcsv

解决方案


首先是设置您的交易变量。

$transaction = $dbcon->beginTransaction();

其次是在循环之后提交您的事务

$transaction->commit();

第三是如果在while循环期间失败则回滚事务

$transaction->rollback();

这是您的完整代码

if(isset($_POST["Import"])){

    $transaction = $dbcon->beginTransaction();

    echo $filename=$_FILES["file"]["tmp_name"];

    if($_FILES["file"]["size"] > 0){

        $file = fopen($filename, "r");
        while(($emapData = fgetcsv($file, 10000, ",")) !== FALSE){
            if(is_string($emapData[0]) && is_string($emapData[1]) && is_string($emapData[2]) && is_numeric($emapData[3])){
                $sql = "INSERT INTO Diary(id, diary, remarks, status) VALUES('$emapData[0]','$emapData[1]','$emapData[2]','$emapData[3]')";
            }
            else{
                echo " There is data type error on row " . $row . " ";
                $transaction->rollback();
                break;
            }
            $res=$dbcon->query($sql);
            $row = $row +1;
        }
        $transaction->commit();
        fclose($file);
        echo "CSV File has been succesfully Imported";
    }
    else
        echo 'Invalid File:Please Upload CSV File';
}

推荐阅读