你好我是PHP新手,我试图让网页用户上传一个csv文件,然后将这些行存储到MySQL行中。一切都很好,除了cvs文件在每一行的末尾省略逗号,导致最后一个单元格和下一行的第一个单元格合并。我哪里错了?谢谢!
PHP文件,在提交表单时执行:
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$file_handle = fopen($target_file, "r");
while (!feof($file_handle) ) {
$line_of_text = fgetcsv($file_handle, 1024);
//print $line_of_text[0] . $line_of_text[1]. $line_of_text[2] . "<BR>";
$arrlength = count($line_of_text);
for($x = 0; $x < $arrlength; $x = $x + 1){
echo $x. " ".$line_of_text[$x]. "<br>";
}
for($x = 7; $x < $arrlength; $x = $x + 6) {
$insertSQL = sprintf("INSERT INTO `tooneate_MyTrivia`.`Question` (
`CategoryId`,
`Question`,
`Group`,
`AnsOne`,
`AnsTwo`,
`AnsThree`,
`AnsFour`,
`CorrectAns`) VALUES (%d, %s, %s, %s, %s, %s, %s, %d)",
GetSQLValueString($line_of_text[$x], "int"),//CatId
GetSQLValueString($line_of_text[$x+1], "text"),//Question
GetSQLValueString("1", "text"),//Group
GetSQLValueString($line_of_text[$x+2], "text"),//AnsOne
GetSQLValueString($line_of_text[$x+3], "text"),//AnsTwo
GetSQLValueString($line_of_text[$x+4], "text"),//AnsThree
GetSQLValueString($line_of_text[$x+5], "text"),//AnsFour
GetSQLValueString($line_of_text[$x+6], "int"));//CorrectAns
echo $insertSQL;
echo "<br>";
mysql_select_db($database_TooNeate, $TooNeate);
$Result1 = mysql_query($insertSQL, $TooNeate) or die(mysql_error());
$insertGoTo = "MyTrivia.php";
if (isset($_SERVER['QUERY_STRING'])) {
$insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
$insertGoTo .= $_SERVER['QUERY_STRING'];
}
header(sprintf("Location: %s", $insertGoTo));
}
}
fclose($file_handle);
以下是上传的示例csv文件:
类别ID,问题,答案1,答案2,答案3,答案4,正确答案
1,CSV文件是否正常工作?,是,否,可能,嗯,1
1,这真的很酷吗?是的,不,也许,呃,4
在上面的csv文件中,单元格“正确答案”与下一个“1”合并,“1”与“1”合并
谢谢!
答案 0 :(得分:1)
这应该有用。
基本上我将fopen()
更改为file()
,以便每个csv行都是$csv_rows
中自己的数组元素。 file()
函数对newline
敏感,以表示结束的行,以处理您遇到丢失,
的位置。
然后在循环内部,我使用PHP str_getcsv()
函数将行数据拆分为自己的数组。
<?php
$target_dir = '';
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
move_uploaded_file($_FILES["fileToUpload"]['tmp_name'],$target_file);
ini_set('auto_detect_line_endings', true); // Optional if you need it
$csv_rows = file($target_file);
mysql_select_db($database_TooNeate, $TooNeate);
foreach( $csv_rows as $_key => $_row ):
if($_key==0) continue; // Skip header row
$_row_field_data = str_getcsv($_row);
$insertSQL = sprintf("INSERT INTO `tooneate_MyTrivia`.`Question` (
`CategoryId`,
`Question`,
`Group`,
`AnsOne`,
`AnsTwo`,
`AnsThree`,
`AnsFour`,
`CorrectAns`) VALUES (%d, %s, %s, %s, %s, %s, %s, %d)",
GetSQLValueString($_row_field_data[0], "int"),//CatId
GetSQLValueString($_row_field_data[1], "text"),//Question
GetSQLValueString("1", "text"),//Group
GetSQLValueString($_row_field_data[2], "text"),//AnsOne
GetSQLValueString($_row_field_data[3], "text"),//AnsTwo
GetSQLValueString($_row_field_data[4], "text"),//AnsThree
GetSQLValueString($_row_field_data[5], "text"),//AnsFour
GetSQLValueString($_row_field_data[6], "int"));//CorrectAns
echo $insertSQL;
echo "<br/>";
$Result1 = mysql_query($insertSQL, $TooNeate) or die(mysql_error());
endforeach;
$insertGoTo = "MyTrivia.php";
if (isset($_SERVER['QUERY_STRING'])):
$insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
$insertGoTo .= $_SERVER['QUERY_STRING'];
endif;
//header(sprintf("Location: %s", $insertGoTo)); // Uncomment this when you're ready for production.
?>
正如@CBroe在评论中提到的那样:
注意:如果PHP在阅读时没有正确识别行结尾 Macintosh计算机上或由Macintosh计算机创建的文件,启用
auto_detect_line_endings
运行时配置选项可能有所帮助 解决问题。
如果您最终需要这个,可以使用以下命令将其设置在PHP脚本的顶部:
ini_set('auto_detect_line_endings', true);