2013-10-17 55 views
0

我已經制作了這個PHP腳本,它應該接受一個數組,併爲數組中的每個元素生成一個csv文件。不幸的是有些錯誤。它不存儲指定目錄中的任何文件。但它也不會返回任何錯誤。也許有人可以看到這個問題?上var_dump($ids);生成多個CSV文件 - mysql PHP

array(4) { 
    [0]=> 
    string(5) "t23ry" 
    [1]=> 
    string(5) "6us32" 
    [2]=> 
    string(5) "se43z" 
    [3]=> 
    string(5) "o00gq" 
} 
+0

'$ ids'的值是多少? 'var_dump($ ids);' – showdev

+0

根據PHP.net的文檔,json_decode的返回值是「混合的」。有時json_decode會返回一個對象。 – SamA

+0

什麼可能是你的文件沒有被寫入的問題是'$ filename =「temp/db_user_export _」中的'temp /'文件夾聲明。time()。「。csv」;' - 嘗試將它設置爲'$ filename =「db_user_export _」。time()。「。csv」;'用於測試目的。 –

回答

1

我找到了答案。經過長時間的搜索和播放的時候,我看到了這個功能

foreach($results as $row) 
    { 
      // amount of rows is unknown 
     $rows = $row->rowCount(); 
     $insert_array = array(); 
     for ($i=0; $i<=$rows; $i++) 
     { 
      // function goes here 
      $insert_array[] = $row[$i]; 
     } 

     fputcsv($handle, $insert_array); 
    } 

沒有因爲下面的工作:

  1. $rows = $row->rowCount();必須$rows = count($row);
  2. 串在返回的數字$row數組高於預期,所以我需要將我的選擇語句更改爲$results = $user_pdo->query("SELECT * FROM $table WHERE timestamp >= '$start' AND timestamp <= '$end'";, PDO::FETCH_NUM);。這隻會給我數字順序的行,這將使$row[$i] -> array工作。
  3. 另外,正如你所看到的,我改變了準備的語句爲一個查詢,而且改變了開始日期和結束日期變量爲未格式化。

這真的花了一些時間,但它終於工作。非常感謝所有支持人員。

+1

啊,是的,非常好。我很高興它終於解決了。我不知道還有什麼可以告訴你的。問題解決了:)乾杯('+ 1') –

0

fputcsv

$ids = json_decode($_POST['jsonarray']); // array sent with ajax 
$start = $_POST['start']; // date sent with ajax 
$end = $_POST['end']; // date sent with ajax 

$start_date = date('yyyy-mm-dd', strtotime($start)); // format dates to sql firendly 
$end_date = date('yyyy-mm-dd', strtotime($end)); 

$toZip = array(); // Prepare array to files for zip 

if(is_array($ids)) { 
    foreach ($ids as $key => $qr) 
    { 
     // Get labels first 
     // Here we prepare the first line in the .CSV file 
     $tb = $qr . '_labels'; 
     $sql = $user_pdo->query("SELECT * FROM $tb"); 
     $head_array = array('Log ID', 'Timestamp'); 
     while ($row = $sql->fetch(PDO::FETCH_ASSOC)) 
     { 
     // This array is the first line in the .CSV file 
      $head_array[] = $row['label']; 
     } 

     // Get ready for looping through the database 
     $table = $qr . '_data'; 
     $results = $user_pdo->prepare("SELECT * FROM $table WHERE timestamp BETWEEN :start_date AND :end_date;"); 
     $results->bindParam(':start_date', $start_date, PDO::PARAM_STR); 
     $results->bindParam(':end_date', $$end_date, PDO::PARAM_STR); 
     $results->execute(); 

     // Pick a filename and destination directory for the file 
     $filename = "temp/db_user_export_".time().".csv"; 

     // Actually create the file 
     // The w+ parameter will wipe out and overwrite any existing file with the same name 
     $handle = fopen($filename, 'w+'); 

     // Write the spreadsheet column titles/labels 
     fputcsv($handle, $head_array); 


     // Write all the user records to the spreadsheet 
     foreach($results as $row) 
     { 
       // amount of rows is unknown 
      $rows = $row->rowCount(); 
      $insert_array = array(); 
      for ($i=0; $i<=$rows; $i++) 
      { 
       // function goes here 
       $insert_array[] = $row[$i]; 
      } 

      fputcsv($handle, $insert_array); 
     } 

     // Finish writing the file 
     fclose($handle); 

     $toZip[] = $filename; 
    } 
} 

實施例僅輸出一次一條線。更改此:

 for ($i=0; $i<=$rows; $i++) 
     { 
      // function goes here 
      $insert_array[] = $row[$i]; 
     } 

     fputcsv($handle, $insert_array); 

要這樣:

 for ($i=0; $i<=$rows; $i++) 
     { 
      // function goes here 
      fputcsv($handle, $row[$i]); 
     } 
+0

我知道:)這就是爲什麼我編寫行之前,所有'$行['列']''的數組。 – Dimser

+0

給fputscsv一個數組數組不會導致所有的內容都是基於我在PHP.net文檔中看到的來編寫的。 – SamA