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 Laravel:如何在将 xl/csv 导入 mysql 时避免重复数据?