2011-09-03 55 views
6

我有一個複選框窗體的HTML頁面。該表單的動作指向一個PHP腳本。 PHP腳本很好地收集POST變量,但很明顯會顯示一個空白屏幕,因爲它會一直執行到www.example.com/ script.phpPHP重定向,保持帖子

如何讓PHP轉到另一個URL以獲取更多表單提交信息,同時保持這些POST完好無損?

header()和metaredirect似乎推翻了一切,並沒有收集數據......我如何將這些數據收集到POST中,然後自動轉到另一個HTML頁面作爲其操作附加的PHP腳本?

謝謝並抱歉,如果我以混亂的方式措辭。

+1

將'POST'數據放入會話變量中。 –

+1

我只寫'echo'

...
「',但我很好奇是否還有更好的方法可以做。 – JiminP

回答

5

您可以將$_POST變量存儲在$_SESSION中,然後在表單的最後部分完成時提交它們,或者您可以讓中間頁面將這些值存儲爲隱藏輸入並將它們提交到最終頁面。

+0

我看到你在說什麼,我可以嘗試做這個會話......但是一旦script.php執行後,我怎麼到另一個頁面呢?它只是顯示一個空白頁面......我如何讓它拍攝到另一個HTML頁面,以便用戶可以填寫更多表單?謝謝! – Redirect42

+0

爲什麼不在該頁面上顯示錶單的下一部分?如果你真的想重定向用戶,發出一個'header('Location:www.mysite.com/nextpage.php');' –

+0

我可以做下一個表單頁面的「下一步」提交按鈕鏈接,並以某種方式擁有所有表單信息被放入POST中?這需要我在同一個html頁面上使用php,還是可以在它自己的文件中保存它? – Redirect42

2

我發現這段代碼幾乎可以一直工作(除非在某些情況下,您想使用自定義發佈數據進行轉發,而客戶端不支持javascript)。

這是通過濫用307 Temporary Redirect似乎轉發POST數據,或通過創建一個自我提交的JavaScript形式。

雖然這是一個黑客,但只有在您必須轉發POST數據時才使用它。

<?php 

function redirectNowWithPost($url, array $post_array = NULL) 
{ 
    if(is_null($post_array)) { //we want to forward our $_POST fields 
     header("Location: $url", TRUE, 307); 
    } elseif(! $post_array) { //we don't have any fields to forward 
     header("Location: $url", TRUE); 
    } else { //we have some to forward let's fake a custom post w/ javascript 
     ?> 
<form action="<?php echo htmlspecialchars($url); ?>" method="post"> 
<script type="text/javascript"> 
//this is a hack so that the submit function doesn't get overridden by a field called "submit" 
document.forms[0].___submit___ = document.forms[0].submit; 
</script> 
<?php print createHiddenFields($post_array); ?> 
</form> 
<script type="text/javascript"> 
document.forms[0].___submit___(); 
</script> 
     <?php 
    } 
    exit(); 
} 

function createHiddenFields($value, $name = NULL) 
{ 
    $output = ""; 
    if(is_array($value)) { 
     foreach($value as $key => $value) { 
      $output .= createHiddenFields($value, is_null($name) ? $key : $name."[$key]"); 
     } 
    } else { 
     $output .= sprintf("<input type=\"hidden\" name=\"%s\" value=\"%s\" />", 
      htmlspecialchars(stripslashes($name)), 
      htmlspecialchars(stripslashes($value)) 
     ); 
    } 
    return $output; 
}