我一直试图让它与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
-
您总是需要调用
fopen
——即使该文件存在。删除它周围的if语句。 -
您只是将
strVal
设置为csvData的最后一个值。只需将fwrite行替换为fputcsv($filehandle,$csvData);