Frage

Ich möchte in der Lage sein, Klassen zu machen, die die MySQLi Klasse erweitern alle Anfragen seiner SQL auszuführen.

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

Ich weiß nicht, wie dies zu tun, um das $ mysql Objekt ohne globalisierenden in meinen anderen Methoden oder Klassen zu verwenden.

class Blog {

public function comment() {
    global $mysql;

    //rest here
}

}

Jede mögliche Hilfe würde geschätzt.

Danke.

War es hilfreich?

Lösung

Mein Vorschlag ist, eine Singleton Data Access-Klasse zu erstellen, diese Klasse in einer globalen Konfigurationsdatei instanziiert und es in Ihrem Blog Klasse wie $query = DataAccess::query("SELECT * FROM blog WHERE id = ".$id) nennen.

Schauen Sie in das Muster Singleton, es ist ein ziemlich leicht zu verstehen designpattern. Perfekt für diese Situation.

Ihre Data Access-Klasse kann mehrere Methoden wie query hat, fetchAssoc, numRows, checkUniqueValue, transactionStart, transactionCommit, transactionRollback etc etc. Die Funktion auch Setup als Schnittstelle sein könnte, die von der Data Access-Klasse implementiert wird. Auf diese Weise können Sie einfach Ihre Data Access-Klasse für mehrere Datenbank-Management-Systeme erweitern.

Das oben ziemlich beschreibt mein Data Access-Modell.

Andere Tipps

Ich arbeite an etwas ähnlichem. Ich bin glücklich über diese Singleton Klasse, die die Datenbank-Login kapselt.

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

So verwenden Sie so etwas wie dieses haben:

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

Sie können mit PHP erweitert das Schlüsselwort nur für jede andere Klasse:

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

oder eine bessere Nutzung Objekt Aggregation statt Vererbung:

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

Meine Standard-Methode ist eine Singletons Klasse zu machen, die als Datenbank-Zugriffs wirken, und eine Basisklasse, dass alles, was ein solcher Zugriff erfordern erbt von.

So:

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

Hier finden Sie aktuelle PDO , die Ausnahmen für Sie werfen wenn eine Abfrage nicht zu fangen. Es ist weit verbreitet und getestet, so dass Sie sollten kein Problem zu finden, bestehende Lösungen bei der Benutzung es haben.

Um es in Ihren Blog Klasse zu injizieren:

class Blog {

    private $_db;

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

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

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top