2012-03-27 64 views
1

我一直在努力使它與fwrite或fputcsv一起工作,但我總是得到指向參數的錯誤。我在PHP新手,但我嘗試嘗試,看看它做了什麼。但到目前爲止,它不是因爲參數或不寫入文件而工作(csv文件上沒有任何內容)。fwrite或fputcsv有什麼問題

我有一個大問題。如何在將所有數據寫入三列的同時在列(名稱,電子郵件和註釋)中顯示文本?

$csvData = array($name,$email,$comment); 
     foreach($csvData as $key => $val) 
     { 
      $strVal = $val; 

     } 
     print $strVal; 
     $fileHandle=""; 
     $filename='I-have-question.csv'; 
     if(!file_exists($filename)){ 
      $fileHandle = fopen($filename, "a+"); 
     } 

     fwrite($fileHandle, $strVal); 
     fclose($fileHandle); 

洞察/指導將不勝感激。感謝

編輯

$name=$_POST['contactName']; 
     $email=$_POST['email']; 
     $comment=$_POST['comment']; 


     $csvData = array($name,$email,$comment); 
     $csvCol = array ('name', 'email', 'comment'); 

     $strVal=''; 
     foreach($csvData as $key => $val) 
     { 
      $strVal .= $val; 

     } 
     print $strVal; 
     $fileHandle=""; 
     $filename='I-have-question.csv'; 

      $fileHandle = fopen($filename, "a+"); 


     fputcsv($filehandle,$csvData); 
     fclose($fileHandle); 

現在的錯誤說:警告:fputcsv()預計參數1是資源,爲空。我根據兩個輸入進行了更改。但它並不順利。

編輯#2

謝謝@Baba和@Quasdunk的投入。剩下的唯一問題是如何將$ csvCol數組引入到每列的第一行,以便可以在此之後添加/寫入csvData。只有一次csvcol。我該如何去做呢?

編輯#3 非常感謝您的幫助。我調查了在用戶點擊鏈接後從瀏覽器下載csv - 是否可以在相同的代碼中執行此操作?或者我硬編碼到csv的鏈接?只是個小疑問。我看到有關可下載的csv的地方,我點擊提交按鈕,然後彈出文件保存 - 這不是我想要的,但我只需要通過鏈接從服務器下載csv文件。

編輯#4

再次感謝您,@Baba和@Quasdunk的投入。

if(isset($_POST[$interest])) 
    { 
     foreach ($interest as $interests) 
     { 
      $interest = $interests . " ,"; 
     } 
    } 

然後以CSV,這表明 「陣列」,而不是複選框的值,即1,2,3,4

$csvData = array($name,$email,$comment,array($interest)); 

我在哪裏出了毛病呢?

編輯#5

非常感謝你,@Baba。我有最後一個問題 你知道如何將變量傳遞給mail()嗎?例如,在創建/寫入csv後,mail()應將所有數據發送給用戶/管理員。

到目前爲止,我得到了它的工作,但興趣仍然沒有顯示選定的複選框 - 而是打印類似於csv的「陣列」。

$ interest = $ _ POST ['interests'];

這是在forceheader函數之上。

$emailTo = get_option('tz_email'); 
     if (!isset($emailTo) || ($emailTo == '')){ 
      $emailTo = get_option('admin_email'); 
     } 
     $subject = 'I Have A Question to Ask from '.$name; 
     $thanksubject = 'Thank you for the Form Submission'; 
     $body = "Name: $name \n\nEmail: $email \n\nInterest $interest \n\nComments: $comments"; 
     $userbody = ""; 
     $headers = 'From: '.$name.' ' . "\r\n" . 'Reply-To: ' . $emailTo; 
     //$headers .= 'Bcc: [email protected]' . "\r\n"; 
     //$headers .= 'Bcc: [email protected]' . "\r\n"; 

     wp_mail($emailTo, $subject, $body, $headers); 
     wp_mail($email,$thanksubject, $body, $headers); 
     $emailSent = true; 

這是在寫入csv後。如果沒有空白字段等錯誤,它將被髮送。 $ interest僅註冊一個數組,例如,如果我選擇所有複選框,它將顯示全部電子郵件。到目前爲止,我測試過,它只顯示最後一個複選框。你知道我錯了哪裏?

修訂

我已經想通了,並設法寫的複選框值CSV和發送的電子郵件以及。

+0

讓我來猜猜:這個問題只出現如果沒有意見吧? :)在你的'foreach'循環中,你在每次迭代中給'$ strVal'一個新的值,但是你想要連接字符串。因此,在循環之前定義'$ strVal =''; **'並在循環內部執行'$ strVal。= $ val;'(注意句號)。另外,如果文件存在,則不會寫入任何內容......您不必檢查它是否存在,'fopen()'會自動爲您創建它。 – Quasdunk 2012-03-27 09:54:54

+0

查看編輯#2和編輯#3的更新代碼 – Baba 2012-03-27 11:47:08

+0

@Baba - 看到更新後的代碼,我嘗試修改代碼 - 除了感興趣的部分以外,它正常工作。有什麼方法可以追加興趣陣列嗎? – joe 2012-03-28 07:37:39

回答

2

這會工作,其接受陣列並將其轉換爲CSV自動

$csvData = array($name,$email,$comment); 
    $filename='I-have-question.csv'; 
    $isNew = (file_exists($filename) || is_file($filename)) ? false : true ; 
    touch($filename); //Sets access and modification time of file and If the file does not exist, Create it. 
    $fp = fopen($filename, 'w'); 
    if($isNew) //Add header Information if its new 
    { 
     fputcsv($fp , array ('NAME', 'EMAIL', 'COMMENT')); 
    } 
    fputcsv($fp, $csvData); 
    fclose($fp); 


    //To Force CSV downlaod 
    header("Content-type: application/csv"); 
    header("Content-Disposition: attachment; filename=file.csv"); 
    header("Pragma: no-cache"); 
    header("Expires: 0"); 
    readfile($filename); 

一個新的概念,總是強迫頭信息,即使它沒有前

 $csvData = array($name,$email,$comment); 
     $filename='I-have-question.csv'; 
     $isNew = (file_exists($filename) || is_file($filename)) ? false : true ; 
     touch($filename); //Sets access and modification time of file and If the file does not exist, Create it. 
     $fp = fopen($filename, 'a'); 
     forceHeader(array ('NAME', 'EMAIL', 'COMMENT'),$filename); 
     fputcsv($fp, $csvData); 
     fclose($fp); 




     function forceHeader(Array $headerParam,$csvFile) 
     { 
      $headerParam = implode(",", $headerParam); 
      $fileHeader = file_get_contents($csvFile, NULL, NULL, 0, strlen($headerParam)); 
      if($headerParam != $fileHeader) 
      { 
       $content = $headerParam ."\r\n" ; 
       $content .= file_get_contents($csvFile, NULL, NULL, strlen($headerParam) + 2); 
       file_put_contents($csvFile,$content); 
      } 

     } 
存在

= ===感興趣=====

$interest = isset($_POST[$interest]) ? implode("; " , $_POST[$interest]) : array(); 
$csvData = array($name,$email,$comment,$interest); 

感謝 :)

+0

謝謝,我會試試這個。另外,如何在將所有數據寫入三列的同時在列(名稱,電子郵件和註釋)中顯示文本? – joe 2012-03-27 10:23:32

+0

它會自動出現..只要繼續調用fputcsv($ fp,$ csvData);以相同的數組格式添加新的$數據 – Baba 2012-03-27 10:26:26

+0

我測試過,csvData出現在列中,而不是$ csvCol = array('name','email','comment')在最上面。有什麼方法可以在第一行中添加列標題文本? – joe 2012-03-27 10:28:45

0
  1. 您總是需要致電fopen - 即使文件存在。刪除它周圍的if語句。

  2. 您只是將strVal設置爲csvData的最後一個值。只需將fwrite行替換爲

    fputcsv($ filehandle,$ csvData);

2

你想這樣做:

$csvData = array($name,$email,$comment); 

$strVal = implode(';', $csvData); 

$filename='I-have-question.csv'; 

file_put_contents($filename, $strVal, FILE_APPEND | LOCK_EX); 

爲什麼你的代碼不起作用的原因:

  • 您在foreach -loop的每一次迭代覆蓋$strVal。但要附加一句:

    $strVal = ''; foreach(...) { $strval .= $val; //note the period }

  • 此行if(!file_exists($filename)){說:只寫東西到文件,如果不存在了。這工作正好一次:)但這不是你想要的。

關於你的第二個問題,我不太清楚,如果我找到你的權利。所以你想寫列名到文件的第一行,對嗎?如果是這樣,你的代碼可能是這個樣子:

$csvData = array($name,$email,$comment); 
$csvCol = array ('name', 'email', 'comment'); 

$filename='I-have-question.csv'; 

if(!file_exists($filename)){ 
    //if the file doesn't exist yet, create a new file and write the column names 
    file_put_contents($filename, implode(';', $csvCol) . "\n", FILE_APPEND | LOCK_EX); 
} 

file_put_contents($filename, implode(';', $csvData) . "\n", FILE_APPEND | LOCK_EX); 

或者,如@Baba指出的那樣,你也可以用fputcsv()代替file_put_contents()工作:

if(!file_exists($filename)){ 
    //if the file doesn't exist yet, create a new file and write the column names 
    $handle = fopen($filename,'w'); 
    fputcsv($handle, $csvCol,';'); 
    fclose($handle); 
} 

$handle = fopen($filename,'w'); 
fputcsv($handle, $csvData,';'); 
fclose($handle); 

請務必選擇適當的分隔符。默認的是','(逗號),但由於您也在處理可能包含逗號的用戶輸入,所以選擇另一個分隔符(如';')可能更明智。

在這兩種情況下,輸出應該是這個樣子:

name;email;comment 
John Smith;[email protected];I like cheeseburgers 
+0

謝謝,但有一個問題是如何將標題文本添加到頂部的列中,以便所有數據都在每列中顯示? – joe 2012-03-27 10:20:37

+0

@Josephine我已經更新了我的答案,希望它有幫助。 – Quasdunk 2012-03-27 11:05:58