php - 如果在 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';}
解决方案
首先是设置您的交易变量。
$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';
}
推荐阅读
- assembly - “PTR”和“NEAR PTR”有什么区别?
- maven - Maven安装插件
- python - python ModuleNotFoundError:没有名为“gplearn”的模块
- networking - Istio 虚拟服务匹配 uri 和 cookie 不起作用
- php - 此行查询正常工作请帮助更改它雄辩的查询
- scala - scala函数中抽象类型的解析
- chef-infra - 厨师主角色依赖覆盖
- javascript - 无法在 axios 响应中设置 cookie
- c# - 重新抛出未处理的异常时应该调用 Dispose 吗?
- java - sprint boot 多模块项目中相同 bean 名称的问题