我在我的网站上有一个登录表单,用来检查提交的用户名和密码。如果没有匹配项,用户将被送回登录页面,并显示相应的错误信息。进行重定向的调用是这样的:
header("location:../login.php?error_message=$error_message");
这个代码可以正常运行,但在浏览器的地址栏中看起来很杂乱(特别是出现描述性错误信息时)。有没有方法可以在不使用$_GET变量的情况下自动重定向?我曾考虑过使用$_SESSION变量,但那似乎不是最佳编程实践。谢谢阅读。
// 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)和(3)。(1)是为了普通用户的方便,而(3)是为了与像我这样的偏执狂保持向后兼容性。
对于基于重定向的验证,使用会话确实是最干净的方式,因为它不会在任何情况下在历史记录中留下已提交的页面。然而,在存在基于AJAX的验证的情况下,它似乎有点过度杀鸡。
header('Location: ../login.php?error=' . urlencode($error_code));
login.php
内部:if (isset($_GET['error'])) {
switch ($_GET['error']) {
case 123: // ...
break;
}
}
可以使用查找数组代替笨重的开关来处理错误消息(可能与语言有关)。
顺便说一句,在头部重定向中使用相对URI不是推荐的做法,最好使用绝对URI(例如/login.php
)或完全限定的URI(例如http://example.org/login.php
)。
使用会话是一个不错的选择。您可以在显示错误后立即清除会话值。但如果您不想使用会话,可以修改您的URL如下。
// login failed
header("location:../login.php?status=0");
我更喜欢使用会话(session)。
$_SESSION
变量。 - Jacob Tomlinson$_SESSION
是一个好的实践。 - Voitcus$_SESSION
持怀疑态度,因为它类似于其他语言中易用但危险的全局变量...但我很高兴重新评估。谢谢! - Rogare