如何使用工厂类查询数据库提高效率

时间:2017-07-09 10:12:15

标签: php mysql

我用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;
    }
}
?>

FACTORY类

<?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
}

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

1 个答案:

答案 0 :(得分:1)

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

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

如果您阅读本文,您可以看到他们提到了这一点,他们提到了如何将应用程序连接到MySQL,PostgresSQL和/或SQLite。具体来说,他们提到了

  

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

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