2015-03-19 370 views
1

你好,我很新的PHP,我想讓網頁的用戶上傳一個csv文件,然後將行存儲到MySQL行。除了cvs文件在每行末尾留下逗號,導致最後一個單元格和下一行的第一個單元格合併之外,一切都很好。我哪裏錯了?謝謝!PHP讀取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); 

這裏是正在上傳的文件示例:

類別編號,問,答一句,答二,回答三個,答案四,正確答案

1,是CSV文件的工作?,是,否,也許,ehhh,1

1,這是非常酷黨?,是,否,也許,ehhh,4

在細胞「正確答案」上面的CSV文件合併到下一個「1」,「1」和「1」

謝謝!

+0

你fgetcsv看起來沒有足夠的參數。 $ line_of_text = fgetcsv($ file_handle,1024,「,」); – TBridges 2015-03-19 01:39:33

+1

您是否嘗試過啓用'auto_detect_line_endings',正如'fgetcsv'手冊所示? – CBroe 2015-03-19 01:41:53

回答

1

這應該工作。

基本上我將fopen()更改爲file(),以便每個csv行將是它自己的數組元素$csv_rowsfile()函數對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:

注:如果在讀 文件打開或創建時由Macintosh計算機,使PHP沒有正確認識到行結束 auto_detect_line_endings運行時配置選項可能有助於 解決問題。

如果你最終需要這一點,它可以在你的PHP腳本中使用此命令的頂端設置:

ini_set('auto_detect_line_endings', true);

+0

我只能想到幾件事情。 1.)如果您使用的是Mac/Apple計算機,請重新保存CSV的全新副本,但請確保將其保存爲'文件類型'Windows'逗號分隔值'。 CSV文件有許多不同的風格。 2.)循環內的'var_dump($ _ row_field_data);'是什麼給你的? 'foreach'只能執行一次,正如@tNeate所說的那樣。行數據看起來是否正常?此外,它做了多少次轉儲,是否與您在CSV中期望的行數相同? – FactoryAidan 2015-03-19 02:05:12

+0

啊,我可能會看到它。我們在循環中有'header()'。如果在第一次循環迭代結束時將它發送到新頁面,我很懷疑,所以它永遠不會進行第二次迭代。嘗試在'endforeach之後移動'header()'命令;'我更新了答案以重新排列一些語句。 – FactoryAidan 2015-03-19 02:09:07

+0

是的,查看更新的答案。我在'foreach()'聲明中添加了一個'$ _key'賦值。然後用'if()'語句跳過行'0'。 'foreach($ csv_rows as $ _key => $ _row): \t if($ _key == 0)continue;' – FactoryAidan 2015-03-19 02:30:14