You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何$_GET设置的变量在POST请求后无法保留值?

问题分析:参数传递丢失导致未定义错误

需求场景

实现一个脚本携带参数调用另一个脚本,被调用脚本再携带相同参数回调原脚本的功能。

调用脚本(search_members - Test.php)代码

<?php
    //search_members - Test.php
    $id = '9999';
    $search_1 = '';
    $search_2 = 'Bloggs';
    $sort = '3';
    echo '<a class="results" href="editmember - TEST.php?id=' . $id . '&search_1=' . $search_1 . '&search_2=' . $search_2 . '&sort=' . $sort .'">View</a>';
?>

被调用脚本(edit_member - TEST.php)代码

//edit_member - TEST.php

session_start();

if (isset($_POST['exit']))
  {
    $id = $_POST['id']; 
    $first_name = $_POST['first_name']; 
    //Passed Parameters
    //$search_1 = $_POST['search_1'];    
    //$search_2 = $_POST['search_2'];
    //$sort = $_POST['sort'];

    echo 'Display Parameters 2</p>';
        echo 'search_1' . $search_1 . '</p>';   //NOTDEFINED error???
    echo 'search_2' . $search_2 . '</p>';   //NOTDEFINED error???
    echo 'sort' . $sort . '</p>';           //NOTDEFINED error???
    echo '</p>';
    echo '<a class="results" style="bold;color:black" href="search_members - Test.php?search_1=' . $search_1 . '&search_2=' . $search_2 . '&sort=' . $sort. '">Continue Search</div>';   //V2 
    exit();
  }
else 
  {
  $id = '9999';
  $first_name = 'Fred';
  // Set passed parameter variables
  $search_1 = $_GET['search_1'];
  $search_2 = $_GET['search_2'];
  $sort = $_GET['sort'];
  
    echo 'Display Parameters 1</p>';
    echo 'search_1' . $search_1 . '</p>';   
    echo 'search_2' . $search_2 . '</p>';
    echo 'sort' . $sort . '</p>';
    echo '</p>';
    
?>  
  <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  <table>
  <tr><td><label for="id">ID:</label></td>
      <td><input type="text" id="id" name="id" maxlength="6" size="6" value="<?php if (!empty($id)) echo $id; ?>"></input></td>
  </tr>
  <tr><td><label for="first_name">First Name:</label></td> 
      <td><input type="text" id="first_name" name="first_name" maxlength="30" size="30" value="<?php if (!empty($first_name)) echo $first_name; ?>"></input></td>
  </tr>
  <!--Passed Parameters Stored
  <input type="hidden" id="search_1" name="search_1" value="<?php echo $search_1; ?>"></label> 
  <input type="hidden" id="search_2" name="search_2" value="<?php echo $search_2; ?>"></label>    
  <input type="hidden" id="sort" name="sort" value="<?php echo $sort; ?>"></label> 
  -->
  </table>
  <p class="text_centered">
    <input type="submit" value="Exit" name="exit" />
    <input type="submit" value="Update" name="update" />
    <input type="submit" value="Delete" name="delete" />
  </p>
  </form>
 </div>
<?php
  } 
?>

问题描述

当前代码中,edit_member - TEST.php通过$_GET获取的search_1、search_2、sort变量,在点击Exit按钮触发POST请求后出现未定义错误;而取消注释以下代码后功能恢复正常,请问该问题的原因是什么?

需要取消注释的代码:

//Passed Parameters
  //$search_1 = $_POST['search_1'];    
  //$search_2 = $_POST['search_2'];
  //$sort = $_POST['sort'];

  <!--Passed Parameters Stored
  <input type="hidden" id="search_1" name="search_1" value="<?php echo $search_1; ?>"></label> 
  <input type="hidden" id="search_2" name="search_2" value="<?php echo $search_2; ?>"></label>    
  <input type="hidden" id="sort" name="sort" value="<?php echo $sort; ?>"></label> 
  -->

原因解析

  1. HTTP请求的独立性:PHP的变量作用域是单次请求专属的,每次HTTP请求都是全新的执行环境。第一次通过链接访问edit_member - TEST.php是GET请求,此时从$_GET拿到的参数变量,在这次请求结束后就会被销毁,不会自动带到后续的POST请求里。
  2. 表单提交的参数缺失:点击Exit按钮提交表单时,发起的是POST请求,此时表单里只包含了id和first_name的输入值,没有携带search_1、search_2、sort这三个参数,所以POST请求的$_POST数组里没有这些值,代码里直接使用这些变量就会触发未定义错误。
  3. 取消注释代码的作用:
    • 表单里的隐藏输入框会把第一次GET请求拿到的search_1等参数值存储起来,当表单提交时,这些值会随POST请求一起发送到服务器。
    • POST分支里的代码从$_POST读取这些隐藏字段的值,重新赋值给变量,这样后续生成回到search_members - Test.php的链接时,就能正确带入参数,不会出现未定义错误。

内容的提问来源于stack exchange,提问作者zzm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 20:59:51