Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果csv文件导入过程中发生错误,如何回滚数据库?_Php_Sql_Csv - Fatal编程技术网

Php 如果csv文件导入过程中发生错误,如何回滚数据库?

Php 如果csv文件导入过程中发生错误,如何回滚数据库?,php,sql,csv,Php,Sql,Csv,我做了一个用户上传csv文件的上传表单。csv中的数据将导入数据库。若并没有发生错误,数据将被导入数据库。我对csv文件的每一行进行验证。但在第1行和第2行已经验证并插入到数据库的情况下,第3行有验证错误。我可以知道如何回滚数据库(删除第1行和第2行)吗 我尝试执行$dbcon->rollBack()关于else语句。但它不起作用。数据库在InnoDB中 if(isset($_POST["Import"])){ $dbcon->beginTransaction(); echo $fil

我做了一个用户上传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';}

首先是设置事务变量

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

如果不知道
$dbcon
对象是什么类,就很难确定这里到底发生了什么,或者什么可能解决它。当你说“它不起作用”时,发生了什么?您看到错误消息了吗?如果是这样,那是什么?另一种方法(可能更可取,假设验证问题相对常见)是首先进行验证,然后,假设验证没有发现任何问题,再进行第二次数据库插入。旁注:您可以将
0
作为第二个参数传递给
fgetcsv()
将所有字符保留到行尾,或者干脆不使用(除非您再次确信行数永远不会超过10000个字符,而您可能不会)。