Php 上载CSV文件并导入mysql时出错
我使用以下脚本将数据从CSV文件导入mysql数据库。CSV的设置如下所示:Php 上载CSV文件并导入mysql时出错,php,mysql,csv,fopen,Php,Mysql,Csv,Fopen,我使用以下脚本将数据从CSV文件导入mysql数据库。CSV的设置如下所示: Name Postcode fred hd435hg bob dh345fj name,postcode frank,ng435tj 以上是excel中的外观,在记事本中查看原始csv格式时,外观如下: Name Postcode fred hd435hg bob dh345fj name,postcode frank,ng435tj 我遇到的问题是,出于某种原因,邮政编码列根本没有被导入,同时
Name Postcode
fred hd435hg
bob dh345fj
name,postcode
frank,ng435tj
以上是excel中的外观,在记事本中查看原始csv格式时,外观如下:
Name Postcode
fred hd435hg
bob dh345fj
name,postcode
frank,ng435tj
我遇到的问题是,出于某种原因,邮政编码列根本没有被导入,同时标题行也作为记录导入,是否可以使其跳过第一行?。我已经看过了代码,不明白为什么邮政编码没有被拉进来,这很奇怪
<?php
//database connect info here
//check for file upload
if(isset($_FILES['csv_file']) && is_uploaded_file($_FILES['csv_file']['tmp_name'])){
//upload directory
$upload_dir = "./csv";
//create file name
$file_path = $upload_dir . $_FILES['csv_file']['name'];
//move uploaded file to upload dir
if (!move_uploaded_file($_FILES['csv_file']['tmp_name'], $file_path)) {
//error moving upload file
echo "Error moving file upload";
}
//open the csv file for reading
$handle = fopen($file_path, 'r');
while (($data = fgetcsv($handle, 1000, ',')) !== FALSE) {
//Access field data in $data array ex.
$name = $data[0];
$postcode = $data[1];
//Use data to insert into db
$sql = sprintf("INSERT INTO test (name, postcode) VALUES ('%s',%d)",
mysql_real_escape_string($name),
$postcode
);
mysql_query($sql) or (mysql_query("ROLLBACK") and die(mysql_error() . " - $sql"));
}
//delete csv file
unlink($file_path);
}
?>
您的CSV文件实际上似乎是一个TSV文件。它不使用逗号,而是使用制表符来分隔字段
因此,您需要更改呼叫。使用以下选项卡代替,”
:
while (($data = fgetcsv($handle, 1000, "\t") ...
要同时跳过标题行,请在while块之前添加另一个fauxfgetcsv
:
fgetcsv($handle);
while (...) {
这将跳过第一行。(简单的fgets
也可以。)
哦,刚刚注意到:邮政编码也可能会被删除,因为您使用$postcode
占位符%d
将其作为小数点压缩到字符串中。如果该字段实际上包含lettery,如您的示例中所示,那么这将不起作用。-尽管我认为这只是一个错误的打印输出示例。试试这个
$file = $_FILES['file']['tmp_name'];
$handle = fopen($file,"r");
while(($fileop = fgetcsv($handle,1000,",")) !==false)
{
$username = $fileop[0];
$name = $fileop[1];
$address = $fileop[2];
$sql = mysql_query("INSERT INTO ...... ");
}
嗨,对不起,那是因为我在excel中打开它,如果我在记事本中打开它,它看起来是这样的哦,好的。那么请忽略我目前为止的所有理论。但是邮政编码实际上包含字母吗?还是像人们对邮政编码所假设的那样是数字的?顺便问一下,英国邮政编码有数字和字母,那么正确的sprintf占位符是什么呢?您确实需要使用%s
和mysql转义函数,就像第一个字段一样。(如果您想在将来节省一些时间,这可能是一个很好的研究机会。比sprintf和手动转义简单得多。)