php - 使用 POST 和 GET 请求相同路由时保持请求?
问题描述
我正在尝试制作一个经过验证的简单表单,并且应该显示错误。此外,字段的值应该保留。
我正在使用简单的路由代码来确定要显示的页面。我的问题是表单的值总是在我提交时重置。我搜索了一下,发现当请求更改时,表单值会丢失。
这是一个小例子,显示了我想要实现的目标:
$route = $_SERVER['REQUEST_URI'];
switch ($route) {
case '/kontakt':
?>
<form method="POST" action="/kontakt">
<input type="text" required name="test">
<input type="submit">
</form><?php
break;
}
提交后输入的值应留在该字段中。
那么如何在路由到同一路由但一次使用 POST 一次使用 GET 时保留请求而不更改表单值以使用 _POST 数组?
解决方案
让我们首先获取我们需要使用哪个请求来获取请求参数。
$request =& $_SERVER['REQUEST_METHOD'] === 'POST' ? $_POST : $_GET;
在这里检查它是否已设置可能是一个好主意,如果不是 - 只需将其留空。
$name = $request['name'] ?? ''; # PHP 7+
$name = isset($request['name']) ? $request['name'] : ''; # PHP 5.6 >
然后你可以做你的路由
# switch: endswitch; for readability
switch(($route = $_SERVER['REQUEST_URI'])):
case '/kontack': ?>
<form method="POST" action="/kontakt">
<input type='text' value='<?= $name; ?>' name='name' />
....
<?php break;
endswitch;
然后,这将不断地将名称重新插入该value
字段。但是,如果您访问一个新页面然后又回来 - 它就会消失。如果您希望它始终保持不变,通过任何路线,您可以使用会话。
session_start();
# We want to use the request name before we use the session in-case the user
# Used a different name to what we previously knew
$name = $request['name'] ?? $_SESSION['name'] ?? ''; # PHP 7
$name = isset($request['name']) ? $request['name'] : isset($_SESSION['name']) ? $_SESSION['name'] : ''; # PHP 5.6 >
# Update what we know
$_SESSION['name'] = $name;
注意:我展示了 PHP 5.6> 和 PHP 7 示例。您只需要根据您使用的 PHP 版本使用一个。
推荐阅读
- java - java.lang.IllegalArgumentException:服务未注册:lt@2178976
- pine-script - 在松树脚本上突出显示接近移动平均线的蜡烛
- python - 数据编辑/访问的 Pandas Multiindex 行
- java - Java 中 wait() 和 notifyAll() 的行为?
- go - 迭代接口映射的值
- html - 如何将 div 的高度设置为外部 div 的 100% 高度?
- swift - 如何在 IntentConfiguration Widget 视图 iOS 14 中显示与 CoreData 中同一行相关的数据?
- python - 多步时间序列预测
- node.js - 在我发布表单后,Express 中间件丢失 res.locals
- swiftui - 在领域数据库中进行更改时,如何在 SwiftUI 中自动更新 UI?