Freelancers BR

Encontre dicas, tutorias e empregos

Classe Conexao PHP + MySQLi

Pensei em criar alguns tutoriais sobre orientação a objetos no PHP, no fim acabei achando melhor criar algo mais útil que exemplos simples para quem está começando com poo, afinal existe uma infinidade de tutoriais de poo pela web.
Optei então pela criação de uma classe de conexão com o banco de dados MySQL utilizando a extensão MySQLi (extensão mysql ‘melhorada’).
Muitos desenvolvedores preferem utilizar a extensão PDO (PHP Data Objects), confesso que venho utilizando a MySQLi há algum tempo e tive apenas pequenos probleminhas com relação ao fechamento da conexão inesperadamente (sem ser por time out), porém isso não vem ao caso e era em outro contexto. Uma pequena desvantagem da MySQLi é o fato de não existir o método fetch_all da PDO, apesar de ser um pouco mais performática. O engraçado é que quando utilizo Zend Framework prefiro utilizar PDO, pois é, cada programador com suas manias. É fato que as duas são boas, tem suas vantagens e desvantagens. Percebo uma tendência maior dos desenvolvedores preferirem a PDO, talvez pelo fato de ser “mais orientada a objeto”.
Aproveitando o assunto, foi lançada a pouco tempo um novo driver chamado MySQLND.
Nesse exemplo vamos utilizar o design pattern Singleton.
Segue a classe de conexão com as funcionalidades comentadas em cada linha.

<?php
/**
 * Conexao com MySQL
 * Essa classe herda a superclasse mysqli
 * e necessario que a extensao mysqli esteja habilitada
 *
 * @author Lucas Renan
 */
class Conexao extends mysqli {

    /**
     * Connected
     * propriedade privada para 'indicar'
     * o estado da conexao
     *
     * @var boolean
     * @static
     */
    private static $_connected = false;

    /**
     * Instancia Conexao
     * propriedade para a implementacao do design pattern singleton
     *
     * @var Conexao
     * @static
     */
    private static $_instance = null;

    /**
     * Destrutor
     * Quando o objeto for destruido a conexao e fechada
     *
     * @param void
     * @return void
     */
    public function  __destruct() {

        $this->close();
    }

    /**
     * Retorna Conexao
     * Esse metodo verifica se ja existe na memoria uma instancia
     * da classe de Conexao
     * Se existir apenas retorna
     * se nao instancia
     *
     * @param void
     * @return Conexao
     */
    public static function getInstance() {

        if (null === self::$_instance) {

            self::$_instance = new self ();
        }

        return self::$_instance;
    }

    /**
     * Conecta no banco
     * Utiliza o construtor da superclasse
     *
     * @param void
     * @return void
     */
    public function connect() {
        //se nao estiver conectado
        if(!self::$_connected) {
            parent::__construct(
                    'localhost',
                    'user',
                    'senha',
                    'banco'
            );

            //se der erro na conexao gera uma excessao
            if(mysqli_connect_errno()) {
                throw new Exception('A Conexao falhou: '.mysqli_connect_error());
            }

            self::$_connected = true;
        }
    }

    /**
     * Fecha a conexao
     * Sobrescreve o metodo close da superclasse
     *
     * @param void
     * @return void
     */
    public function close() {

        if(self::$_connected) {
            parent::close();
            self::$_connected = false;
        }
    }

    /**
     * Consulta
     * Sobreescreve o metodo da superclasse
     *
     * @param string $sql
     * @return mysqli_result Object
     */
    public function query($sql) {
        //'tenta' conectar
        $this->connect();
        $result = parent::query($sql);

        if($result) {

            return $result;
        }
        else {
            //se der erro gera uma excessao
            throw new Exception('Query Exception: '.mysqli_error($this).' numero:'.mysqli_errno($this));
        }
    }

    /**
     * Ping servidor banco
     * Sobreescreve o metodo da superclasse
     *
     * @return boolean
     */
    public function ping() {
        // se estiver conectado retorna verdadeiro
        if(@mysqli_ping($this)) {
            return true;
        }
        else {
            return false;
        }
    }
}
?>

Veja como utilizá-la:

http://www.freelancersbrasil.com/select-com-a-classe-de-conexao/

Posts relacionados:

  1. SELECT com a classe de conexao
  2. Classe Conexao JSP + MySQL
  3. PDO ou Mysqli ?
  4. Conexão com MySQL
  5. SELECT com JSP e MySQL

Tags: , , , , , ,

Postado em sexta-feira, julho 17th, 2009 at 18:19 na categoria MySQL, PHP, Tutoriais. Siga o RSS 2.0 feed. You can leave a response, or trackback from your own site.

4 Respostas to “Classe Conexao PHP + MySQLi”

  1. 18/07/2009 as 0:01

    Éber Freitas Dias disse:

    Fala cara,

    Escrevi um novo artigo explicando como fazer os joins no CakePHP lá :) Aguardo seu feedback:

    http://www.eberfdias.com/blog/2009/07/17/fazendo-joins-e-instanciando-models-on-the-fly-no-cakephp/

    []‘s

  2. 4/08/2009 as 18:24

    SELECT com a classe de conexao « Fernando Softov disse:

    [...] demonstrar como utilizar a Classe de Conexão criada no tutorial anterior, com um simples [...]

  3. 7/12/2010 as 22:14

    Kiver disse:

    Meus parabéns verdadeiramente singletown ajuda muito, pra mim é a maior utilidade de se extender da mysqli, dando mais liberdade ao programador..

    Vlw

  4. 7/12/2010 as 22:55

    Kiver disse:

    Cara me da uma idéia de como usar prepare nessa função tentei fazer da mesma forma que o query só q não deu,

    /**
    * Prepare
    * Sobreescreve o metodo da superclasse
    *
    * @param string $sql
    * @return mysqli_result Object
    */
    public function prepare($sql) {
    //’tenta’ conectar
    $this->connect();
    $result = parent::prepare($sql);

    if($result) {

    return $result;
    }
    else {
    //se der erro gera uma excessao
    throw new Exception(‘Não foi possivel preparar o SQL ['.$sql.']: ‘.mysqli_error($this).’ numero:’.mysqli_errno($this));
    }
    }

    Não da erro nem da nada mas qndo vou usar os metodos do prepare não surte efeito

    $Conexao = Conexao::getInstance();

    //submete a consulta ao banco
    $sql = ‘SELECT ID_USUARIO,EMPRESA_ID,NOME FROM GUSUARIO WHERE ID_USUARIO = ?’;
    $result = $Conexao->prepare($sql);
    $I = 3;
    $result->bind_param(‘i’, $I);

    $result->bind_result($id, $titulo, $link);
    echo($id);
    echo($titulo);
    echo($link);

Deixe seu comentário!