问题:使用 phpMyAdmin Works 导入 csv,Php 脚本以不同方式处理 csv 导入

Posted

技术标签:

【中文标题】问题:使用 phpMyAdmin Works 导入 csv,Php 脚本以不同方式处理 csv 导入【英文标题】:Issue: Importing csv with phpMyAdmin Works, Php Script treats csv import differently 【发布时间】:2015-11-29 06:56:07 【问题描述】:

我一直在使用这个我认为有点过时的脚本。我遇到的问题是,当我使用 phpMyAdmin 导入 csv 文件(6000 多条记录)时,它工作正常,但是,当我使用此 php 脚本导入相同的 csv 文件时,它会破坏字段顺序。

只导入前两条记录。导入的第二条记录没有正确导入为第二条记录的第一个字段,包含在第一条记录的最后一个字段中,因此导入过程似乎没有识别下一条记录的换行符。我尝试将 csv 文件保存为 utf8 以及 ascii。在这两种情况下都没有区别。

有什么想法可以修改脚本以像 phpMyAdmin 一样处理 csv 文件?

<?php

include "connect.php"; //Connect to Database

$deleterecords = "TRUNCATE TABLE plfwinvtable"; //empty the table of its current records

mysqli_query( $conn, $deleterecords );

//Upload File

if (isset($_POST['submit'])) 

    if (is_uploaded_file($_FILES['filename']['tmp_name'])) 

        echo "<h1>" . "File ". $_FILES['filename']['name'] ." uploaded successfully." . "</h1>";

        echo "<h2>Displaying contents:</h2>";

        readfile($_FILES['filename']['tmp_name']);

    

    //Import uploaded file to Database

    $handle = fopen($_FILES['filename']['tmp_name'], "r");

    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 

        $import="INSERT into plfwinvtable(Barcode, Brand, Description, Category, Price, Size, Unit, ServeOz, NumDrinks, NameVar) values('$data[0]','$data[1]','$data[2]','$data[3]','$data[4]','$data[5]','$data[6]','$data[7]','$data[8]','$data[9]')";

        mysqli_query($conn, $import) or die(mysqli_error());

    

    fclose($handle);

    print "Import done";

    //view upload form

else 

    print "Upload new csv by browsing to file and clicking on Upload<br />\n";

    print "<form enctype='multipart/form-data' action='upload.php' method='post'>";

    print "File name to import:<br />\n";

    print "<input size='50' type='file' name='filename'><br />\n";

    print "<input type='submit' name='submit' value='Upload'></form>";



?>

【问题讨论】:

Note: If PHP is not properly recognizing the line endings when reading files either on or created by a Macintosh computer, enabling the auto_detect_line_endings run-time configuration option may help resolve the problem. 马克我想你可能正在做一些事情,因为我正在使用旧的 Mac 和文件制作器来创建我的 csv 文件。我的客户有一个带 cpanel 的共享主机帐户。希望我可以在服务器上更改此设置。 您应该能够使用 ini_set() 在代码中动态更改 auto_detect_line_endings 设置 我正在寻找如何在 php 脚本中执行此操作的示例。您将如何执行此操作以及在脚本中的何处添加此内容。 ini_set ('auto_detect_line_endings', true)。 PHP docs其实在笔记中以此为例 【参考方案1】:

将文件另存为upload.php

<html>
<head>
<style type="text/css">
body 
    background: #E3F4FC;
    font: normal 14px/30px Helvetica, Arial, sans-serif;
    color: #2b2b2b;

a 
    color:#898989;
    font-size:14px;
    font-weight:bold;
    text-decoration:none;

a:hover 
    color:#CC0033;


h1 
    font: bold 14px Helvetica, Arial, sans-serif;
    color: #CC0033;

h2 
    font: bold 14px Helvetica, Arial, sans-serif;
    color: #898989;

#container 
    background: #CCC;
    margin: 100px auto;
    width: 945px;

#form           padding: 20px 150px;
#form input     margin-bottom: 20px;
</style>
</head>
<body>
<div id="container">
<div id="form">

<?php

include "inc/database.php"; //Connect to Database

//Upload File
if (isset($_POST['submit'])) 
    if (is_uploaded_file($_FILES['filename']['tmp_name'])) 
        echo "<h1>" . "File ". $_FILES['filename']['name'] ." uploaded successfully." . "</h1>";
        echo "<h2>Displaying contents:</h2>";
        readfile($_FILES['filename']['tmp_name']);
    

    //Import uploaded file to Database
    $handle = fopen($_FILES['filename']['tmp_name'], "r");

    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
        $import="INSERT into awards (field1, field2, field3, field4) values('$data[0]','$data[1]','$data[2]','$data[3]')";

        mysql_query($import) or die(mysql_error());
    

    fclose($handle);

    print "Import done";

    //view upload form
else 

    print "Upload new csv by browsing to file and clicking on Upload<br />\n";

    print "<form enctype='multipart/form-data' action='upload.php' method='post'>";

    print "File name to import:<br />\n";

    print "<input size='50' type='file' name='filename'><br />\n";

    print "<input type='submit' name='submit' value='Upload'></form>";



?>

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

将工作 100%... :)

【讨论】:

您现在面临什么问题?我的工作正常。 我正在使用 mysqli 连接。 如上所述,脚本不会将我的 csv 文件视为与 phpMyAdmin 上传相同,我使用它作为我的 csv 数据文件格式正确的衡量标准。 使用 mysqli 连接不是问题。我还加了截图回答 见上面的标记评论。我认为这是我的 csv 文件的问题。我要试一试,让你知道。感谢您的时间。

以上是关于问题:使用 phpMyAdmin Works 导入 csv,Php 脚本以不同方式处理 csv 导入的主要内容,如果未能解决你的问题,请参考以下文章

怎样使用phpmyadmin导入大数据的方法

使用 phpmyadmin 导入巨大的 sql 文件

从 phpMyAdmin 导出的数据库导入 phpMyAdmin 时出错

如何使用具有视图的 phpmyadmin 导入 sql?

使用 phpMyAdmin 导入大型 csv 文件

使用 excel 日期导入 phpmyadmin sql