表单提交后重定向的正确方法

Posted

技术标签:

【中文标题】表单提交后重定向的正确方法【英文标题】:Right way to redirect after form submit 【发布时间】:2011-07-08 03:58:54 【问题描述】:

也许这是一个愚蠢的问题,但是在将表单保存到数据库后将用户重定向到成功页面的正确方法是什么?

我不知道为什么,但是如果我添加action="done.php",那么表单不会将数据保存到我的数据库中。

我尝试添加header ("location:/done.php"); 它有效,但是当我将页面移动到原始服务器(PHP 4 和 mysql 3.23.5)时,当我尝试发送表单时出现错误Warning: Cannot modify header information - headers already sent by ........

这是我的 php 代码:

if(isset($_POST['submit']))

$name=$_POST['name'];
$email = $_POST['email'];
$company = $_POST['company'];
$adress = $_POST['adress'];
$post = $_POST['post'];
$phone = $_POST['phone'];

$sql="INSERT INTO tekstile_users (id, name, email, company, adress, post, phone)
VALUES
('', '$name','$email','$company', '$adress', '$post', '$phone')";

if (mysql_query($sql,$con)) 

    header ("location:/done.php"); 
    
    else 
echo "Something is wrong";


//end of submit button

修复 它将 .php 文件转换为 UTF-8 without BOM

感谢大家的建议!

【问题讨论】:

这不是注入错误,因为如果我删除 -header ("location:/done.php");一切都好 我不是说这个问题是由SQL注入引起的。我只是说你的应用存在巨大的安全漏洞。 【参考方案1】:

“标头已发送”消息意味着您的脚本已经输出了一些内容。此错误消息上方的网页上是否显示任何内容?检查<?php 标记之前的任何空格。还要检查 <?php ?> 标记之前或之后的任何包含文件是否有空格。

Location 标头在“:”之后应该有一个空格,并且应该是一个绝对 URI,类似于以下内容:

header("Location: http://www.yoursite.com/done.php");

【讨论】:

不能有空格,因为它是相同的代码,可以在 localhost 和我的服务器上正常工作,但不能在客户端上运行/跨度> 修复标头不会修复“标头已发送”错误。您错过了错误消息的结尾部分。你得到“输出开始于......”吗?如果是这样,那将告诉您哪个脚本的哪一行已经输出了一些东西。 警告:无法修改标头信息 - 标头已由 /home/ 中的(输出开始于 /home/virtual/site167/fst/var/www/html/tekstile/index.php:1)发送virtual/site167/fst/var/www/html/tekstile/index.php 第 27 行。而第 27 行是 - header ("location:/done.php"); 非常仔细地查看 index.php 的第 1 行。这导致 PHP 输出一些东西。【参考方案2】:

“标头已发送”很可能意味着您的 .php 文件中有一些内容位于您的 PHP 代码之前。这可以像空格一样简单,或者您的 PHP 代码可能嵌入在 HTML 中。无论哪种情况,请确保 nothing 出现在您的 PHP 代码之前,这样就可以了。

至于这种重定向方法的正确性,我相信这是一种普遍接受的技术。

【讨论】:

【参考方案3】:

headers already sent 表示已经向浏览器发送了一些内容。

mysql 报错了吗?

另外,请注意$_POST 是在 PHP 4.1 中引入的,因此如果您使用的是非常旧的 php 版本,则可能会导致错误。

【讨论】:

对不起,我的错误 PHP 版本是 4.3.11 。我认为这是一个 php 错误。 @iKaspars 如果它在您的测试机器上工作并且它在原始服务器上不工作,我猜这将是一个 mysql 问题。信息是否被插入到数据库中? 是的,正在向数据库中插入信息。成功后还有其他方法可以重定向吗? 如果我删除 header("Location: done.php");我没有收到任何错误,也没有重定向,但是表单正在提交并且数据正在插入到数据库中 @iKaspars 很奇怪。这不是一个好的做法,但是如果您使用 @mysql_query 而不是 mysql_query 会发生什么?【参考方案4】:

其他人已就已发送的标头作出答复。如果更新成功,另一种方法是包含或要求 done.php。不要忘记 include / require 之后的退出。

if (mysql_query($sql,$con)) 

    header ("location:/done.php");
    require_once('done.php');
    exit();
    
    else 
echo "Something is wrong";

【讨论】:

【参考方案5】:

修复 它将 .php 文件转换为 UTF-8 without BOM

感谢大家的建议!

【讨论】:

【参考方案6】:

使用 ob_start(); 在页面顶部和<?php 之后

【讨论】:

非常感谢,在过去的 2 小时里,我一直在头疼。你的代码对我帮助很大

以上是关于表单提交后重定向的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

以 HTML 格式提交表单后重定向到页面

提交表单后重定向到另一个页面?

表单提交后重定向

提交表单 Laravel 后重定向到不同的路由

使用纯javascript提交表单后重定向

在 CodeIgniter 4 中提交表单后重定向页面无法工作