联系表格 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 "&lt;pre&gt;"; print_r($_POST); 显然是为了调试$_POST 中的数据。 OP 只是没有意识到这会阻止修改标题。【参考方案6】:

这是 php 中很常见的问题。一些整理方法:

    在页面顶部使用。

    检查是否不小心在 php 打开标记之前或 php 关闭标记之后添加了一些空格。

    如果还是不能解决,用java-script window.location代替header。

希望对您有所帮助。 编码愉快!

【讨论】:

【参考方案7】:

您收到此警告是因为您将变量的值输出到屏幕并在此之后使用header 重定向。

标题不能发送之后您打印的东西(echoprint_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 重定向不起作用的主要内容,如果未能解决你的问题,请参考以下文章

PHP重定向不起作用

我正在尝试将 PayPal 付款与 WordPress 中的联系表 7 集成,但我的重定向不起作用

在另一个页面中重定向时php会话不起作用[重复]

会话和 php 重定向不起作用

由于浏览器缓存,PHP 标头 301 重定向不起作用

PHP标头重定向不起作用并停留在login.php上