2014-02-21 100 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.'">';