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

