2014-02-21 57 views
0

我有一段代码将用户输入到表单中的信息发布到数据库。在将数据提交到数据库的最后一行PHP后,我有:PHP表头提交后不工作的PHP头重定向

header("location:http://www.site.com/page.htm"); 

这似乎没有任何作用。它仍然会将所有用户信息发布到数据库,但该页面会清除并发布它。没有重定向。

这里是整个片段:

<?php 
if(isset($_POST['register'])){ 
    $username = ($_POST['username']); 
    $password = ($_POST['password']); 
    $email = ($_POST['email']); 
    $email2 = ($_POST['email2']); 
    $password2 = ($_POST['password2']); 
    $commname = ($_POST['commname']); 
    $outpostname = ($_POST['outpost']); 
    $special = ($_POST['specialty']); 

    if($username == "" || $password == "" || $email == "" || $password2 == "" || $email2 == "" || $commname == "" || $outpostname == "" || $special == "no"){ 
     echo "Please supply all required fields!"; 
    }elseif(strlen($username) > 20){ 
     echo "Username must be less than 20 characters!"; 
    }elseif(strlen($email) > 100){ 
     echo "E-mail must be less than 100 characters!"; 
    }elseif(strlen($email2) > 100){ 
     echo "E-mail verify must be less than 100 characters!"; 
    }elseif(strlen($commname) > 20){ 
     echo "Your Commander's name must be less than 20 characters!"; 
    }elseif(strlen($outpostname) > 20){ 
     echo "Your Outpost's name must be less than 20 characters!"; 
    }else{ 
     $register1 = mysqli_query($myConnection,"SELECT `id` FROM `user` WHERE `username`='$username'") or die(mysqli_error($myConnection)); 
     $register2 = mysqli_query($myConnection,"SELECT `id` FROM `user` WHERE `email`='$email'") or die(mysqli_error($myConnection)); 
     if(mysqli_num_rows($register1) > 0){ 
      echo "That username is already in use!"; 
     }elseif(mysqli_num_rows($register2) > 0){ 
      echo "That e-mail address is already in use!"; 
     }else{ 
      $spec = ($_POST['specialty']); 
      $comnam = ($_POST['commname']); 
      $postnam = ($_POST['outpost']);              
      $rand_col = rand(1,5); /*Number of Colonies that exist in the game*/ 
      $ins1 = mysqli_query($myConnection,"INSERT INTO `stats` (`username`,`credits`,`food`,`land`,`energy`,`turns`,`turns_max`,`gas`,`ore`,`population`,`buildeff`,`offpts`,`defpts`,`score`,`specialty`) VALUES ('$username',2000,2000,100,2000,30,30,2000,2000,500,100,0,0,0,'$spec')") or die(mysqli_error($myConnection)); 
      $ins2 = mysqli_query($myConnection,"INSERT INTO `unit` (`username`,`trainee`,`juggernaut`,`infantry`,`marauder`,`terminator`,`reconsq`,`prisoner`,`destroyer`,`colossus`) VALUES ('$username',100,0,50,0,0,0,0,0,0)") or die(mysqli_error($myConnection)); 
      $ins3 = mysqli_query($myConnection,"INSERT INTO `user` (`colonynum`,`username`,`password`,`email`,`specialty`,`commname`,`outpostname`) VALUES ('$rand_col','$username','".md5($password)."','$email','$spec','$comnam','$postnam')") or die(mysqli_error($myConnection)); 
      $ins4 = mysqli_query($myConnection,"INSERT INTO `structure` (`username`,`agridome`,`spaceport`,`barrack`,`researchfac`,`laserbat`,`factory`,`infirmary`,`trainingfac`) VALUES ('$username',1,0,5,0,0,0,1,1)") or die(mysqli_error($myConnection)); 
      header("location:http://www.site.com/page.php"); 
     } 
    } 
} 
?> 

是的,我知道,我应该使用一些SQL注入保护,但不能得到,只是还没有工作..这将留待以后;)

+0

是HTTP报头是否区分大小写?或者至少在某些浏览器中?事情可以挑剔这样的东西。试试:'header(“Location:http://www.site.com/page.htm”);' – David

+0

我试过首都,位置和URL之间没有空格,效果相同。 –

+0

检查重定向之前什么都没有输出? – JBES

回答

1

变化

header("location:http://www.site.com/page.php"); 

header("location: http://www.site.com/page.php"); 

此外,如果您甚至在标题命令之前输出了一个字符(即, http请求的主体),它会失败。 打开PHP错误报告以查看是否属于这种情况。

输出字符甚至可以是白色字符,在<?php和页面开始之间的东西。

像: ======页面开始低于这条线=======

<?php 

公告有前<?php

+2

这不是问题。 – Daedalus

+0

OP已经表示他们这样做了。看看评论。 –

+0

他写道,他试过没有空格... –

1

白字如果你的头是不是工作,这是因为你的脚本在发送头文件之前产生了一个输出(例如一个错误消息,因为未经检查的GET参数)。检查您的网络服务器的错误日志,其中应包含信息,究竟是什么失败。

+0

我在这里没有得到满意的结果;这是正确的答案,其他答案也是如此。在标题调用之前没有输出可能被发送。 – Daedalus

+0

去图,有人不喜欢这个问题... –

1

所有标题需要在任何其他类型的输出(错误消息,HTML,Javascript等)之前发送到浏览器。

就你而言,在调用header()之前,脚本中有很多事情正在进行,并且其中一行或多行代码正在生成输出。一旦发生这种情况,您不能再发送标题信息。

要解决此问题,确定是什么原因产生的输出,并删除它,或之前的任何echo陈述,mysqli*陈述,或能够产生输出的任何其他行中移动header()通话更接近脚本的顶部。

+0

所以会有一些形式的javascript工作来重定向一旦表单被提交?我只希望它能够在表单上满足所有要求的情况下运行。 –

+0

这是一种可能的方法。另一种方法是缓冲您的所有输出,并且只在条件不满足且您不打算重定向时才将其发送给浏览器。有关详细信息,请参见[输出控制功能](http://www.php.net/manual/en/ref.outcontrol.php)文档。 –

+0

缓冲输出似乎不是我的选择。我需要那里的所有信息。我将不得不采用JS方法,并找出如何在所有条件都满足时加载它,并在将用户数据提交给数据库之后加载 –

0

得到它使用的工作:

$url = '/page.php'; 
echo '<META HTTP-EQUIV=Refresh CONTENT="0; URL='.$url.'">';