Question

Je veux pouvoir créer des classes qui étendent la classe MySQLi pour exécuter toutes ses requêtes SQL.

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

Je ne sais pas comment faire cela sans globaliser l'objet $ mysql à utiliser dans mes autres méthodes ou classes.

class Blog {

public function comment() {
    global $mysql;

    //rest here
}

}

Toute aide serait appréciée.

Merci.

Était-ce utile?

La solution

Je suggère de créer une classe Singleton DataAccess, d'instancier cette classe dans un fichier de configuration global et de l'appeler dans votre classe Blog comme $ query = DataAccess :: query (& SELECT; FROM * WHER blog id = " ;. $ id) .

Regardez dans le motif Singleton, il est assez facile à comprendre le designpattern. Parfait pour cette situation.

Votre classe DataAccess peut avoir plusieurs méthodes telles que requête , fetchAssoc , numRows , checkUniqueValue , transactionStart , transactionCommit , transactionRollback , etc. Ces fonctions peuvent également être configurées comme une interface implémentée par la classe DataAccess. De cette façon, vous pouvez facilement étendre votre classe DataAccess pour plusieurs systèmes de gestion de base de données.

La description ci-dessus décrit assez bien mon modèle DataAccess.

Autres conseils

Je travaillais sur quelque chose de similaire. Je suis heureux de cette classe singleton qui encapsule la connexion à la base de données.

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

Pour utiliser, vous pouvez avoir quelque chose comme ceci:

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

Vous pouvez utiliser le mot clé extend de PHP uniquement pour toute autre 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 mieux utilisez l'agrégation d'objets au lieu de l'héritage:

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!');

Ma méthode standard consiste à créer une classe singleton qui joue le rôle d'accès de base de données, et une classe de base dont tout ce qui nécessite un tel accès hérite.

Donc:

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.
  }
}

Consultez PDO , qui génère des exceptions pour vous. attraper si une requête échoue. Il est largement utilisé et testé, vous ne devriez donc pas avoir de difficulté à trouver les solutions existantes tout en l’utilisant.

Pour l'injecter dans votre classe de blog:

class Blog {

    private 

Consultez PDO , qui génère des exceptions pour vous. attraper si une requête échoue. Il est largement utilisé et testé, vous ne devriez donc pas avoir de difficulté à trouver les solutions existantes tout en l’utilisant.

Pour l'injecter dans votre classe de blog:

<*>db; public function __construct(PDO $db) { $this->_db = $db } public function comment() { return $this->_db->query(/*something*/); } }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top