【问题标题】:OOP PHP PDO My First Project , Am I doing right?OOP PHP PDO 我的第一个项目,我做得对吗?
【发布时间】:2015-05-12 14:20:12
【问题描述】:

我正在尝试学习 OOP PHP 和 PDO,现在有点混乱。在阅读了很多文章后,我决定创建我的第一个项目。这是我的代码。

class db{

    private static $instance = NULL;
    private static $DSN = 'mysql:host=localhost;dbname=firstproject';

    private function __construct(){

    }

    public static function getInstance(){
        if(!self::$instance){
            self::$instance = new PDO(self::$DSN,'root','');
            self::$instance->exec('SET NAMES utf8');
        }   
        return self::$instance;
    }

    public function reg_insert($usr_name,$usr_password){
        self::$instance->query("INSERT INTO users VALUES(null,'$usr_name','$usr_password')");
    }


}

class insRegInfo{

    private $username;
    private $password;


    public function __construct($username,$password){

        $dbe = db::getInstance();
        db::reg_insert($username,$password);

    }



}

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

    $reg = new getRegInfo($_POST['username'],$_POST['password']);

}   

<head>
    <title>PDO Database Project</title>     
</head>

<body>

    <form action="" method="post">
        <p>
            <label>User Name</label>
            <input type="text" name="username"/>
        </p>

        <p>
            <label>Password</label>
            <input type="password" name="password"/>
        </p>

        <p>
            <input type="submit" name="register" value="Register" />
        </p>
    </form>

</body>

如您所见,这是一个简单的注册系统。 我的问题是,在这样的另一个类中调用数据库类,这是一种真正的方式还是应该将插入函数带到数据库类,或者我需要将 db 类定义为父类,将 insRegInfo 定义为子类并使用 extends 方法?

哪种方式更好还是取决于我?

【问题讨论】:

  • 你这里有一个SQL注入漏洞,需要通过参数绑定来修复。您以纯文本形式存储密码,这也是一个安全风险——它们应该使用password_hash() 进行散列处理。配置细节通常不在课堂上,因为它们通常在应用程序中根据每个环境进行更改。不要使用服务器的 root 密码。
  • 另外,codereview.stackexchange.com 更适合此类帖子。
  • 我不关心安全性,因为这个项目只是为了学习如何管理数据库连接

标签: php mysql database oop pdo


【解决方案1】:

我将从使用模型/映射器开始。这是获取普通对象并能够将它们持久保存到数据库的一种非常简单的方法。它还避免将数据库调用和代码(持久性逻辑)与功能(应用程序或业务逻辑)混合在一起。简单例子:

class User {
    public $id;
    public $username;

}

class UserMapper {
    /**
     * @param User $user
     */
    public function save(User $user) {

        if(isset($user->id)) {
            $statement = "Update users set username = ? where id = ?"
        } else {
            $statement = "insert into users set username = ?, id = ?"
        }
        $instance = db::getInstance();
        $sth = $instance->prepare($statement );
        $values_a = array($user->username, $user->id);
        $db_result = $sth->execute($values_a);
    }

    /**
     * @param int $userId
     * @return User
     */
    public function load($userId) {
        $statement = "select * from users where id = ?";
        $instance = db::getInstance();
        $sth = $instance->prepare($statement );
        $values_a = array($user->id);
        $db_result = $sth->execute($values_a);
        $returnUser = new User();
        $returnUser ->id       = $db_result[0]['id'];
        $returnUser ->username = $db_result[0]['username'];
        return $returnUser;
    }
}

我还建议使用 getter/setter,而不是直接访问成员,但这只是为了简化代码...随着您开发更多模型/映射器,您会发现常见的映射器功能(保存、加载、删除、查找) 并且您可以重构您的代码以包含通用逻辑,这样您就没有一堆copypasta。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 2012-03-06
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多