MySQLi sınıfını genişletme

6 Cevap php

Ben tüm SQL sorguları gerçekleştirmek için MySQLi sınıfını genişletmek sınıfları yapmak mümkün olmak istiyorum.

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

Benim diğer yöntemler veya sınıfların kullanmak için $ mysql nesneyi küreselleşen olmadan bunu nasıl bilmiyorum.

class Blog {

public function comment() {
	global $mysql;

	//rest here
}

}

Herhangi bir yardım mutluluk duyacağız.

Teşekkürler.

6 Cevap

Benim önerim, bir Singleton DataAccess sınıf oluşturmak küresel bir yapılandırma dosyasında bu sınıf örneğini ve $query = DataAccess::query("SELECT * FROM blog WHERE id = ".$id) gibi blog sınıfta çağırmaktır.

Singleton deseni içine bak, bu designpattern anlamak oldukça kolaydır. Bu durum için mükemmel.

İşletme DataAccess class query, fetchAssoc, numRows, checkUniqueValue, transactionStart, {[gibi çeşitli yöntemler olabilir (5)]}, transactionRollback vs vs Bu fonksiyonu da DataAccess sınıf tarafından uygulanan alır bir arayüzü olarak kurulum olabilir. Bu şekilde kolayca birden çok veritabanı yönetim sistemleri için DataAccess sınıfını genişletebilirsiniz.

Yukarıdaki hemen hemen benim DataAccess modeli anlatılmaktadır.

Ben de benzer bir şey üzerinde çalışıyordu. Ben veritabanı oturumu kapsüller bu tekiz sınıf hakkında mutluyum.

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

Eğer böyle bir şey olabilir kullanmak için:

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

Benim standart yöntem, erişimi gerektiren her şeyi miras aldığını veritabanı erişimcisine gibi davranan bir singleton sınıfı ve bir temel sınıf yapmaktır.

Yani:

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

PHP Sadece başka bir sınıf için extends anahtar sözcüğünü kullanabilirsiniz:

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

ya da daha iyi yerine miras nesne toplanmasını kullanın:

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

Bir sorgu başarısız olursa yakalamak için istisnalar atmak PDO bir göz var. Eğer bir sorununuz bunu kullanarak ederken, mevcut çözümler bulmak zorunda olmamalıdır bu yüzden yaygın olarak kullanılan ve test ediyor.

Blogunuza sınıf içine enjekte:

class Blog {

    private $_db;

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

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

}

First: @emre-yazici I would have answered the same thing.

Soru:

"Ben MySQLi sınıfını genişletmek sınıfları yapmak mümkün olmak istiyorum"

takip göre:

class Blog {

Şahsen ben onun sınıf dediği umurumda değil: Blog / Blabla, benim varsayım onun db bağlantı yöntemi ile başa çıkmak için bir dosya bir sınıf oluşturmak ve bunu içermelidir ne olursa olsun dosya yapan bir $ db ardından sorguları = new Bazı db_getConnection işlevinde db_object ().

DbController.php
<?php
class db_Object extends mysqli {

protected $host = "mysqlHost";
protected $user = "mysqlUsername";
protected $password = "mysqlPassword";
protected $database = "mysqlDatabse";

// constructor
public function db_Object() {
    parent::__construct($this->host, $this->user, $this->password, $this->database);
}
?>

getData.php
<?php
include_once('DbController.php');
class getData {
function getConnection() {
 $db = new db_Object();
 return $db;
}

function get_PostCodes() {
 $db = $this->getConnection();
 $sql = "SELECT * FROM Postcodes":
 $db->query($sql);
}
?>

Ben hepimiz için kabul düşünüyorum. Eğer gitmek için yol olduğunu düşünüyorum diye, aslında çoğu php çerçeveler orada zaten bağlantılarını işlemek için bir nesne / DbController olacaktır.

(*OO means Object Oriented) I think that this question was poorly formulated and thus misleading. It's amazing that bennn is using OO, but couldn't think to put his Db connection in an object of it's own. Sounds like he's using concepts he doesn't quite understand? However he's asking about methodology, so that actually makes the question valid I guess... I already stopped caring about question validity.

!!!!!!!!!!!!!!!!!!!!!!!!!!! HOWEVER !!!!!!!!!!!!!!!!!!!!!!!!!!!

(* Singleton Benim anlayışım böyle bir nesne gerektiren her yürütme yeni bir nesne oluşturmadan, kullanmak olacağını bellekte kalır bir örneğidir. Hafif bir performans artışı http://en.wikipedia.org/wiki/Singleton_pattern *)

Anyone who made mention of 'SINGLETON' and 'Data class' in the same sentence IF I COULD DOWN-VOTE YOU I WOULD! SAYING THAT IS DOWNRIGHT EVIL!

Bir SINGLETON db sınıf için sadece "Maybe" geçerli durum bir raporlama sunucusu veya seçer, sadece yaptığı basit bir statik web sitesi olacak. Bunu yaparken bu durumda NoSQL gibi bir şey kullanabilirsiniz.

FOR ALL OTHER CASES, INCLUDING "I DON'T KNOW WHAT I'M DOING" CASE Create a new dbConnection every time you need to run SQL

AÇIKLAMA

When you use a Singleton and pass all your SQL statements through that one instance, As soon as you try something like $db->autocommit(false);

and start doing something like BEGIN TRANSACTION [...] UPDATE DELETE ROLLBACK COMMIT in different function calls, those SQL statements may go to the DB in an unorderly fashion. You may end up having another processes run a ROLLBACK when you wanted to run a COMMIT, and none of your changes will take place. You may have a COMMIT happen instead of a ROLLBACK and half your process get applied when you wanted it to cancel out instead. Leaving you with big time Data corruption in your database. I'm sure we could think of a million other types of SINGLETON corruptions that would screw up ALL of the flow of data between your php application and the Database. This is one of the drawbacks of the singleton pattern: "it introduces a global state".

Her zaman daha iyi ve daha güvenli bir model değil, yalnızca (DbController / db_object / ne olursa olsun örneği), yeni bir bağlantı oluşturarak ama aynı zamanda gelecekteki kanıtı. Sen bir tek ileride korkunç sorunları ile kendinizi hattına kötü gerekçesiyle ayarlama gibi DbController yapma, php uygulama / web sitesinde siz veya bir başkası tarafından uygulanması gereken gelecekteki ne gibi iyileştirmeler asla bilemezsiniz.

SINGLETON DB NESNELERI MÜŞAVİRLİK DUR LÜTFEN. YETER KÖTÜ KOD ZATEN orada var. Saygılarımızla.