在类中使用数据库

时间:2014-03-31 13:50:56

标签: php mysql oop

我想知道如何在类中使用数据库。例如,如何编写查询以便于将来编辑和按OOP规则。

第一个例子:

    class User {

    public function select($query) {
        //work with data
        return $data;
    }

    public function insert($query) {
        //work with data
    }
}

在此示例中,user(me)为每个方法添加查询。对我来说,最大的缺点是我必须记住我的查询的正确形式。这个例子很容易理解,但是如果我将处理更复杂的查询,很难编写正确的查询形式。

下一个例子:

class User {

    const select = "SELECT * FROM user WHERE ID = ?";
    const insert = "INSERT INTO user VALUES (?)";

    public function select($id) {
        //work with data
        return $data;
    }

    public function insert($id) {
        //work with data
    }
}

我将每个查询定义为常量。这种形式的类非常方便,但另一方面,如果我想获得用户的ID我不能,因为我会知道数据库中ID字段的名称。我在第三个例子中解决了这个问题

第三个例子:

class User {

    private $table, $idField;

    public function setDatabaseInformation($table, $idField) {
        $this->table = $table;
        $this->idField = $idField;
    }

    public function select($id) {
        //work with data
        //query as SELECT * FROM $this->table WHERE $this->idField = ?
        return $data;
    }

    public function insert($id) {
        //query as INSERT INTO $this->table VALUES (?)";
        //work with data
    }

}

Personaly我认为,这个例子是最好的,因为我拥有我想要的一切,我无法记住查询形式。另一方面,这个例子有点长,非常普遍,我不知道OOP规则是否正确。

我的问题是:如何在数据库中编写查询还有其他选择吗?最后一个例子是否符合OOP规则?你用哪种方式?

感谢您的建议。

1 个答案:

答案 0 :(得分:1)

抽象课堂内的全部内容!你想编写最终看起来像这样的代码:

$database    = new PDO(...); // or whatever
$userStorage = new UserStorage($database);

$user  = $userStorage->getById(42);
$users = $userStorage->getByName('Joe');

class UserStorage {

    protected $db;

    public function __construct(PDO $db) {
        $this->db = $db;
    }

    public function getById($id) {
        $stmt = $this->db->prepare('SELECT ... WHERE id = ?');
        $stmt->execute([$id]);
        ...
        return $user;
    }

    ...

}

您只想在一个特定的权威位置编写一次逻辑查询。对于每个可能的逻辑"动作",创建一个方法(一种通过id获取用户的方法,一种通过名称获取它们的方法等)。每个方法在内部都可以根据需要复杂或简单,但是您可以在其中编写特定查询以获取特定数据。最后:依赖注入您的数据库连接。