2014-08-30 69 views
0

我已经看到了这个问题的几个实例,但没有得到明确的答案。这里是我的方案使用PHP附加请求对象中的对象

  1. 我有一个的login.php形式 - 这应该提交给loginController.php
  2. 一旦loginController.php验证对DATABSE,应该要么重定向到home.php或传回login.php以及相应的成功/错误消息
  3. 我知道我可以使用SESSION在页面之间传递信息,但我宁愿避免仅将SESSION用于页面特定的消息和对象。

在JAVA中,我们可以将对象嵌入到request对象中,然后将控件转发到下一页。在PHP中有什么等价的东西吗?

我目前做的方式是如下 -

1.loginController.php有主页,它包含的login.php

2.login.php重新提交数据传回的LoginController .PHP(八九不离十递归提交)

3.Then存在的if-then-else逻辑来决定下一步是否重定向需要去home.php或只包括login.php中再次与错误信息

+0

名称“loginController”表明您正在使用某种MVC范例,它是正确的吗? – Giorgio 2014-08-30 17:39:23

+0

是的 - 但我没有使用任何框架。我正在使用MVC的基本形式 - 一个用于登录(视图)的页面,一个用于控制器的文件和另一组用于表示模型的类。 – ChicagoSky 2014-08-30 18:04:24

+0

不错。所以,我认为当您收到login.html页面的请求时,您的MVC结构将调用登录控制器,它将调用登录模型,该模型将检查用户名 - 密码是否正确并返回结果。根据此结果,登录控制器将显示登录视图或主视图。这一切是否正确? – Giorgio 2014-08-30 18:17:41

回答

1

从我们的讨论中,我认为下面的代码片段可以做你想做的。您可以使用$_SESSION变量来存储用户数据和$_POST变量来区分,如果用户提交的用户名和密码数据:

登录控制器

/* Already logged in */ 
if(isset($_SESSION['username']) 
{ 
    header('Location:home.html'); 
} 

/* Not logged in */ 
else 
{ 
    /* Login submitted */ 
    if(isset($_POST['submit'])) 
    { 
     $user = new User(); // this is an instance of model class 
     $username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING); 
     $password = filter_input(INPUT_POST, 'password', FILTER_SANITIZE_STRING); 

     $login_result = $user->login($username, $password); 

     /* Login success */ 
     if($login_result == true) 
     { 
      $_SESSION['username'] = $username; 
      header('Location:home.html'); 
     } 

     /* Login error */ 
     else 
     { 
      $view_data = "Login incorrect"; // here you can set some data to be shown on login view 
      showView('login.html'); // pseudo code, change with your code to show login view 
     } 
    } 

    /* Show login form */ 
    else 
    { 
     showView('login.html'); // pseudo code, change with your code to show login view 
    } 
} 

登录查看

<?php if(!empty($view_data)) echo $view_data; /* Here you show login result (i.e. errors) */ ?> 

<form method="post" action="login.html"> 
    <input type="text" id="username" name="username" placeholder="Username" /> 
    <input type="password" id="password" name="password" placeholder="Password" /> 
    <input type="submit" name="submit" value="Login" /> 
</form> 

中当然,你必须在用户模型上实现$user->login方法(我强烈建议你使用PDO statements查询数据库)。此方法只是简单地检查用户数据,并在登录成功时返回true,在失败时返回false。

注销时,只需unset($_SESSION['username'])即可完成。

我也建议你看看这个session security question这样的东西,以保护你的会议免受劫持。希望能帮助到你。

0

你可以使用查询字符串。

当你重定向到的login.php为错误的结果,你的完整URL将是这样的:

login.php?status=error&message=invalid_credentials 
在你的login.php

可以作为获取额外信息如下

$_GET['status'];//will contain the status 
$_GET['message'];//will contain the message 

干杯!

+0

谢谢Makville。这是PHP提供的最好的吗?有没有办法像JAVA那样修改请求对象? – ChicagoSky 2014-08-30 18:05:10

+0

而java如何完全修改请求对象?您可以通过数据可见的通信协议(HTTP)传播数据,并且不能将语言构造附加到数据,也可以将“对象”保存在服务器的某个位置,并使用标识符标识它,并通过HTTP协议到另一个页面。猜猜看 - 会话是这样做的。我不是一个java人,但我真诚地怀疑它改变了实际的HTTP请求来回传播数据。 – 2014-08-30 19:07:27

+0

在JAVA中,您可以调用'request.setAttribute()'和'request.getAttribute()'在页面和控制器对象之间转发对象。它比使用查询字符串更清洁,比使用会话上下文花费更少 - 希望PHP会有类似的东西。请求可以是POST类型 - 这意味着这些不会出现在查询字符串中 - http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getAttribute%28java.lang.String% 29 – ChicagoSky 2014-08-30 20:12:16