2009-11-30 4 views
2

Я хочу иметь возможность создавать классы, которые расширяют класс MySQLi для выполнения всех его SQL-запросов.Расширение класса MySQLi

$mysql = new mysqli('localhost', 'root', 'password', 'database') or die('error connecting to the database'); 

Я не знаю, как это сделать без глобализации объекта $ mysql для использования в других моих методах или классах.

class Blog { 

public function comment() { 
    global $mysql; 

    //rest here 
} 

} 

Любая помощь будет принята с благодарностью.

Спасибо.

ответ

3

Мое предложение - создать класс Singleton DataAccess, создать экземпляр этого класса в глобальном файле конфигурации и вызвать его в вашем классе Blog, например $query = DataAccess::query("SELECT * FROM blog WHERE id = ".$id).

Посмотрите на шаблон Singleton, это довольно легко понять шаблон оформления. Идеально подходит для этой ситуации.

Вашего класс DataAccess может иметь несколько методов, как query, fetchAssoc, numRows, checkUniqueValue, transactionStart, transactionCommit, transactionRollback и т.д. и т.п. Те, функция также может быть настроена как интерфейс, который получает реализованный класс DATAACCESS. Таким образом, вы можете легко расширить свой класс DataAccess для нескольких систем управления базами данных.

Выше приведено описание модели DataAccess.

+0

Если я использую одиночек, будет ли это создать новое подключение к базе данных каждый раз, когда его называют? – bennn

+1

Нет, это идея Синглтона. Вы создаете один экземпляр, и вы продолжаете использовать этот экземпляр, называя его статическим. Таким образом, у вас есть соединение 1 дБ для всех классов/контроллеров/просмотров и т. Д. – Ben

+0

Бен благодарит за помощь, это сработало отлично! – bennn

1

Вы можете использовать PHP распространяется ключевое слово только для любого другого класса:

class Blog extends mysqli { 

    public function __construct($host, $user, $password, $database) { 
     parent::__construct($host, $user, $password, $database); 
    } 

    public function someOtherMethod() { 
    } 
} 

$blog = new Blog('localhost', 'root', 'password', 'database') or die('Cannot connect!'); 

или лучше использовать агрегацию объектов вместо наследования:

class Blog { 

    private $db; 

    public function __construct($host, $user, $password, $database) { 
     $this->db = new mysqli($host, $user, $password, $database); 
    } 

    public function someOtherMethod() { 
     return $this->db->query("SELECT * FROM blah_balh"); 
    } 
} 
+1

Thats whacked solution from not way Блог - это расширение класса mysqli.Он просто использует его, а не расширяет его с помощью новой функциональности, доступной для доступа к данным. – Ben

+0

Понятно, что сам блог не может быть подклассом объекта базы данных, я использовал для ответа на вопрос, а не для оценки дизайна приложения. –

0

Мой стандартный метод сделать singleton класс, который действует как аксессуар базы данных, и базовый класс, на который наследуется все, требующее такого доступа.

Итак:

class Base { 

    protected $db; 

    function __construct(){ 
    $this->db= MyDBSingleton::get_link(); 
    //any other "global" vars you might want 
    } 

} 


class myClass extends Base { 

    function __construct($var) { 
    parent::__construct();// runs Base constructor 
    $this->init($var); 
    } 

    function init($id) { 
    $id=(int) $id; 
    $this->db->query("SELECT * FROM mytable WHERE id=$id"); 
    //etc. 
    } 
} 
0

Посмотрите PDO, которые бросают исключения для вас, чтобы поймать, если запрос не удается. Он широко используется и тестируется, поэтому у вас не должно возникать проблемы с поиском существующих решений во время его использования.

Чтобы внедрить его в свой класс в блоге:

class Blog { 

    private $_db; 

    public function __construct(PDO $db) { 
     $this->_db = $db 
    } 

    public function comment() { 
     return $this->_db->query(/*something*/); 
    } 

} 
12

я работал над чем-то подобным. Я рад этому классу singleton, который инкапсулирует логин базы данных.

<?php 
class db extends mysqli 
{ 
    protected static $instance; 
    protected static $options = array(); 

    private function __construct() { 
     $o = self::$options; 

     // turn of error reporting 
     mysqli_report(MYSQLI_REPORT_OFF); 

     // connect to database 
     @parent::__construct(isset($o['host']) ? $o['host'] : 'localhost', 
          isset($o['user']) ? $o['user'] : 'root', 
          isset($o['pass']) ? $o['pass'] : '', 
          isset($o['dbname']) ? $o['dbname'] : 'world', 
          isset($o['port']) ? $o['port'] : 3306, 
          isset($o['sock']) ? $o['sock'] : false); 

     // check if a connection established 
     if(mysqli_connect_errno()) { 
      throw new exception(mysqli_connect_error(), mysqli_connect_errno()); 
     } 
    } 

    public static function getInstance() { 
     if(!self::$instance) { 
      self::$instance = new self(); 
     } 
     return self::$instance; 
    } 

    public static function setOptions(array $opt) { 
     self::$options = array_merge(self::$options, $opt); 
    } 

    public function query($query) { 
     if(!$this->real_query($query)) { 
      throw new exception($this->error, $this->errno); 
     } 

     $result = new mysqli_result($this); 
     return $result; 
    } 

    public function prepare($query) { 
     $stmt = new mysqli_stmt($this, $query); 
     return $stmt; 
    }  
} 

Для использования вы можете иметь что-то вроде этого:

<?php 
require "db.class.php"; 

$sql = db::getInstance(); 

$result = $sql->query("select * from city"); 

/* Fetch the results of the query */ 
while($row = $result->fetch_assoc()){ 
    printf("%s (%s)\n", $row['Name'], $row['Population']); 
} 
?> 
+3

Мне нравится этот класс как пример Синглтона, но он будет спорить с необходимостью переопределять 'query()' и 'prepare()', поскольку API-интерфейс mysqli' уже предоставляет эти возможности. – sbeam

+0

Это замечательно. Есть закладки. ! – NZSteve

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