联系表格 PHP 重定向不起作用
Posted
技术标签:
【中文标题】联系表格 PHP 重定向不起作用【英文标题】:contact form PHP redirect is not working 【发布时间】:2012-10-04 18:38:49 【问题描述】:我在联系表单上提交消息后尝试重定向到我的主页,表单发送电子邮件但我收到此消息:
Array
(
[name] => Abdo
[company] => Mediabyrån A&B
[email] => a.el-madhoun@hotmail.com
[content] => Hejsan
[contact_to] => info@web.se
)
警告:无法修改标头信息 - 标头已由 (输出开始于 /customers/4/5/a/webelite.se/httpd.www/kontakt.php:3) 在 /customers/4/5/a/webelite.se/httpd.www/kontakt.php 在第 39 行
我的联系表;
<form action="kontakt.php" method="post">
<p><input type="text" required="required" id="name" name="name" class="text_input" size="22" />
<label for="name">Namn *</label></p>
<p><input type="text" required="required" id="company" name="company" class="text_input" size="22" />
<label for="company">Företag *</label></p>
<p><input type="email" required="required" id="email" name="email" class="text_input" size="22" />
<label for="email">Epost *</label></p>
<p><textarea required="required" name="content" class="textarea" cols="30" rows="5"></textarea></p>
<p><button type="submit" class="button white"><span>Skicka</span></button></p>
<input type="hidden" value="info@web.se" name="contact_to"/>
</form>
这是我的 PHP:
<?php
echo $name = $_POST['name'];
echo $company = $_POST['company'];
echo $email = $_POST['email'];
echo $content = $_POST['content'];
$mail_to = 'info@webelite.se';
$subject = 'Lilla form'.$name;
$body_message = 'From: '. $name . "\n";
$body_message .= 'company: '. $company . "\n";
$body_message .= 'E-mail: '. $email ."\n";
$body_message .= 'Message: '. $content;
$headers = 'From: '. $mail_name . "\r\n";
$headers .= 'Reply-To: '. $email ."\r\n";
$success = mail($mail_to, $subject, $body_message, $headers);
echo "<pre>";
print_r($_POST);
header('Location:mydomain');
?>
我也试过用 if
($success)
print "<meta http-equiv=\"refresh\" content=\"0;URL=YOUR_PAGE_HERE.html\">";
这行得通,但在点击提交和被重定向之间我有一个难看的半秒闪现。
所有帮助都会得到帮助。
谢谢
【问题讨论】:
【参考方案1】:在重定向之前你不能在屏幕上输出任何东西。
删除你所有的 echo
'es 和 print_r
's 就可以了。
编辑:
正如@jhonraymos 提到的,请务必正确使用header()
。也许您更改了此设置以隐藏您要重定向到的实际页面。添加具有正确路径定义的本地文件,或者如果重定向到其他域,则需要定义完整的 url。如有疑问,请参阅Uniform resource locator。
另一个编辑:
我看到你更新了你的问题。别再尝试印度魔法了,比如
if ($success)
print "<meta http-equiv=\"refresh\" content=\"0;URL=YOUR_PAGE_HERE.html\">";
只要接受在headers()
之前不要将ANYTHING输出到屏幕上的事实,你的灵魂就会永远安全。这不是混合 http-meta 的地方。PHP 可以做到这一点。
这听起来可能首先是一个限制,但相信我,它不是。这是一种祝福。
【讨论】:
所以标题首先出现在我的 php 中并删除了回声? 标头实际上可以留在原处。在调用header()
之前不要在屏幕上输出任何内容【参考方案2】:
标头用于与客户的浏览器进行通信。它们就像浏览器在收到时将执行的小命令。当您输出任何数据(文本、数字等)时,您的客户端浏览器将打印该数据。之后,浏览器将不再对您发送的任何标头感兴趣。
header()
函数是用于发送自定义标头的函数。因此,当调用此函数时,标头会发送到客户端的浏览器。
现在您对自己实际尝试做的事情有了一个非常简要的了解,您应该能够看到问题所在。
在发送这些自定义标头之前,您正在输出其他数据。这就是触发错误的原因。
所以这个:
echo "<pre>";
print_r($_POST);
不应该在此之前:
header('Location:mydomain');
【讨论】:
【参考方案3】:这是错误
print_r($_POST);
header('Location:mydomain');
你在header("location: mydomain.com")
之前打印一些东西
【讨论】:
【参考方案4】:是的,您不应该回显,在header
之前打印任何内容
尝试将其放在页面顶部:
<?php ob_start(); ?>
然后在页面底部放置:
<?php ob_end_flush(); ?>
【讨论】:
谢谢它的工作,你们是最好的,快速的帮助和对菜鸟的好建议......谢谢 虽然这可能行得通,但我真的建议您不要将其作为一种编程习惯,因为它是不,不,不。 @user1741191 最后使用 ob_end_flush()。 @user1741191 正如 budwiser 所说,这不是一个好的编程方法【参考方案5】:什么
echo "<pre>";
print_r($_POST);
是为了?
您的重定向可能发生在调用任何回显函数之前,不是吗?
【讨论】:
echo "<pre>"; print_r($_POST);
显然是为了调试$_POST
中的数据。 OP 只是没有意识到这会阻止修改标题。【参考方案6】:
这是 php 中很常见的问题。一些整理方法:
在页面顶部使用。
检查是否不小心在 php 打开标记之前或 php 关闭标记之后添加了一些空格。
如果还是不能解决,用java-script window.location代替header。
希望对您有所帮助。 编码愉快!
【讨论】:
【参考方案7】:您收到此警告是因为您将变量的值输出到屏幕并在此之后使用header
重定向。
标题不能发送之后您打印的东西(echo
,print_r
...)。
为了修复它,请按照下一个代码:
$name = $_POST['name']; //no echo
$company = $_POST['company'];//no echo
$email = $_POST['email'];//no echo
$content = $_POST['content'];//no echo
$mail_to = 'info@webelite.se';
$subject = 'Lilla form'.$name;
$body_message = 'From: '. $name . "\n";
$body_message .= 'company: '. $company . "\n";
$body_message .= 'E-mail: '. $email ."\n";
$body_message .= 'Message: '. $content;
$headers = 'From: '. $mail_name . "\r\n";
$headers .= 'Reply-To: '. $email ."\r\n";
$success = mail($mail_to, $subject, $body_message, $headers);
//echo "<pre>";
//print_r($_POST);
【讨论】:
以上是关于联系表格 PHP 重定向不起作用的主要内容,如果未能解决你的问题,请参考以下文章