2013-12-23 3 views
3

Сегодня я попытался преобразовать свои функции в PHP-класс. Я пробовал с некоторыми основными шагами.PHP и Mysqli OOP - Обработка базы данных

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

+1

Вы можете использовать что-то под названием «инъекция зависимостей», например '__construct (Database $ db)' в другом классе; Чтобы сделать запрос с несколькими параметрами, ознакомьтесь с [этим комментарием] (http://www.php.net/manual/en/mysqli-stmt.bind-param.php#104073). Некоторые люди здесь рекомендуют использовать PDO для более «гладкого» интерфейса. – Passerby

ответ

2

Я хотел бы порекомендовать вам прочитать что-то об ORM для PHP. Например, я использую Doctrine 2 (http://www.doctrine-project.org/). Это своего рода сложный, но определенно заслуживающий изучения. Есть все, что вы пытаетесь сделать уже сделанным кодом, так почему вы должны сделать это снова?

В вашем принципе ООП есть некоторые ошибки.

  • Вы создаете экземпляр базы данных для каждого класса, такого как Dummy, если у вас будет класс Users, Articles, вы создадите базу данных 3x, это действительно не так. Вы должны сделать Database в качестве сервиса или Singleton и сделать это только один раз. Хорошим решением для этого может быть инъекция зависимостей (http://en.wikipedia.org/wiki/Dependency_injection).
  • Также я бы рекомендовал вам обобщить весь класс Dummy, чтобы сделать его более общим. Не делайте метод getAllDummy, но, например, «getAll ($ tableName)», чтобы вы могли использовать его для каждой таблицы.
0

Кроме доктрины (которая мощный и всемогущий уже, но все же к сложному), я могу предложить вам DB.php (http://dbphp.net), который делает все, что учение, но есть один файл и очень проста в использовании. Минусы: пока еще не задокументированы, и пока нет большого сообщества.

Смежные вопросы