【问题标题】:OO PHP | Properly Passing POST Paramaters面向对象的 PHP |正确传递 POST 参数
【发布时间】:2015-05-20 09:14:00
【问题描述】:

我对 OO PHP 比较陌生,我正在尝试创建一个登录类。 我遇到的问题是我想将 POST 值用户名和密码传递给我的班级,但我无法建立一种体面的方式。

下面是我班的一个sn-p

class PortalLogin{
    private $username;
    private $password;

    function __construct(){
        //I connect to DB here
    }

    function login($username, $password){
        //error check the paramaters here
        //then I can run the query
    }

    function __destruct(){
        //I disconnect from DB here
    }
}

上面是我正在创建的类的细分,下面是我计划如何执行它(我目前的主要问题)。

$login = new PortalLogin();

if(isset($_POST['username'])){

    if(isset($_POST['password'])){

        $login->login($_POST[username],$_POST[password]);

    } else {

        //throw error

    }

} else {

    //throw error

}

我真的不喜欢上面代码的构造,在课堂之外做这么多似乎很混乱。如何将 POST 信息传递给班级并在那里执行检查?我担心如果我将 POST 信息传递给类并且其中一个 POSTS 不包含任何内容,它会出错。

【问题讨论】:

  • 我是PHP,顺便说一句!
  • 对我来说似乎是正确的 OO。除了你应该在PortalLogin的构造函数中注入已经建立的数据库连接,而不是在构造函数中做整个连接。

标签: php oop post methods login


【解决方案1】:

我认为你的 post 语法有问题。

if(isset($_POST['username']) && isset($_POST['password'])){

 $login->login($_POST['username'],$_POST['password']);

}

使用 AND.. 所以如果用户名和密码都存在则调用登录函数()

【讨论】:

  • 必须同意...通过不包括属性名称的引号,将生成通知。
  • 是的.. 我还建议您清理输入.. =) 否则某些用户可以绕过您的登录..
  • 希望他使用准备好的语句。
  • @TiMESPLiNTER 是的.. 否则使用 mysql_real_escape_string()... mysql_* 函数已被弃用..
  • 这在效率方面肯定看起来更好,但是我如何检测用户是否只输入了他们的用户名并点击了提交?因为那样我会想要一个错误。因为如果我对此添加一个 else 语句,那么它每次都会运行错误。
【解决方案2】:

我不确定 OOP 是从哪里来的,但如果你走的是面向对象的路线,你会有一个代表一个请求的类,你可以从中获取 POST 数据:

$username = $request->post('username');
$password = $request->post('password');

如果 POST 数据中不存在变量,您的 post() 方法可能会返回默认值 (null)。

然后您可以创建一个基于这些变量检查您的用户的类:

$auth = new AuthService($dbConnection);

if ($auth->checkCredentials($username, $password)) {
    // Valid user
} else {
    $error = $auth->getLastError();
}

【讨论】:

    【解决方案3】:

    我知道我可能是少数提出这个建议的人,但我更喜欢静态方法来处理这类事情。 PortalLogin 代表一个动作而不是数据

    class PortalLogin
    {
        /**
         * Attempt login
         * @param string $username
         * @param string $password
         */
        public static function login ($username, $password)
        {
            // do your login stuff
        }
    }
    

    然后使用你会这样做:

    if (isset($_POST['username']
        && !empty($_POST['username']
        && isset($_POST['password']
        && !empty($_POST['password']
    ) {
        PortalLogin::login($_POST['username'], $_POST['password']);
    }
    

    更好的 OO 是将用户名/密码检查纳入 User 类。 (可能是User::checkLoginCredentials($u, $p); // boolean yup/nope

    【讨论】:

    • “更好的 OO 是将其中的一些融入到 User 类中。”我不同意。这令人担忧。
    • @MartinBean 我的意思是您将验证用户身份的能力混合到User 类中。然后你要做的是获取用户名/密码,使用User 类进行身份验证,然后继续设置会话等。
    • 我完全明白你的意思,但它仍然令人担忧。不应将身份验证添加到 User 类。如果 OP 然后需要对不同类型的用户进行身份验证会发生什么?
    • @MartinBean 好点子,也许最好将它拆分成一个单独的类,但仍然在同一个命名空间中以保持它们名义上的关联。
    【解决方案4】:

    您可以使用错误抑制,如下所示:

    $login->login(@$_POST['username'], @$_POST['password']);
    

    如果 $_POST 变量中没有一个或两个值,则调用该方法时不会出错,因此您可以在类方法中进行错误处理。

    有关更多信息,请查看: http://php.net/manual/en/language.operators.errorcontrol.php

    编辑: 另一种选择是这样做:

    $login->login((isset($_POST['username']) ? $_POST['username'] : null), (isset($_POST['password']) ? $_POST['password'] : null));
    

    【讨论】:

    • 永远不要使用错误抑制。因为它使调试代码变得非常困难,并且减慢了整个过程。
    • 这里的问题是检查值是否设置在类内部,所以你确定它会被检查。
    • 您不应该在方法中检查它们,而是像在问题中那样进行检查:在将它们传递给方法之前检查它们。因为该方法应该执行它的名称:尝试登录。不检查输入参数是否设置。
    • 你真的应该同时检查调用代码和类内部,如果没有通过,类会抛出异常。
    • @TiMESPLiNTER 但我同意,如果您需要使用@ 错误抑制,您需要重新考虑您的方法。
    猜你喜欢
    • 1970-01-01
    • 2013-08-18
    • 2014-10-07
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 2017-11-15
    • 2017-02-17
    相关资源
    最近更新 更多