我已经成功编写了一个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循环确实遍历了所有记录。
我不确定为什么会这样。
答案 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
它可能会准确返回丢失的条目数。