Pergunta

Eu quero ser capaz de fazer classes que estendem a classe MySQLi para executar todas as suas consultas SQL.

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

Eu não sei como fazer isso sem globalizar o objeto $ mysql para uso em meus outros métodos ou classes.

class Blog {

public function comment() {
    global $mysql;

    //rest here
}

}

Qualquer ajuda seria apreciada.

Graças.

Foi útil?

Solução

A minha sugestão é criar uma classe Singleton DataAccess, instanciar essa classe em um arquivo de configuração global e chamá-lo em sua classe Blog como $query = DataAccess::query("SELECT * FROM blog WHERE id = ".$id).

Olhe para o padrão Singleton, é um muito fácil de entender designpattern. Perfeito para esta situação.

Sua classe DataAccess pode ter vários métodos como query, fetchAssoc, numRows, checkUniqueValue, transactionStart, transactionCommit, transactionRollback etc etc. Aqueles função também pode ser configurado como uma interface que será implementado pela classe DataAccess. Dessa forma, você pode facilmente estender sua classe DataAccess para vários sistemas de gerenciamento de banco de dados.

A descreve acima praticamente meu modelo DataAccess.

Outras dicas

Eu estava trabalhando em algo similar. Estou feliz com esta única classe que encapsula o login banco de dados.

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

Para usar você pode ter algo como isto:

<?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']); 
} 
?>

Você pode usar PHP do estende palavra-chave apenas para qualquer outra classe:

class MyCustomSql extends mysqli {

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

    public function someOtherMethod() {
    }
}

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

ou melhor agregação uso objeto em vez de herança:

class MySqlManipulator {

    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_blah");
    }
}

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

Tenha um olhar em DOP , que lançar exceções para você para pegar se uma consulta falha. É amplamente utilizado e testado para que você não deve ter problemas para encontrar soluções existentes, enquanto a usá-lo.

Para injetá-lo em sua classe blog:

class Blog {

    private $_db;

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

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

}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top