PHP 和 Mysqli OOP - 处理数据库

Posted

技术标签:

【中文标题】PHP 和 Mysqli OOP - 处理数据库【英文标题】:PHP and Mysqli OOP - Handling database 【发布时间】:2014-01-11 10:09:20 【问题描述】:

今天我尝试将我的函数转换为 php 类。 我尝试了一些基本步骤。

<?php
    class DataBase 
        private $host;
        private $user;
        private $password;
        private $db;
        private $mysqli;

        function __construct() 
            $this->host = "localhost";
            $this->user = "root";
            $this->password = "";
            $this->db = "my_database";

            $this->mysqli = new mysqli($this->host, $this->user, $this->password, $this->db);
        

        function __destruct() 
            $this->mysqli->close();
        

        public function query($query, $params = '', $bind_result) 
            $stmt = $this->mysqli->prepare($query);

                    //Need to change this to process the array of params
            $stmt->bind_param('i', $params);
            $stmt->execute();
                    //Change this to handle array of bind
            $stmt->bind_result($bind_result);
                    //Loop the result and store it in a temp array
            $stmt->fetch();
                    //Don't print the statement. Just close the statement and return the array.
            printf("%s\n", $bind_result);
            /* close statement */
            $stmt->close();
        
    
?>

我现在必须创建另一个类。我在数据库中创建了一个虚拟表。

<?php
    class Dummy 

        private $database;

        function __construct() 
            $this->database = new Database();
        

        public function getAllDummy() 
            $query = "SELECT name FROM dummy WHERE id = ?";
            $this->database->query($query, 1, 'name');
        

    
?>

但我认为这不是做事的正确方法。我觉得有些方法是正确的,有些方法是错误的。

当我调用 query() 函数时,我需要在每个类的构造方法中一直连接数据库吗?或者我需要将数据库类更改为静态函数吗?所以我可以调用诸如 Database::query(); 之类的函数;

看来我需要从一开始就创建所有内容。这样的模型是否已经在互联网上可用?比如cakephp、codeigniter

【问题讨论】:

您可以在其他类中使用诸如__construct(Database $db) 之类的“依赖注入”;要使用多个参数进行查询,请查看this comment。这里有些人会建议使用 PDO 以获得更“流畅”的界面。 【参考方案1】:

我想推荐你阅读一些关于 PHP 的 ORM 的内容。例如,我正在使用 Doctrine 2 (http://www.doctrine-project.org/) 这有点复杂,但绝对值得学习。您尝试编写的所有代码都已经完成,为什么还要重新编写?

在您的 OOP 原则中存在一些错误。

您正在为每个类(如 Dummy)创建数据库实例,如果您将有类用户、文章,您将创建 3x 数据库,这不是很好。您应该将数据库作为服务或单例,并且只创建一次。好的解决方案是依赖注入 (http://en.wikipedia.org/wiki/Dependency_injection)。 另外,我建议您概括整个 Dummy 类,使其更通用。不要使用“getAllDummy”方法,例如“getAll($tableName)”,这样您就可以将它用于每个表。

【讨论】:

【参考方案2】:

除了教义(它已经很强大,但仍然很复杂),我可以建议你使用 db.php (http://dbphp.net),它可以完成所有教义,但它是单个文件,并且非常易于使用。缺点:它还没有很好的文档记录,也没有大的社区。​​p>

【讨论】:

以上是关于PHP 和 Mysqli OOP - 处理数据库的主要内容,如果未能解决你的问题,请参考以下文章

PHP MySQLi OOP中“->”和“::”的区别

面向OOP类的PHP MySQLI面向对象查询,不将查询响应计为对象[重复]

通过PHP中的OOP连接到数据库和活动

将 $mysqli 设置为 OOP 的全局变量

计算 OOP PHP 中返回的行数

使用 PHP OOP 概念连接到 MySQL 数据库