7

我的网站上有一个登录表单,用于检查提交的用户名/密码。如果不匹配,则将用户发送回登录页面并显示相应的错误消息。这个重定向的调用是这样的:

header("location:../login.php?error_message=$error_message");

这很好用,但在浏览器的地址栏中确实看起来很乱(尤其是描述性错误消息)。有没有办法在不使用 $_GET 变量的情况下进行这种自动重定向?我曾考虑使用 $_SESSION 变量,但这似乎不是最佳编码实践。

谢谢阅读。

4

5 回答 5

7

如果有一个更简单的 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];
}

希望这可以帮助。

于 2013-03-26T10:51:10.653 回答
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)。

于 2013-03-26T10:52:09.117 回答
1

对于表单验证,您有 3 个选项:

  1. 使用 AJAX 进行验证 - 因此,根本不需要重定向。
  2. 使用重定向和会话将错误消息与输入的数据一起存储。
  3. 使用重定向作为POST/ Redirect /GET模式的一部分

我个人会为我的表格实施(1)和(3)。(1)为了普通用户的方便,(3)为了向后兼容像我这样的偏执狂。

对于基于重定向的验证,使用会话确实是一种最简洁的方式,因为它在任何情况下都不会在历史记录中留下任何 POST 页面。但是,在存在基于 AJAX 的验证的情况下,这似乎有点矫枉过正

于 2013-03-26T10:57:39.690 回答
0

您可以使用基于会话的 Flash 消息。

看这个例子: http: //mikeeverhart.net/php/session-based-flash-messages/

于 2013-03-26T10:49:10.287 回答
-3

使用会话是一个不错的选择。一旦显示错误,您就可以清除会话值。但是,如果您不想使用会话,您可以修改您的网址,如下所示。

// login failed
header("location:../login.php?status=0");

我更喜欢使用会话。

于 2013-03-26T10:51:30.610 回答