使用php将csv文件转换为sql

cgvd09ve  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(370)

**结束。**此问题需要详细的调试信息。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。

两年前关门了。
改进这个问题
我已经成功地编写了一个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循环确实在所有记录中循环的结论。
我不知道为什么会这样。

inn6fuwd

inn6fuwd1#

表中可能有一个唯一的字段。乍一看,可能是 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

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

相关问题