我的网站上有一个登录表单,用于检查提交的用户名/密码。如果不匹配,则将用户发送回登录页面并显示相应的错误消息。这个重定向的调用是这样的:
header("location:../login.php?error_message=$error_message");
这很好用,但在浏览器的地址栏中确实看起来很乱(尤其是描述性错误消息)。有没有办法在不使用 $_GET 变量的情况下进行这种自动重定向?我曾考虑使用 $_SESSION 变量,但这似乎不是最佳编码实践。
谢谢阅读。
如果有一个更简单的 GET 变量呢?
// something.php
header ("Location: foo.php?err=1");
然后在处理错误的页面中:
// foo.php
$errors = array (
1 => "Hello, world!",
2 => "My house is on fire!"
);
$error_id = isset($_GET['err']) ? (int)$_GET['err'] : 0;
if ($error_id != 0 && in_array($error_id, $errors)) {
echo $errors[$error_id];
}
希望这可以帮助。
如果您不想使用会话,则可以使用错误代码:
header('Location: ../login.php?error=' . urlencode($error_code));
然后,在里面login.php
:
if (isset($_GET['error'])) {
switch ($_GET['error']) {
case 123: // ...
break;
}
}
您可以使用查找数组代替笨重的开关,而不是使用查找数组来获取错误消息(可能取决于语言)。
顺便说一句,不建议在标头重定向中使用相对 URI,最好使用绝对(例如/login.php
)或完全限定的 URI(例如http://example.org/login.php
)。
对于表单验证,您有 3 个选项:
我个人会为我的表格实施(1)和(3)。(1)为了普通用户的方便,(3)为了向后兼容像我这样的偏执狂。
对于基于重定向的验证,使用会话确实是一种最简洁的方式,因为它在任何情况下都不会在历史记录中留下任何 POST 页面。但是,在存在基于 AJAX 的验证的情况下,这似乎有点矫枉过正
您可以使用基于会话的 Flash 消息。
看这个例子: http: //mikeeverhart.net/php/session-based-flash-messages/
使用会话是一个不错的选择。一旦显示错误,您就可以清除会话值。但是,如果您不想使用会话,您可以修改您的网址,如下所示。
// login failed
header("location:../login.php?status=0");
我更喜欢使用会话。