OOP PHP PDO我的第一个项目,我做得对吗?

时间:2015-03-10 23:03:58

标签: php mysql database oop pdo

我正在尝试学习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>

所以你看它是一个简单的注册系统。 我的问题是,在这样的另一个类中调用数据库类,它是一种真正的方式,还是应该将insert函数带到数据库类,或者我可能需要将db类定义为parent而insRegInfo定义为带有extends方法的子类?

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

1 个答案:

答案 0 :(得分:0)

我首先使用model / mapper。这是一种非常简单的方法来获取普通对象并能够将它们持久化到数据库中。它还避免了将数据库调用和代码(持久性逻辑)与功能(应用程序或业务逻辑)混合在一起。简单的例子:

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。