使用PHP将CSV文件转换为SQL

时间:2018-09-15 20:06:43

标签: php mysql csv

我已经成功编写了一个php文件,该文件将csv文件转换为sql并将其写入数据库。见下文:

<?php

  $conn = mysql_connect("localhost", "root", "") or die(mysql_error());

  mysql_select_db("fmd", $conn);

  if (isset($_POST['submit'])) {
    $file = $_FILES['file']['tmp_name'];

    $handle = fopen($file,"r");

    while (($fileop = fgetcsv($handle, 100000, ",")) !== false) {
      $Work_Request_Code = $fileop[0];
      $Building_Code = $fileop[1];
      $Floor_Code = $fileop[2];
      $Room_Code = $fileop[3];
      $Work_Description = $fileop[4];
      $Date_Work_Requested = $fileop[5];
      $Primary_Trade_Required = $fileop[6];
      $Problem_Type = $fileop[7];
      $Work_Request_Status = $fileop[8];
      $Requested_by = $fileop[9];

      $sql = mysql_query("INSERT INTO work_requests (Work_Request_Code, Building_Code, Floor_Code, Room_Code, Work_Description, Date_Work_Requested, Primary_Trade_Required, Problem_Type, Work_Request_Status, Requested_by) VALUES ('$Work_Request_Code','$Building_Code','$Floor_Code','$Room_Code','$Work_Description','$Date_Work_Requested','$Primary_Trade_Required','$Problem_Type','$Work_Request_Status','$Requested_by')");
    }

    if($sql){
      echo "Done!";
    }
  }

?>

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>SQL Converter</title>
  <link rel="stylesheet" type="text/css" href="">
  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
  <div id="mainWrapper">
    <form method="post" action="index.php" enctype="multipart/form-data">
      <input type="file" name="file">
      <br>
      <input type="submit" name="submit" value="Submit">
    </form>

  </div>
</body>
</html>

问题是我知道我的csv文件具有21527条记录,但是mysql查询仅通过19020条记录。我添加了一个count变量,我可以得出结论,while循环确实遍历了所有记录。

我不确定为什么会这样。

1 个答案:

答案 0 :(得分:0)

您的表中可能会有一个唯一字段。乍一看,它可能是Work_Request_Code。由于这也是CSV中的第一个字段,因此很容易检查是否重复。

cut -d, -f1 FILENAME | sort | uniq -d

如果您有重复的Work_Request_Code,它将通过此​​命令输出。

但是:您并没有转义要添加到查询中的字符串!您应该真正使用MySQLi界面!如果由于某种原因这是不可能的,那么您至少应该更改从CSV数组中获取数据的代码行,如下所示(我只会在第一个元素上这样做):

$Work_Request_Code = mysql_escape_string($fileop[0]);

如果不对字符串进行转义,则数据中的单引号将中断查询,并且如果在mysql_query返回false时不停止(并且不要查看您的日志),所有包含单引号的查询都会被有效跳过。试试

grep "'" FILENAME | wc -l

它可能会准确返回丢失的条目数。