Php 如果csv文件导入过程中发生错误,如何回滚数据库?
我做了一个用户上传csv文件的上传表单。csv中的数据将导入数据库。若并没有发生错误,数据将被导入数据库。我对csv文件的每一行进行验证。但在第1行和第2行已经验证并插入到数据库的情况下,第3行有验证错误。我可以知道如何回滚数据库(删除第1行和第2行)吗 我尝试执行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
$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个字符,而您可能不会)。