PHP:CSV 导入 MYSQL 总是少于 CSV 文件中的实际行数?

Posted

技术标签:

【中文标题】PHP:CSV 导入 MYSQL 总是少于 CSV 文件中的实际行数?【英文标题】:PHP: CSV import into MYSQL is always less than the actual amount of rows in the CSV file? 【发布时间】:2016-11-17 18:18:15 【问题描述】:

这是一个非常奇怪的问题,我不明白是什么原因造成的。

基本上,问题在于我的 php 中有一个简单的上传函数,它上传一个 CSV 文件,然后将每一行导入 mysql 数据库。

现在,问题是我的 CSV 文件中有大约 200+ 行,但是当我使用我的 PHP 页面将其上传并导入到 MYSQL 中时,我只能绕过 158 of them imported 并且我没有收到任何错误完全没有,所以我不明白是什么原因造成的。

我有另一个 CSV 文件,其中包含大约 300+ rows,当我上传/导入此 CSV 文件时,我将 270 rows imported 导入 MYSQL。

这就像导入函数总是短几行,我完全看不懂。

这是我的 PHP 导入代码:

error_reporting(-1);
ini_set('display_errors', 'On');

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

include "config/connect.php";

$imp= $_FILES["csv"]["name"];                                               
move_uploaded_file($_FILES["csv"]["tmp_name"],"imports/$imp"); 



// path where your CSV file is located
////////////////////////////////////////////////////////
define('CSV_PATH','');

// Name of your CSV file
$csv_file = CSV_PATH . "imports/".$imp.""; 
$i = 0;

set_time_limit(10000);


$fp = fopen("imports/".$imp."", "r");

while( !feof($fp) ) 
  if( !$line = fgetcsv($fp, 1000, ',', '"')) 
     continue;
  
    $sql0 = "INSERT INTO `myTable`(`column1`) VALUES('".$line[0]."')";
    $query0 = mysqli_query($db_conx, $sql0);



fclose($fp);

    printf("<script>location.href='mypage.php'</script>");
    exit();

由于安全问题/漏洞,使用直接导入 MYSQL 是不可能的。

有人可以就这个问题提出建议吗?

任何帮助将不胜感激。

【问题讨论】:

当我调试代码时,我总是使用 echo 来找出是否执行了部分代码...例如,如果我发现它在代码中的 continue; 上方没有执行 mysqli_query,那么我将放置 echo "continuing";... 只是为了查看 while 循环是否继续而不执行查询。如果它没有回显“继续”,请尝试使用mysqli_error(); 能否检查文件是否已完全导入?您还可以尝试在循环中每行打印一列而不将其插入数据库吗?如果循环到达最后一行?我可能的猜测是您超出了文件的最大上传大小,因此某些部分被剪裁了?? 您可能会遇到引用问题。您可以使用准备好的语句和bind_param 绕过它。否则,检查每个插入是否有错误,如果有错误则回显。 缺失的行是否有任何共同点,例如复杂的引用,还是超过 1000 个字符的限制? @aynber, SPOT ON....我已经切换到准备好的声明,一切都像一个魅力......我可以发布我的代码并接受它作为答案,或者你可以发布你的和我会接受你的……无论哪种方式,准备好的声明都有效……谢谢 【参考方案1】:

要解决引用问题,您需要使用带有 bind_param 的准备好的语句。

程序风格:

$stmt = mysqli_prepare($db_conx, "INSERT INTO `myTable`(`column1`) VALUES(?)");
mysqli_stmt_bind_param($stmt, 's', $line[0] );
mysqli_stmt_execute($stmt);

面向对象的风格:

$stmt = $mysqli->prepare("INSERT INTO `myTable`(`column1`) VALUES(?)");
$stmt->bind_param('s', $line[0]);

$stmt->execute();

根据docs,对字符串使用s,对整数使用i,对双精度/小数使用d

【讨论】:

以上是关于PHP:CSV 导入 MYSQL 总是少于 CSV 文件中的实际行数?的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP/MySQL 导入 CSV 数据

PHP/MySQL:导入 CSV,所有日期和十进制值都为空,零

通过phpmyadmin将csv文件导入mysql

PHP Laravel:如何在将 xl/csv 导入 mysql 时避免重复数据?

需要通过 PHP 将大型 CSV 文件导入多个 MySQL 表的高效方法

用php导入10W条+ 级别的csv大文件数据到mysql。导出10W+级别数据到csv文件