fwrite或fputcsv有什么问题

  • 本文关键字:问题 fputcsv fwrite php
  • 更新时间 :
  • 英文 :


我一直试图让它与fwrite或fputcsv一起工作,但我总是收到指向参数的错误。我是php的新手,但我试着进行实验,看看它能做什么。但到目前为止,它要么因为参数而不起作用,要么没有写入文件(csv文件上没有任何内容)。

我有一个大问题。如何在将所有数据写入三列的同时将文本显示在列(姓名、电子邮件和评论)中

$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为resource,null。我根据两个输入进行了更改。但进展并不顺利。

编辑#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

"非常感谢你,"爸爸。我还有最后一个问题你知道如何将变量传递给mail()吗?例如,在生成/写入csv之后,mail()应该将所有数据发送给user/admin。

到目前为止,我已经成功了,但兴趣仍然没有显示所选的复选框,而是打印类似csv的"数组"。

$interest=$_POST[兴趣];

这高于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 nnEmail: $email nnInterest $interest nnComments: $comments";
        $userbody = "";
        $headers = 'From: '.$name.' ' . "rn" . 'Reply-To: ' . $emailTo;
        //$headers .= 'Bcc: email2@example.com' . "rn";
        //$headers .= 'Bcc: email3@example.com' . "rn";
        wp_mail($emailTo, $subject, $body, $headers);
        wp_mail($email,$thanksubject, $body, $headers);
        $emailSent = true;

这是在写入csv之后。如果没有诸如空白字段之类的错误,它将被发送$interest只注册一个数组,例如,如果我选中所有复选框,它将在电子邮件中显示所有复选框。到目前为止,我进行了测试,它只显示了最后一个复选框。你知道我哪里错了吗?

更新

我已经弄清楚了,并设法将复选框的值写入csv和电子邮件中。

这将起作用,它接受数组并自动将其转换为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 ."rn" ;
                $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);

谢谢:)

您想要这样做:

$csvData = array($name,$email,$comment);
$strVal = implode(';', $csvData);
$filename='I-have-question.csv';
file_put_contents($filename, $strVal, FILE_APPEND | LOCK_EX);

您的代码不起作用的原因:

  • foreach-循环的每次迭代中,都会覆盖$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;john.smith@johnsmith.com;I like cheeseburgers
  1. 您总是需要调用fopen——即使该文件存在。删除它周围的if语句。

  2. 您只是将strVal设置为csvData的最后一个值。只需将fwrite行替换为

    fputcsv($filehandle,$csvData);

最新更新