سؤال

وأريد أن أكون قادرة على جعل الطبقات التي تمتد الطبقة MySQLi لأداء جميع الاستفسارات SQL لها.

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

وأنا لا أعرف كيفية القيام بذلك دون العولمة الكائن $ الخلية لاستخدامها في بلدي طرق أو الفئات الأخرى.

class Blog {

public function comment() {
    global $mysql;

    //rest here
}

}

وسيكون موضع تقدير أي مساعدة.

وشكرا.

هل كانت مفيدة؟

المحلول

واقتراحي هو لإنشاء فئة سينغلتون DataAccess، مثيل تلك الفئة في ملف التكوين العالمي والذي يطلق عليه في صفك مدونة مثل $query = DataAccess::query("SELECT * FROM blog WHERE id = ".$id).

والنظر في نمط سينغلتون، انها سهلة جدا لفهم designpattern. مثالية لهذا الوضع.

والطبقة DataAccess الخاص بك يمكن أن يكون العديد من الطرق مثل query، fetchAssoc، numRows، checkUniqueValue، transactionStart، transactionCommit، transactionRollback الخ الخ وهذه وظيفة يمكن أيضا أن يكون الإعداد باعتبارها واجهة الذي يحصل على تنفيذها من قبل الطبقة DataAccess. وبهذه الطريقة يمكنك بسهولة توسيع الطبقة DataAccess عن أنظمة إدارة قواعد البيانات متعددة.

ما سبق يصف حد كبير نموذج DataAccess بلدي.

نصائح أخرى

وكنت أعمل على شيء مماثل. أنا سعيد عن هذه الفئة المفردة التي بتغليف تسجيل الدخول قاعدة البيانات.

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

لاستخدام يمكن أن يكون شيء من هذا القبيل:

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

ويمكنك استخدام يمتد PHP في الكلمة فقط لأي فئة أخرى:

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

وأو أفضل تجميع الكائن استخدام بدلا من الميراث:

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

ولي طريقة هو معيار لجعل المفرد الفئة التي يعمل بمثابة استرجاع قاعدة البيانات، و فئة أساسية أن كل شيء تتطلب مثل هذا الوصول يرث من.

وهكذا:

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

وإلقاء نظرة على PDO ، الذي رمي استثناءات بالنسبة لك للقبض إذا فشل استعلام. انها تستخدم على نطاق واسع واختبارها لذلك ينبغي أن لا يكون لديك مشكلة في ايجاد الحلول القائمة في حين استخدامه.

لحقنه الدرجة بلوق الخاص بك:

class Blog {

    private $_db;

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

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

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top