代码之家  ›  专栏  ›  技术社区  ›  ParoX

PHP发送HTTP\u POST\u VARS到另一个页面?

php
  •  1
  • ParoX  · 技术社区  · 15 年前

    这样做最好的是什么?

    会议?如何将我在一个页面上定义的所有变量发送到另一个页面。

    我还看到有人用了这样的东西:

    <?php 
    foreach($HTTP_POST_VARS as $key => $val) { 
    ?> 
    <input type="hidden" name="<?php echo $key; ?>" value="<?php echo $val; ?>"> 
    <?php 
    } 
    ?>
    


    用户填写一个表单,然后提交包含所有必需信息的表单。第二个页面截取所有HTTP\u POST\u变量,然后定义更多变量。询问用户信息是否正确,并询问他们是否愿意提交所有信息。到目前为止我已经走了这么远。现在我想要一个按钮/链接,用户单击它,然后它将第2页的所有信息发送到另一个页面,在那里它最终运行代码来处理所有信息(MYSQL、电子邮件等)

    我的理想解决方案是能够定义类似onclick的东西,在这里我可以随心所欲地运行PHP函数,但这并不存在。一件事是我想确保信息发布/推送/无论什么到第3页(处理)是合法的,实际上是来自第2页(确认)…我不希望人们只是随机的HTTP帖子和验证。我在考虑用一个密钥来验证MD5。

    是否有人有一个优雅的解决方案的形式,你有第1部分(填写),第2部分(确认用户)和第3部分(处理所有信息从第2部分)。

    4 回复  |  直到 15 年前
        1
  •  1
  •   Rudisimo    15 年前

    <?php
    
    /////////////////////////////////
    // STEP 1 - Initial Form Display
    /////////////////////////////////
    
    session_start();
    echo '<form>';
    echo '<input type="text" name="usr_name" />';
    echo '<input type="text" name="usr_phone" />';
    echo '<input type="text" name="invalid_field" />';
    echo '<input type="submit" name="submit" value="Submit" />';
    echo '</form>';
    
    /////////////////////////////////
    // STEP 2 - Confirmation Page
    /////////////////////////////////
    
    // change this by your global of choice ($_POST, $_GET, $_REQUEST)
    $input_source &= $_GET;
    // create an array of all input fields that start with 'usr_'
    $input_fields = @preg_grep( '#^usr_[a-z]+#i', array_keys( $input_source ) );
    if( !empty( $input_fields ) )
    {
        // store all valid input fields in the session
        $_SESSION['input_values'] = array();
        foreach( $input_fields as $key )
        {
            $_SESSION['input_values'][$key] = $input_source[$key];
        }
    
        // create a checksum from the user's IP address and all input values (for false sense of security ^_^)
        $_SESSION['input_checksum'] = md5( $_SERVER['REMOTE_ADDR'] . '|' . join( '', $_SESSION['input_values'] ) );
    
        // logic for data validation and confirmation HTML goes here...
    }
    
    /////////////////////////////////
    // STEP 3 - Final Validation
    /////////////////////////////////
    
    // check for the existence of the session values from step 2
    if( !empty( $_SESSION['input_values'] ) && !empty( $_SESSION['input_checksum'] ) )
    {
        // create comparison checksum for validation purposes
        $_comp_checksum = md5( $_SERVER['REMOTE_ADDR'] . '|' . join( '', $_SESSION['input_values'] ) );
    
        // check session and comparisson checksums
        if( $_SESSION['input_checksum'] == $_comp_checksum )
        {
            // confirmation/validation looks good, proceed...
        }
    }
    
    ?>
    
        2
  •  0
  •   Mark    15 年前

    我通常只是在验证了信息之后将所有内容放入会话变量中。我在这方面一直都很幸运,因为一般来说没有很多像你所说的那样的用户信息,所以开销并不是那么糟糕。现在,如果您正在谈论大量数据,那么您可能需要考虑另一种方法。

        3
  •  0
  •   onigunn    15 年前

    好吧,这里有你需要的一切: php - session reference

        4
  •  0
  •   tylerl    15 年前

    又丑又自找麻烦?我想你知道什么了。

    或者,如果状态需要存储在浏览器页面中,可以使用前面提到的方法,也可以做一些类似于Microsoft的“view state”变量的操作。

    本质上,您可以序列化数据,可能对结果进行加密和/或签名,然后对整个块进行base64编码,并将结果粘贴到页面上的隐藏变量中。这样做的好处包括(a)不会用旧的变量名污染名称空间,(b)不会混淆表单填充插件和实用程序,(c)防篡改的变量存储(特别是在加密或签名的情况下)。

    推荐文章