PHP重定向,保持POST

时间:2011-09-03 00:21:43

标签: php

我有一个带有复选框表单的html页面。表单的动作指向PHP脚本。 PHP脚本收集POST变量就好了,但显然会显示一个空白屏幕,因为它一旦执行就会进入 www.example / script.php

我如何让PHP转到另一个URL以获取更多表单提交信息,同时保持这些POST完好无损?

header()和metaredirect似乎否决了所有内容而不是收集数据......如何将这些数据收集到POST中,然后自动转到另一个html页面,另一个表单附加了PHP脚本作为其动作?

如果我以一种令人困惑的方式表达了这一点,那么表示感谢和抱歉。

2 个答案:

答案 0 :(得分:5)

您可以将$_POST变量存储在$_SESSION中,然后在表单的最后部分完成时提交它们,或者您可以让中间页面将这些值存储为隐藏输入并提交它们到最后一页。

答案 1 :(得分: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;
}