连接到数据库和CRUD

时间:2015-03-17 19:24:29

标签: php pdo

我最近正在开发一个网站应用程序,它基本上是一个客户/项目管理。 从一开始我就知道有必要将逻辑,视图和数据功能分开,以制作一个可以保留的更清晰的代码,所以我想到了一个3层方法。当我将理论付诸实践并开始编写代码时,问题和疑虑就开始了。

所以让我们从客户开始吧。

http://pastebin.com/47SKYwuX

这就是我的Clients.class.php的样子。这在我看来并不好看,因为数据库查询不应该存在,它不是客户端的责任(是吗?),但是,我在哪里为客户和其他人放置CRUD操作,我在考虑制作对于需要与我的数据库一起操作的每个类对象的DAO,也许是连接到数据库的一般DAO抽象类,其他的将是孩子,这是正确的吗?

谈到与数据库的连接,这就是dbbconnect的实现方式,所有其他类都包含了这一点。

$user= '';
$pass= '';
$bdname= '';

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testing', $user, $pass);
}
catch (PDOException $e) {
    exit('Database error.');
}

我确信这不是PDO应该如何使用的,因为我在其他类中全局使用这个$pdo。我应该如何正确使用它?

最后,在从数据库中获取数据时,我有疑虑。当从数据库中获取一行(即一个客户端)时,我会将其映射到一个Object并将其作为客户端(而不是值数组)返回。当我提取所有客户端时,我应该返回一个对象数组吗?

我希望有人可以对这些疑惑有所启发,并提前感谢。

2 个答案:

答案 0 :(得分:0)

有几个选项可供研究。坦率地说,你的“问题”中有不止一个问题。

关于对类进行建模,您可能会看到一些名为Data Driven Design的东西。这就是你所说的将模型和保存到数据库分成单独组件的内容。谷歌一点点,并阅读一些例子。

您可能还想查看一个名为ORM的内容。基本上它是一个抽象,因此您不必编写显式数据库查询。而是编写如何将对象映射到数据库表。

关于在全局范围内拥有PDO实例的问题:您想要使用称为Dependecy Injection的东西。查看Fabien Potencier(框架Symfony的作者)。在他的博客上,他写了一些关于为什么以及如何使用依赖注入的好帖子。

修改

在@FinalForm的一些友好建议之后,我会尝试举例说明你如何做到:

<?php

class Client {
    private $id;
    private $name;
    private $email;

    public function __construct($id, $name, $email) {
        $this->setId($id);
        $this->setName($name);
        $this->setEmail($email);
    }

    public function setId($id) { $this->id = $id; }
    public function getId() { return $this->id; }
    public function setName($name) { $this->name = $name; }
    public function getName() { return $this->name; }
    public function setEmail($email) { $this->email = $email; }
    public function getEmail() { return $this->email; }
}

class ClientFactory {
    public function createClient($name, $email) {
        return new Client(
            $this->newID(),
            $name,
            $email
        );
    }

    private function newID() {
        // return a new id
    }
}

class ClientDao {
    private $dbh;

    public function __construct(PDO $databaseHandler) {
        $this->dbh = $databaseHandler;
    }

    // Create-method
    public function persist(Client client) {
        $query = $dbh->prepare("INSERT INTO clients (id, name, email) VALUES (:id, :name, :email)");
        $query->execute(array(
            'id' => client->getId(),
            'name' => client->getName(),
            'email' => client->getEmail()
        ));
    }

    // Create simelar methods for the rest of the CRUD-methods
}

// Usage

require 'config.php';

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testing', $user, $pass);
}
catch (PDOException $e) {
    exit('Database error.');
}

$clientFactory = new ClientFactory();
$clientDao = new ClientDao($pdo);

$client1 = $clientFactory->createClient("Bob", "bob@gmail.com");
$client2 = $clientFactory->createClient("Dick", "dick@gmail.com");
$client3 = $clientFactory->createClient("Roger", "roger@gmail.com");

$clientDao->persist($client1);
$clientDao->persist($client2);
$clientDao->persist($client3);

我希望这可以解释你如何做到这一点。我们的想法是将对象的创建和保存分离到数据库。

答案 1 :(得分:-1)

K,假设它是一个直接的客户管理系统......

所以可能有一个“客户”表。表中的每一行都应该被视为一个对象。所以你有班级客户。实例化该类时,它可以表示表中的1行。来自该1行的数据将映射到该对象。也许你可以将Client子类化为多个客户端。所以你会做类Client扩展客户端{...}。 “Clients”类可用于表示表中的多个行。

所以会有:

  

类客户端扩展了客户端{...}

     

类客户端扩展了数据库{public function insert(){...}}

类数据库(见上文)将执行您想要的数据库操作。

因此,无论何时需要插入,都可以做类似的事情......

  

$ client = new Client();

     

$客户端 - &GT;的setName( “麦当劳”);

     

$ client-&gt; setRevenue(“20亿美元”);

     

$ client-&gt; insert($ client);

这样,所有类似客户端的模型级别类都可以创建并从基础数据库类中分类,在这些类中,它们都可以共享它的深层数据库用法。