【问题标题】:How to keep already-set GET parameter values on form submission?如何在表单提交时保留已设置的 GET 参数值?
【发布时间】:2011-11-04 07:02:20
【问题描述】:

我有一个 URL:foo.php?name=adam&lName=scott,在foo.php 中我有一个表单,它提供了rectangleLengthrectangleBreadth 的值,并带有一个提交按钮。

当我单击表单操作为$_SERVER['REQUEST_URI'] 的此提交按钮时,我得到此结果 URL:foo.php?rectangleLength=10&rectangleBreadth=5(这些值已由用户填写)。

请注意,我从 URL 中丢失了以前的值 namelName

我怎样才能保留它们?

另外,请记住,我必须回到foo.php,如果用户想再次提交表单,那么长度和宽度值应该改变。

【问题讨论】:

    标签: php get parameter-passing forms


    【解决方案1】:

    您可以在第一个目标站点的表单中添加两个隐藏字段,在您的情况下为 blabla.php:

    <form ...>
      <input type="hidden" name="name" value="<?php echo htmlspecialchars($_GET['name']);?>">
      <input type="hidden" name="lName" value="<?php echo htmlspecialchars($_GET['lName']);?>">
    
      <!-- rest of the form here -->
    </form>
    

    对于动态解决方案,使用 foreach 循环:

    <?php
    foreach($_GET as $name => $value) {
      $name = htmlspecialchars($name);
      $value = htmlspecialchars($value);
      echo '<input type="hidden" name="'. $name .'" value="'. $value .'">';
    }
    ?>
    

    您可以考虑将动态方法锁定为已知可能键的列表:

    <?php
    $keys = array('name', 'lName', ...);
    foreach($keys as $name) {
      if(!isset($_GET[$name])) {
        continue;
      }
      $value = htmlspecialchars($_GET[$name]);
      $name = htmlspecialchars($name);
      echo '<input type="hidden" name="'. $name .'" value="'. $value .'">';
    }
    ?>
    

    【讨论】:

    • 如果我有动态获取参数,如何创建动态隐藏字段,包括传入和传出?
    • saurabh,我已经用动态获取参数的示例更新了我的答案。
    • 哇..这正是我要找的..谢谢埃米尔。我不知道如果您通过 GET 发送隐藏字段,它在 URL 中可见。现在为了避免重复长度 abd 宽度字段,我可以在这个 for 循环中应用一个简单的检查。解决了问题.....我只是对另外一件事感到好奇->亚马逊如何隐藏这么多代码?要么我无法阅读它,要么它隐藏在我不知道的某个地方......关于如何使我们的代码变得很棒和隐藏的任何提示:)我知道它是一个完全不同的转换。感谢您的帮助...美好的一天
    • 亚马逊不会隐藏 URL 中的信息,而只会传递一个链接到数据库条目(包含信息)的 id
    • 请在$_GET[$name])之后的最后一个块if(!isset($_GET[$name]) { continue; }中添加结束括号),如$_GET[$name]))
    【解决方案2】:

    使用http_build_query 保持 URL 不变的更简单解决方案

     <form action="<?php echo $_SERVER["PHP_SELF"] . '?'.http_build_query($_GET); ?>" ... 
      ..
      ..
    

    【讨论】:

    • 我对此进行了测试,但它似乎不起作用。即使在 action 属性中定义了 URL 参数,提交也会用表单中的字段替换它们。 &lt;form action="page.php?list=members"&gt; 和一个输入字段 &lt;input name="search"&gt; 将打开 URL page.php?search=value 而不是 page.php?list=members&amp;search=value
    • http_build_query($_GET) 使用 $_GET 请求中的值,因此请检查 list 字段/参数是否是您提交的表单的一部分。使用var_dump($_GET) 检查它是否有效
    • 在 chrome 中测试了这个。但它不保留现有的查询参数。见jsfiddle.net/tz1b6yqx/1
    【解决方案3】:

    有不同的方法可以做到这一点。它们都将接收到的参数写入文件、内存或数据库中,然后使用密钥检索它们

    最简单的方法是类似于会话变量:http://php.net/manual/en/features.sessions.php

    主要设置是这样的(注意:这是不安全的代码,请确保只添加要保留的会话变量,并清理用户输入!):

    <?php
    session_start();
    foreach ($_GET as $key=>$value) {
        $_SESSION[$key]=>$value;
    }
    
    ?>
    

    而现在,只要用户不关闭浏览器,就可以通过$_SESSION[varname];访问这些变量

    【讨论】:

    • 但是如果我只想要 GET 参数中的所有这些值,如果用户将此 URL 发送给其他人,我希望他们看到所有值......我只想记住参数 VIA URL。
    • 请注意,这是一个有问题的方法,因为 GET 字符串的长度是有限的(取决于浏览器和网络服务器)——包括变量名。您可能希望结合“使用密钥将参数写入数据库”并在隐藏的输入字段中发送密钥......
    • 是的..我是新人,不允许我投票。
    【解决方案4】:

    曾经,我需要在表格中对结果进行排序,以保持搜索结果来自 GET。我确实喜欢:

    unset($_GET['sort']); // sort param is removed, otherwise there will be created many sort params
    $url = http_build_query($_GET);
    
    echo "<a href='?".$url."&sort=title'>Title</a>";
    echo "<a href='?".$url."&sort=author'>Author</a>";
    

    【讨论】:

    • 这是一个很好的解决方案
    • 要求使用 htmlspecialchars() 来防止 XSS 攻击。
    【解决方案5】:

    以下代码适用于我的项目。希望对您有所帮助。 1. 在菜单中(调用 html)我调用 VendorSearch.php。变量 fromvs 用于 URL。 2.目标php VendorSearch.php会根据$_GET['fromvs']的值做不同的工作 3.在VendorSearch.php中,aftersession_start(),

    $srchfor ="";
    $fromwhat = $_GET['fromvs'];
    $_SESSION['fromwhat'] = $fromwhat;
    //save value to $VS
    $vs = $fromwhat;
    
    3. Use hidden input to store URL passed variable
    <div style='position: absolute; top: 10px; left: 400px;'><input type='hidden' hidden='hidden' id='fromvs' name='fromvs' value="<?php echo $_SESSION['fromwhat'];  ?>"></div>
    
    4. But this thie field's value may lost after clicking button "srchvnd". So use a function to reset 
    $_SESSION['fromwhat'];  
    
    if (isset($_POST['srchvnd']))
    { 
         $vs = $_POST['fromvs'];
    
         somefunction($vs);
    
    }
    
    -----------------Source code----------------------
    
    Segment in Calling html 
    ....
    <body>
    <div style="  position: absolute; top: 1px; left: 5px; height:740px;  width:205px; border-radius: 10px;" >
    <!-- Start css3menu.com BODY section -->
    <ul  id="css3menu1" class="topmenu">
        <li class="topfirst"><a href="VendorSearch.php?fromvs=V" target="I1" style="width:183px;">Add a Subcontractor </a></li>
        ....
        <li class="topmenu"><a href="VendorSearch.php?fromvs=S" target="I1" style="width:183px;">Assign Subcontractor Contracts</a></li>
        .....
        <li class="toplast"><a href="login.php" target="_self" style="width:183px;">Log Out</a></li>
    </ul>
    ....
    </div>
    
    Segment in target php: VendorSearch.php
    
    <?php
    //VendorSearch.php
    //http://mted202.mtaent.org:9051/ocr/login.php rweinbau 
    require_once('dbinfo.php');
    
    session_start();
    $c = oci_pconnect("ocr","ocrmta","HQT4");
    oci_set_client_identifier($c, $_SESSION['username']);
    $username = htmlentities($_SESSION['username'], ENT_QUOTES); 
    .....
    $srchfor ="";
    
    $fromwhat = $_GET['fromvs'];
    $_SESSION['fromwhat'] = $fromwhat;
    $vs = $fromwhat;
    
    if (isset($_POST['srchvnd']))
    { 
         $vs = $_POST['fromvs'];
    
         somefunction($vs);
    
    }
    else
    {
        ;
    }
    
    ?>
    <body>
        <form class="vfrmsrch" name="vndsearch" id="vndsearch" action="VendorSearch.php?fromvs='<?php echo $fromwhat; ?>'" method="POST"> 
            <div style='position: absolute; top: 10px; left: 400px;'><input type='hidden' hidden='hidden' id='fromvs' name='fromvs' value="<?php echo $_SESSION['fromwhat'];  ?>"></div>
        ......
          <td><input type="submit" class="slbt" name="srchvnd"  id ="srchvnd" vaue="Search"></input></td>
         ......
        </form>
    .......
    </body>  
    </html> 
    <?php
    function somefunction($vvs){    
    //$msg = "We are inf somefunction() function </a></div><br>";
    
    // echo  "<div style='position: absolute; top: 100px; left: 10px;'><a style='color:blue'>".$msg;
    
    $_SESSION['fromwhat'] = $vvs;
    ............
    
    oci_close($c);
    }
    

    【讨论】:

      【解决方案6】:
      1. 在菜单中(调用 html)我调用 VendorSearch.php。在 URL 中使用了变量 fromvs。
      2. 目标php VendorSearch.php会根据$_GET['fromvs']的值做不同的工作
      3. 在 VendorSearch.php 中,aftersession_start(),

        $srchfor =""; $fromwhat = $_GET['fromvs']; $_SESSION['fromwhat'] = $fromwhat; $vs = $fromwhat;

      4. 使用隐藏输入存储 URL 传递的变量

        &lt;div style='position: absolute; top: 10px; left: 400px;'&gt;&lt;input type='hidden' hidden='hidden' id='fromvs' name='fromvs' value="&lt;?php echo $_SESSION['fromwhat']; ?&gt;"&gt;&lt;/div&gt;

      5. 但是这个人

      调用html中的段 …… 添加分包商 …… 分配分包商合同 ...... 登出 ……

      目标 php 中的段:VendorSearch.php

      <?php
      //VendorSearch.php
      //http://mted202.mtaent.org:9051/ocr/login.php rweinbau 
      require_once('dbinfo.php');
      
      session_start();
      $c = oci_pconnect("ocr","ocrmta","HQT4");
      oci_set_client_identifier($c, $_SESSION['username']);
      $username = htmlentities($_SESSION['username'], ENT_QUOTES); 
      .....
      $srchfor ="";
      
      $fromwhat = $_GET['fromvs'];
      $_SESSION['fromwhat'] = $fromwhat;
      $vs = $fromwhat;
      
      if (isset($_POST['srchvnd']))
      { 
       $vs = $_POST['fromvs'];
      
       somefunction($vs);
      
      }
      else
      {
          ;
      }
      
      ?>
      <body>
      <form class="vfrmsrch" name="vndsearch" id="vndsearch" action="VendorSearch.php?fromvs='<?php    echo $fromwhat; ?>'" method="POST"> 
          <div style='position: absolute; top: 10px; left: 400px;'><input type='hidden' hidden='hidden' id='fromvs' name='fromvs' value="<?php echo $_SESSION['fromwhat'];  ?>"></div>
      ......
      </form>
      .......
      </body>  
      </html> 
      <?php
      function somefunction($vvs){    
      //$msg = "We are inf somefunction() function </a></div><br>";
      
      // echo  "<div style='position: absolute; top: 100px; left: 10px;'><a style='color:blue'>".$msg;
      
      $_SESSION['fromwhat'] = $vvs;
      ............
      
      oci_close($c);
      }
      

      【讨论】:

        【解决方案7】:

        我个人的偏好是指定您希望接受的键,并确保通过 htmlspecialchars() 运行该值。

        $url_params = array(
          'tab'
        );
        foreach( $url_params as $key ) {
          echo !empty( $_GET[$key] ) ? '<input type="hidden" name="'. $key .'" value="'. htmlspecialchars( $_GET[$key] ) .'" />' : '';
        }
        

        【讨论】:

          【解决方案8】:

          使用数组处理查询:

          foreach (explode("\n", http_build_query($query, '', "\n")) as $keyValue) {
              [$key, $value] = explode('=', $keyValue, 2);
              $key = htmlspecialchars(urldecode($key), ENT_COMPAT | ENT_HTML5);
              $value = htmlspecialchars(urldecode($value), ENT_COMPAT | ENT_HTML5);
              echo '<input type="hidden" name="' . $key . '" value="' . $value . '"' . "/>\n";
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-06-19
            • 2021-01-13
            • 2022-10-18
            • 1970-01-01
            • 2013-07-18
            相关资源
            最近更新 更多