Mysqli nesnesini kullanarak php nesneler ile mysql bağlanmak için en iyi yol

3 Cevap php

Benim php app veritabanına bağlanan bir nesne varsa, benim veritabanı işlemleri için nesne yanı mysqli kullanıyorum diyelim.

Örnek:

$dbase = new mysqli('localhost','dbuser','dbpass','dbname');
$oresult = $dbase->query("SELECT `field` FROM `table` WHERE `otherfield` = 12;");
if($oresult->num_rows > 0) {
    $row = $oresult->fetch_row();
    $data = $row[0];
}

ama ben dBASE konuşmak istiyorum, başka bir özel nesne var.

<?php
class Thing {
    private $sql = '';
    public $results = '';

    public function __construct($sql) {
        $this->sql = $sql;
        $this->get_data();
    }

    private function get_data() {
         // get the stuff from the dbase using $this->sql
         $this->results = 'whatever';
    }
}

$thing = new Thing("SELECT `field` FROM `table` WHERE 1");
// do whatever i want with $thing->results
?>

Ben satır 'bu-> sql $ kullanarak dBASE gelen / / almak şeyler' var nerede i dBASE bağlanmak ve veri almak isterim.

O ya da ben bir şekilde kullanarak ben zaten nesnesine başvurabilirsiniz (i var her nesneye iletilen bağlantı bilgilerini almak gerekir çünkü sorunları bkz.) yeni bir mysqli nesne oluşturmak için en iyisidir

global $dbase

get_data işlev içinde.

Nedir iyi uygulama?

3 Cevap

DB bağlantıları için bir sarıcı sınıf oluşturmak. Sarıcı bir tek olabilir veya statik alanda mysqli bağlantıyı depolayabilir.

class DB {
    static public $_connection;
    static function connection(...) {
        if (! self::$_connection) {
            self::$_connection = mysqli_connect(...);
        }
        return self::$_connection;
    }
}

Bu da, tek bir komut dosyası veya bir yapılandırma dosyasında saklayarak, kolay kullanıcı kimlik bilgilerini izole etmek için yapar.

Bunun yerine bağlantıyı açığa sınıf DB, sen DB sınıfını kendisi kullanabilirsiniz. connection() bir kurucu dönüşmesi bir prepare() yöntemi ve bir DBStatement sınıf yazmak.

class DB {
    static private $_connection;
    function __construct(...) {
        if (! self::$_connection) {
            self::$_connection = mysqli_connect(...);
        }
    }
    // returns an SQLStatement
    function prepare($query) {
    }
}

Mysql bağlantılarını yaparken çok hızlı olduğunu, bu yüzden nerede ihtiyaç vardır benim bağlantıları açmak ve kapatmak için eğilimindedir.

Ben dönmek gerekiyor sonuçları almak için 3 veritabanı sorgularını yapmak gerekiyorsa Yani, o zaman ben bunu, ama sonunda ben bu bağlantıyı kapanacak.

Yani, benim denetleyicisi, bir bağlantı yapar gerekli DAO çağrıları yapar, ve sonra kapanır.

Bu Thing class sadece önceden yapılmış olabilir bir bağlantı kullanmak için gidiyoruz eğer öyleyse, o zaman ben sadece bağlantısını yapmak ve daha sonra bu sınıfta kapatmak istiyorsunuz.

Bir denetleyici dışına etrafında geçen ile sorun bağlantının devlet olarak kaybolmak kolay olmasıdır.

Ben bağlantılarını yapar ve bir sonraki görüşme için ipucu onları önbelleğe bir fabrika sınıfı var. O ayrı bağlantı kimlik bilgilerini tutmak amacıyla aynı veritabanına birden çok bağlantı oluşturarak desteklemek olacaktır.

class dbtool 
{
    private static $instance   = false;
    private static $connections= false;

    private function __construct() { 
        if( ! self::$instance ) {
            self::$instance = $this;
            self::$connections = array();
        }
    }
    public function getInstance() { 
        if( ! self::$instance ) 
            self::$instance = new dbtool();
        return self::$instance;
    }
    public static function getConnection( $hint )
    {
        if( ! self::$instance ) return false;
        if( ! array_key_exists( $hint, self::$connections ))
            self::$connections[ $hint ] = self::$connectByHint( $hint );
        return self::$connections[ $hint ];
    }
    // a list of database creds by hint, etc...
    private static function connectByHint( $hint ) {}
}

Komut çıktığında bağlantıları Kapanış olur. Eğer bir cini gibi bir toplu işlemi, çalıştırıyorsanız, siz bağlantı hala hayatta olduğunu iddia etmek bir mysqli_ping () yapan bir Homegrown bağlayıcı sınıfta bağlantıları kendileri kesmek isteyebilirsiniz, ve değilse, yeniden.

Onlar print_r () veya var_export () kullanılarak maruz olabilir gibi ben de, üye değişkenler olarak veritabanı şifreleri tutarak vazgeçirmek. Eğer ben şifreleri için öneririm tahmin edebilir misiniz?