【问题标题】:How does using a factory class to query database improve efficiency使用工厂类查询数据库如何提高效率
【发布时间】:2017-07-09 10:12:14
【问题描述】:

我是通过 Robin Nixon 的书学习 PHP 的,他的示例使用这样的函数来查询 MySQL 数据库

<?php
require 'config.php';
function queryMysql($query) {
    global $connection; // accessible from config.php
    $result = $connection->query($query);
    if (!$result) die($connection->error);
    return $result;
}
?>

config.php

<?php
$dbhost  = 'localhost';
$dbname  = 'database_name';
$dbuser  = 'database_username';
$dbpass  = 'database_password';

$connection = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if ($connection->connect_error) die($connection->connect_error);

// some other codes
?>

然后这通常会出现在您要查询数据库的代码中的任何位置$result=queryMysql($query); 这就是我一直在使用的东西,我最近了解到使用工厂类更好,并且应该可以减轻您的压力您的网站会增长,如果您以后碰巧使用多种类型的数据库。

我遇到了一个article,建议数据库应该以这种方式查询(稍作修改以适应我正在做的事情)

MYSQL 类

<?php
class MYSQL
{
    private $host, $database_name, $username, $password;

    public function setHost($host) {
        $this->host = $host; // localhost
    }

    public function setDatabase($database_name) {
        $this->database_name = $database_name; // database name
    }

    public function setUsermame($username) {
        $this->username = $username; // db username
    }

    public function setPassword($password) {
        $this->password = $password; // db password
    }

    public function connect () {
        return $connection = new mysqli($this->host, $this->username, $this->password, $this->database_name);
        if ($connection->connect_error) 
            // die($connection->connect_error);
            false;
        return $connection;
    }
}
?>

工厂类

<?php
class ConnectionFactory
{
    private $driver = null;

    public function setDriver($driver) {
        $this->driver = $driver;
    }

    public function connect($host, $username, $password, $database_name) {
        switch($this->driver) {
            case 'mysql':
                $DB = new MYSQL();
            break;
            default:
                $DB = new MYSQL();
        }

        $DB->setHost($host);
        $DB->setDatabase($database_name);
        $DB->setUsermame($username);
        $DB->setPassword($password);
        return $DB->connect();
    }
}
?>

现在开始查询

<?php
$db_factory = new ConnectionFactory();
$db_factory->setDriver('mysql');
$connection = $db_factory->connect('localhost', 'database_username', 'database_password', 'database_name');
if ($connection->connect_error) 
    die($connection->connect_error);

$query = "SELECT * FROM users";
$result = $connection->query($query);
if (!$result) 
    die($connection->error);
// echo '<pre>' , print_r($result), '</pre>';
?>

我真的很想知道,上面的工厂类如何改进对数据库的调用。我读到如果您将来可能想连接到不同的数据库,它会有所帮助。如果是这样的话,如果我创建不同的函数并使用名称来指定它们调用的数据库,那会不会是一样的

function queryMysql() {
    // code here
}
function queryPostgreSQL() {
    // code here
}

对于上面的工厂类,我觉得(我知道错了)访问数据库压力更大,因为每次尝试访问数据库时都需要不断输入主机、用户名、密码和数据库名称。真正的优势是什么?谢谢

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    Factory class 的目标不一定是提高效率,而是提高代码的易读性、组织性和消除潜在的冗余。

    具体来说,您正在创建一个 ConnectionFactory,它允许您创建单独的数据库工厂。如果你在课堂上看,你可以处理多种情况,即 MySQL。对于您的场景,好处可能不会立即显现出来,但想象一下,如果您必须连接到需要不同驱动程序的不同数据库 - 当然您仍然可以这样做,但在一个庞大的应用程序中,维护起来会非常混乱和不切实际。

    如果您阅读了这篇文章,您会看到他们提到了这一点,他们提到了如何拥有一个必须挂钩到 MySQL、PostgresSQL 和/或 SQLite 的应用程序。具体来说,他们提到

    通常 [为每个数据库指定每个配置] 是可行的,但它会在相当大的应用程序中产生问题。上面的代码有这些问题:

    • 如果您添加更多数据库类型,代码会不断增长,从而使其变得复杂
    • 代码使用数据库类型名称进行硬编码
    • 整个过程变得乏味

    【讨论】:

    • 感谢@aug 的回答,这是否意味着我每次连接数据库时都可以输入主机、用户名……?
    • @carlfrank 是的,假设您正在建立一个新连接,这很好,但理想情况下,您尝试与数据库建立尽可能少的连接。请参阅here 作为相关问题。这实际上是创建此类的其他好处之一。
    • 谢谢,我将迈出信念的飞跃并采用此方法。您说每次连接数据库时都可以重新输入主机名、用户名、密码和数据库名。如果我以后更改密码怎么办,这意味着我必须在连接到数据库的每个文件中也更改密码。
    • @carlfrank 我想更好的问题是您当前的示例如何使这更容易?建立新连接时,输入新密码是不可避免的。在您的示例中,您似乎必须执行$dbuser2$dbpass2 等操作,然后建立单独的连接,除非您打算覆盖当前的数据库信息,在这种情况下,当您需要重新连接时会发生什么情况?只是继续覆盖?使用工厂类,您可以将每个连接与一个类实例相关联,然后引用该实例来引用该连接。设置它并忘记它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2013-04-05
    • 2021-09-22
    • 2017-02-27
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多