将MySQL查询转换为对象的最佳方法

时间:2011-01-16 03:43:37

标签: php mysql object constructor

我有一个用户表,其中包含我想在登录用户的mysql查询中访问的一堆列。最终,我希望这些列中的值形成一个User对象。是否有一个标准函数来执行此操作,或者我是否基本上需要将查询的每个值传递给新的User语句,以便将它们传递给User类的构造函数?

3 个答案:

答案 0 :(得分:5)

mysql_fetch_object()允许您指定类名,以便根据结果构建该类的实例:

$result = mysql_query($sql); // Error handling not included

if (mysql_num_rows($result) == 1) {
    $user = mysql_fetch_object($result, 'User');
}

除非您指定与SELECT查询中列出的列对应的属性及其访问修饰符,否则它们将默认为public

在填充其属性后,您的对象的构造函数被称为。您可以在构造函数中执行要执行的任何更改或其他任务。

答案 1 :(得分:2)

答案 2 :(得分:1)

你应该结帐mysqli_result::fetch_object。您还可以查看PHP's PDO extension

首先,要知道你的桌子。

CREATE TABLE `user` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `username` VARCHAR(256) NOT NULL,
    `password` VARCHAR(256) NOT NULL,
     PRIMARY KEY (`id`)
);

域对象

创建您的对象。您无需定义任何这些字段,因为默认情况下它们会以public的形式添加到您的对象中,但对于可能稍后维护您的代码的任何人都很清楚;为了清晰起见定义字段。由于字段是私有的,因此访问器和变换器是必需的。

class User {
    private $id;
    private $username;
    private $password;

    public function __construct($id, $username, $password) {
        $this->id = $id;
        $this->username = $username;
        $this->password = $password;
    }

    public function getId() { return $this->id; }
    public function setId($id) { $this->id = $id; }

    public function getUsername() { return $this->username; }
    public function setUsername($username) { $this->username = $username; }

    public function getPassword() { return $this->password; }
    public function setPassword($password) { $this->password = $password; }
}

查询

创建一个查询类。其中很多是样板代码,可以将其提取到抽象类中。

class UserQuery {
    public function create() {
        return new self();
    }

    public function findById($id) {
        $user = null;
        $conn = mysqli_connect("localhost", "root", "pass", "company_db");

        if ($conn->connect_error)
            die("$conn->connect_errno: $conn->connect_error");

        $query = "SELECT * FROM `user` WHERE `id` = ?";
        $stmt = $conn->stmt_init();

        if (!$stmt->prepare($query)) {
            print "Failed to prepare statement\n";
        } else {
            $stmt->bind_param('i', $id); 
            $stmt->execute();
            $result = $stmt->get_result();
            $obj = $result->fetch_object();

            return new User($obj->id, $obj->username, $obj->password);
        }

        $stmt->close();
        $conn->close();

        return null;
    } 
}

User表中获取user个对象。

$user = UserQuery::create()->findById(1);
printf("Found user: %s", $user->getUsername());