【问题标题】:Why do I get duplicate data when import CSV file into MySQL with php为什么我在使用 php 将 CSV 文件导入 MySQL 时会得到重复数据
【发布时间】:2017-08-29 18:00:40
【问题描述】:

单击提交按钮时,我在 MySQL 数据库中得到重复的日期,这意味着 CSV 文件中的单行被插入两次并在数据库中获得相同的记录。

我的 php 代码放在这里。

if(isset($_POST['submit'])){
if( $_FILES['file']['name']){
    $filename = explode('.',$_FILES['file']['name']);
    if ($filename[1] == 'csv'){
        $handle = fopen($_FILES['file']['tmp_name'],"r");
        if($_POST['dataType']=='aType'){
            while ($data = fgetcsv($handle)){
                $item0 = mysqli_real_escape_string($con,$data[0]);
                $item1 = mysqli_real_escape_string($con,$data[1]);
                $item2 = mysqli_real_escape_string($con,$data[2]);
                $item3 = mysqli_real_escape_string($con,$data[3]);
                $sql = "insert into `table_XX`(`Column_A`,`Column_B`,`Column_C`,`Column_D`) VALUES ('$item0','$item1','$item2','$item3')";
                mysqli_query($con,$sql);
            }
            if(!(mysqli_query($con,$sql))) echo "something is wrong!";
            fclose($handle);
        }
    }
}

}

我的 Html 代码放在这里。

<form method="post" action="import.php" enctype="multipart/form-data">
  <select name="dataType" class="form-control">
     <option selected="selected">pls select data</option>
     <option>aType</option>
  </select>
  <input type="file" name="file">
  <input type="submit" name="submit" value="submit">
</form>

我的代码有什么问题?谢谢。


编辑:

后来才知道是这行代码导致了这个错误。

if(!(mysqli_query($con,$sql))) echo "something is wrong!"

但是,使用这样的代码来检查我们的查询是一个坏习惯吗?

if(mysqli_query($con,$sql))



顺便说一句,我怎样才能使用数组来存储值来自

mysqli_real_escape_string

而不是使用这个 x4

$item0 = mysqli_real_escape_string($con,$data[0]);
$item1 = mysqli_real_escape_string($con,$data[1]);
$item2 = mysqli_real_escape_string($con,$data[2]);
$item3 = mysqli_real_escape_string($con,$data[3]);

【问题讨论】:

  • 你确定你的php代码没有被调用两次吗?
  • 好吧,我刚刚学习了一点关于文件的php代码,所以可能有很多错误,但我找不到它们。@Fabian Picone
  • 你的代码在函数中吗?也许该函数被调用了两次。你能从你的代码中展示更多吗?
  • emm,其实我发现了这个if(!(mysqli_query($con,$sql))) echo "something is wrong!"。这段代码就在 fclose($handle) 之前 ..可能这就是 mysqli_query 被调用两次的原因@Fabian Picone
  • 你能告诉我如何使用数组来存储来自 mysqli_real_escape_string 的值,我知道我可以使用循环来处理它,但一次又一次失败,这太令人沮丧了。@Fabian Picone

标签: php html mysql csv import


【解决方案1】:

原因是因为mysqli_query() 被调用了两次。同样在if() 中,它会自行执行!如果您想检查mysqli_query() 的结果,请将其安全地放在$queryResult = mysqli_query() 之类的变量中,然后再检查if($queryResult)

mysqli_query($con,$sql); 替换为

if(!mysqli_query($con,$sql)) {
    echo "something is wrong!";
}

然后删除:if(!(mysqli_query($con,$sql))) echo "something is wrong!";

加法数组解

替换

$item0 = mysqli_real_escape_string($con,$data[0]);
$item1 = mysqli_real_escape_string($con,$data[1]);
$item2 = mysqli_real_escape_string($con,$data[2]);
$item3 = mysqli_real_escape_string($con,$data[3]);

有(未测试)

function escapeArray(array $data) {
    foreach($data as $i => $item) {
        $data[$i] = mysqli_real_escape_string($item);
    }
    return $data;
}

$data = escapeArray($data);

然后要么做VALUES (" . $data[0] . "," . $data[1] . ", " . $data[2] . "," . $data[3] . ")

VALUES (" . implode(',', $data) . ")

【讨论】:

  • 非常感谢!你真好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多