【问题标题】:Best way to turn a MySQL query into an object将 MySQL 查询转换为对象的最佳方法
【发布时间】:2011-06-09 20:59:10
【问题描述】:

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

【问题讨论】:

    标签: php mysql object constructor


    【解决方案1】:

    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

    您的对象的构造函数在填充其属性后调用。您想要执行的任何更改或附加任务都可以在构造函数中执行。

    【讨论】:

    • 太棒了。正是我想要的。
    【解决方案2】:

    【讨论】:

    • 这是什么,在 1K 的声誉下,我们应该对你有更好的期望。
    • robert -- 虽然这个回应显然不如 Boltclock 的有帮助,但我认为它不应该因为他的声誉不如你认为的那么好而受到批评。如果 amosrivera 今晚没有太多时间怎么办?最好他什么都不写,或者至少帮助我指出正确的方向?我认为是后者。他当然提供了比你所做的任何事情都更有帮助的东西。
    【解决方案3】:

    您应该结帐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());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 2017-01-01
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      相关资源
      最近更新 更多