我的网站上有一个登录表单,用于检查提交的用户名/密码。如果没有匹配,则将用户发送回登录页面并显示相应的错误消息。对此重定向的调用是:
header("location:../login.php?error_message=$error_message");
这很好用,但在浏览器的地址栏中看起来很麻烦(特别是描述性的错误信息)。有没有办法在不使用$ _GET变量的情况下进行自动重定向?我曾考虑使用$ _SESSION变量,但这似乎不是最好的编码实践。
感谢阅读。
答案 0 :(得分:6)
如果有一个更简单的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];
}
希望这有帮助。
答案 1 :(得分:1)
如果您不想使用会话,则可以使用错误代码:
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
)。
答案 2 :(得分:1)
对于表单验证,您有3个选项:
我个人会为我的表格实施(1)和(3)。 (1)为了方便普通用户和(3)向后兼容像我这样的偏执狂。
使用会话确实是基于redirec的验证的最简洁方法,因为在任何情况下它都不会在历史记录中留下任何POSTed页面。但是,在存在基于AJAX的验证的情况下,似乎有点矫枉过正
答案 3 :(得分:0)
您可以使用基于会话的Flash消息。
请看这个例子:http://mikeeverhart.net/php/session-based-flash-messages/
答案 4 :(得分:-3)
使用会话是一个不错的选择。显示错误后,您可以立即清除会话值。但是如果您不想使用会话,您可以修改您的网址,如下所示。
// login failed
header("location:../login.php?status=0");
我更喜欢使用会话。