PHP 使用表单验证器时出错
PHP Errors when using form validator
我在使用联系表时遇到了以下 PHP 错误,在客户说他们一周后没有收到电子邮件之前,它工作正常。作为一个朋友帮我做后端,他现在没空问,我想问问你是否可以给我一个提示,我需要修复什么。
错误:
`[Wed Feb 17 16:43:44 2016] [warn] [client 37.24.118.150] mod_fcgid: stderr: PHP 注意:未定义变量: headers in /var/www/vhosts/wscgmbh.de/httpdocs/php/contact-form-handler.php 第 29 行,referer:http://www.wscgmbh.de/contact.html
[Wed Feb 17 16:43:44 2016] [warn] [client 37.24.118.150] mod_fcgid: stderr: PHP Warning: mail(): 发现多个或格式错误的换行符additional_header in /var/www/vhosts/wscgmbh.de/httpdocs/php/contact-form-handler.php 第 32 行,referer:http://www.wscgmbh.de/contact.html
[2016 年 2 月 17 日星期三 16:45:18 [警告] [客户端 37.24.118.150] mod_fcgid:stderr:PHP 注意:未定义变量:headers 在 /var/www/vhosts/wscgmbh.de/httpdocs/php/contact-form-handler.php 第 29 行,referer:http://www.wscgmbh.de/contact.html
[Wed Feb 17 16:45:18 2016] [warn] [client 37.24.118.150] mod_fcgid: stderr: PHP Warning: mail(): 发现多个或格式错误的换行符additional_header in /var/www/vhosts/wscgmbh.de/httpdocs/php/contact-form-handler.php 第 32 行,referer:http://www.wscgmbh.de/contact.html
[2016 年 2 月 17 日星期三 17:02:25 [警告] [客户端 37.24.118.150] mod_fcgid:stderr:PHP 注意:未定义索引:/var/www/vhosts/wscgmbh 中的名称.de/httpdocs/php/contact-form-handler.php 第 12
行
[2016 年 2 月 17 日星期三 17:02:25 [警告] [客户端 37.24.118.150] mod_fcgid:stderr:PHP 注意:未定义索引:/var/www/vhosts/wscgmbh 中的电子邮件.de/httpdocs/php/contact-form-handler.php 第 13
行
[2016 年 2 月 17 日星期三 17:02:25 [警告] [客户端 37.24.118.150] mod_fcgid:标准错误:PHP 注意:未定义的索引:/var/www/vhosts/wscgmbh 中的消息.de/httpdocs/php/contact-form-handler.php 第 14
行
[2016 年 2 月 18 日星期四 09:40:15 [警告] [客户端 213.23.122.15] mod_fcgid:stderr:PHP 注意:未定义变量:headers 在 /var/www/vhosts/wscgmbh.de/httpdocs/php/contact-form-handler.php 第 29 行,referer:http://www.wscgmbh.de/contact.html
[2 月 18 日星期四 09:40:15 2016] [警告] [客户端 213.23.122.15] mod_fcgid:stderr:PHP 警告:mail():在additional_header in /var/www/vhosts/wscgmbh.de/httpdocs/php/contact-form-handler.php 第 32 行,referer:http://www.wscgmbh.de/contact.html`
这是 form-handler 的代码,一直有效,但突然失效了
<meta http-equiv="Content-Type" content="text/html"; charset="utf-8" />
<?php
$errors = '';
$myemail = 'service@wscgmbh.de';
if(empty($_POST['name']) ||
empty($_POST['email']) ||
empty($_POST['message']))
{
$errors .= "\n Error: all fields are required";
}
$name = $_POST['name'];
$email_address = $_POST['email'];
$message = $_POST['message'];
if (!preg_match(
"/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z] {2,3})$/i",
$email_address))
{
$errors .= "\n Error: Invalid email address";
}
if( empty($errors))
{
$to = $myemail;
$email_subject = "Sie haben eine neue Nachricht von: $name";
$email_body = "Sie haben eine neue Nachricht erhalten, hier sind die Details: \n\nName: $name \nEmail: $email_address \nNachricht: \n$message";
$headers [] .= 'From: WSC-Kontaktformular' . "\r\n";
$headers [] = "Antworten Sie: {$email_address}";
mail($to,$email_subject,$email_body,implode("\r\n",$headers));
//redirect to the 'thank you' page
echo '<script>
alert("Danke für Ihre Nachricht. Wir werden uns bald bei melden!");
window.location = "http://www.wscgmbh.de"
</script>';
}
?>
我不是专家,PHP,所以我真的希望有人能帮助我!
非常感谢您!!!
这里的问题是你遗漏了(并将 header 声明为数组):
(另请参阅下面关于 Antworten Sie:
的 Edit)。
$headers = array();
放在上面:
$headers [] .= 'From: WSC-Kontaktformular' . "\r\n";
$headers [] = "Antworten Sie: {$email_address}";
您还需要删除点(连接)和 . "\r\n"
。
implode("\r\n",$headers)
会处理的。
$headers = array();
$headers [] = 'From: WSC-Kontaktformular';
$headers [] = "Antworten Sie: {$email_address}";
根据邮件手册的示例:
$headers = array();
$headers[] = "MIME-Version: 1.0";
$headers[] = "Content-type: text/plain; charset=iso-8859-1";
$headers[] = "From: Sender Name <sender@domain.com>";
$headers[] = "Bcc: JJ Chong <bcc@domain2.com>";
$headers[] = "Reply-To: Recipient Name <receiver@domain3.com>";
$headers[] = "Subject: {$subject}";
$headers[] = "X-Mailer: PHP/".phpversion();
mail($to, $subject, $email, implode("\r\n", $headers));
此外,From:
需要的是电子邮件而不是姓名,因此邮件可能因此而成为垃圾邮件。
- 使用电子邮件地址。
参考:
如果你想使用点(连接)和 \r\n
,那么你需要使用以下内容,并按照手册中的示例:
// To send HTML mail, the Content-type header must be set
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
// Additional headers
$headers .= 'To: Mary <mary@example.com>, Kelly <kelly@example.com>' . "\r\n";
$headers .= 'From: Birthday Reminder <birthday@example.com>' . "\r\n";
$headers .= 'Cc: birthdayarchive@example.com' . "\r\n";
$headers .= 'Bcc: birthdaycheck@example.com' . "\r\n";
// Mail it
mail($to, $subject, $message, $headers);
编辑:
我注意到 Antworten Sie:
这个词在德语中似乎是 "reply" 的意思(当我访问 Google 翻译时)。
如果它是 From:
或 Reply-to
,那么您不能将其用作邮件 header 的一部分,而是 Reply-To:
根据手册状态:
Reply-To: webmaster@example.com
因此,您的代码需要读作:
$headers = array();
$headers [] = 'From: WSC-Kontaktformular';
$headers [] = "Reply-To: {$email_address}";
这也是导致 header 失败的一个因素。
改变mail($to,$email_subject,$email_body,implode("\r\n",$headers));
至:
if(mail($to,$email_subject,$email_body,implode("\r\n",$headers))) {
echo "Mail sent.";
} else {
echo "Error.";
}
如果您看到 "Mail sent",那么 mail()
就完成了它的工作。还可以查看您的垃圾邮件。
将 error reporting 添加到您的文件的顶部,这将有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Then the rest of your code
旁注:显示错误只应在试运行中进行,绝不能在生产中进行。
考虑使用 PHPMailer 或 Swiftmailer:
它们是 PHP 的 mail()
功能的替代品。
我在使用联系表时遇到了以下 PHP 错误,在客户说他们一周后没有收到电子邮件之前,它工作正常。作为一个朋友帮我做后端,他现在没空问,我想问问你是否可以给我一个提示,我需要修复什么。
错误:
`[Wed Feb 17 16:43:44 2016] [warn] [client 37.24.118.150] mod_fcgid: stderr: PHP 注意:未定义变量: headers in /var/www/vhosts/wscgmbh.de/httpdocs/php/contact-form-handler.php 第 29 行,referer:http://www.wscgmbh.de/contact.html
[Wed Feb 17 16:43:44 2016] [warn] [client 37.24.118.150] mod_fcgid: stderr: PHP Warning: mail(): 发现多个或格式错误的换行符additional_header in /var/www/vhosts/wscgmbh.de/httpdocs/php/contact-form-handler.php 第 32 行,referer:http://www.wscgmbh.de/contact.html
[2016 年 2 月 17 日星期三 16:45:18 [警告] [客户端 37.24.118.150] mod_fcgid:stderr:PHP 注意:未定义变量:headers 在 /var/www/vhosts/wscgmbh.de/httpdocs/php/contact-form-handler.php 第 29 行,referer:http://www.wscgmbh.de/contact.html
[Wed Feb 17 16:45:18 2016] [warn] [client 37.24.118.150] mod_fcgid: stderr: PHP Warning: mail(): 发现多个或格式错误的换行符additional_header in /var/www/vhosts/wscgmbh.de/httpdocs/php/contact-form-handler.php 第 32 行,referer:http://www.wscgmbh.de/contact.html
[2016 年 2 月 17 日星期三 17:02:25 [警告] [客户端 37.24.118.150] mod_fcgid:stderr:PHP 注意:未定义索引:/var/www/vhosts/wscgmbh 中的名称.de/httpdocs/php/contact-form-handler.php 第 12
行[2016 年 2 月 17 日星期三 17:02:25 [警告] [客户端 37.24.118.150] mod_fcgid:stderr:PHP 注意:未定义索引:/var/www/vhosts/wscgmbh 中的电子邮件.de/httpdocs/php/contact-form-handler.php 第 13
行[2016 年 2 月 17 日星期三 17:02:25 [警告] [客户端 37.24.118.150] mod_fcgid:标准错误:PHP 注意:未定义的索引:/var/www/vhosts/wscgmbh 中的消息.de/httpdocs/php/contact-form-handler.php 第 14
行[2016 年 2 月 18 日星期四 09:40:15 [警告] [客户端 213.23.122.15] mod_fcgid:stderr:PHP 注意:未定义变量:headers 在 /var/www/vhosts/wscgmbh.de/httpdocs/php/contact-form-handler.php 第 29 行,referer:http://www.wscgmbh.de/contact.html
[2 月 18 日星期四 09:40:15 2016] [警告] [客户端 213.23.122.15] mod_fcgid:stderr:PHP 警告:mail():在additional_header in /var/www/vhosts/wscgmbh.de/httpdocs/php/contact-form-handler.php 第 32 行,referer:http://www.wscgmbh.de/contact.html`
这是 form-handler 的代码,一直有效,但突然失效了
<meta http-equiv="Content-Type" content="text/html"; charset="utf-8" />
<?php
$errors = '';
$myemail = 'service@wscgmbh.de';
if(empty($_POST['name']) ||
empty($_POST['email']) ||
empty($_POST['message']))
{
$errors .= "\n Error: all fields are required";
}
$name = $_POST['name'];
$email_address = $_POST['email'];
$message = $_POST['message'];
if (!preg_match(
"/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z] {2,3})$/i",
$email_address))
{
$errors .= "\n Error: Invalid email address";
}
if( empty($errors))
{
$to = $myemail;
$email_subject = "Sie haben eine neue Nachricht von: $name";
$email_body = "Sie haben eine neue Nachricht erhalten, hier sind die Details: \n\nName: $name \nEmail: $email_address \nNachricht: \n$message";
$headers [] .= 'From: WSC-Kontaktformular' . "\r\n";
$headers [] = "Antworten Sie: {$email_address}";
mail($to,$email_subject,$email_body,implode("\r\n",$headers));
//redirect to the 'thank you' page
echo '<script>
alert("Danke für Ihre Nachricht. Wir werden uns bald bei melden!");
window.location = "http://www.wscgmbh.de"
</script>';
}
?>
我不是专家,PHP,所以我真的希望有人能帮助我! 非常感谢您!!!
这里的问题是你遗漏了(并将 header 声明为数组):
(另请参阅下面关于 Antworten Sie:
的 Edit)。
$headers = array();
放在上面:
$headers [] .= 'From: WSC-Kontaktformular' . "\r\n";
$headers [] = "Antworten Sie: {$email_address}";
您还需要删除点(连接)和 . "\r\n"
。
implode("\r\n",$headers)
会处理的。
$headers = array();
$headers [] = 'From: WSC-Kontaktformular';
$headers [] = "Antworten Sie: {$email_address}";
根据邮件手册的示例:
$headers = array();
$headers[] = "MIME-Version: 1.0";
$headers[] = "Content-type: text/plain; charset=iso-8859-1";
$headers[] = "From: Sender Name <sender@domain.com>";
$headers[] = "Bcc: JJ Chong <bcc@domain2.com>";
$headers[] = "Reply-To: Recipient Name <receiver@domain3.com>";
$headers[] = "Subject: {$subject}";
$headers[] = "X-Mailer: PHP/".phpversion();
mail($to, $subject, $email, implode("\r\n", $headers));
此外,From:
需要的是电子邮件而不是姓名,因此邮件可能因此而成为垃圾邮件。
- 使用电子邮件地址。
参考:
如果你想使用点(连接)和 \r\n
,那么你需要使用以下内容,并按照手册中的示例:
// To send HTML mail, the Content-type header must be set
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
// Additional headers
$headers .= 'To: Mary <mary@example.com>, Kelly <kelly@example.com>' . "\r\n";
$headers .= 'From: Birthday Reminder <birthday@example.com>' . "\r\n";
$headers .= 'Cc: birthdayarchive@example.com' . "\r\n";
$headers .= 'Bcc: birthdaycheck@example.com' . "\r\n";
// Mail it
mail($to, $subject, $message, $headers);
编辑:
我注意到 Antworten Sie:
这个词在德语中似乎是 "reply" 的意思(当我访问 Google 翻译时)。
如果它是 From:
或 Reply-to
,那么您不能将其用作邮件 header 的一部分,而是 Reply-To:
根据手册状态:
Reply-To: webmaster@example.com
因此,您的代码需要读作:
$headers = array();
$headers [] = 'From: WSC-Kontaktformular';
$headers [] = "Reply-To: {$email_address}";
这也是导致 header 失败的一个因素。
改变mail($to,$email_subject,$email_body,implode("\r\n",$headers));
至:
if(mail($to,$email_subject,$email_body,implode("\r\n",$headers))) {
echo "Mail sent.";
} else {
echo "Error.";
}
如果您看到 "Mail sent",那么 mail()
就完成了它的工作。还可以查看您的垃圾邮件。
将 error reporting 添加到您的文件的顶部,这将有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Then the rest of your code
旁注:显示错误只应在试运行中进行,绝不能在生产中进行。
考虑使用 PHPMailer 或 Swiftmailer:
它们是 PHP 的 mail()
功能的替代品。