2011-10-17 36 views
6

Próbuję połączyć się z bazą danych (MySQLi) tylko raz, ale mam problemy z tym związane.Global Variable - połączenie z bazą danych?

Jak utworzyć połączenie globalne dla całego skryptu? Istnieje wiele plików (index.php, /classes/config.class.php, /classes/admin.class.php, itp.).

Próbowałem następujące:

w: config.class.php

public static $config = array(); 
public static $sql; 

function __construct() { 
    // database 
    db::$config['host'] = 'localhost'; 
    db::$config['user'] = '_'; 
    db::$config['pass'] = '_'; 
    db::$config['db'] = '_'; 

    // connect 
    db::$sql = new mysqli(db::$config['host'], db::$config['user'], db::$config['pass'], db::$config['db']); 
} 

Ponownie, w config.class.php

public function contectToDatabase($sql){ 
    $sql = new mysqli(db::$config['host'], db::$config['user'], db::$config['pass'], db::$config['db']); 
    $this->sql = $sql; 
} 

używam klasy z następujący kod: $config = new db();

Naprawdę jestem zaintrygowany t jak mam to zrobić. Czy ktoś może pomóc?

--- Edit --- To jest mój nowy plik config.class.php:

public static $config = array(); 
public static $sql; 

private static $db; 
private $connection; 

public function __construct() { 
    // database 
    db::$config['host'] = '_'; 
    db::$config['user'] = '_'; 
    db::$config['pass'] = '_'; 
    db::$config['db'] = '_'; 
    // connect 
    $this->connection = new mysqli(db::$config['host'], db::$config['user'], db::$config['pass'], db::$config['db']); 
} 
function __destruct() { 
    $this->connection->close(); 
} 
public static function getConnection() { 
    if($db == null){ 
     $db = new db(); 
    } 
    return $db->connection; 
} 

I to jest jak ja ładuje go:

require_once("classes/config.class.php"); 
$config = new db(); 
$sql = db::getConnection(); 

jednak działa true_escape_string powoduje następujące błędy:

Warning: mysqli::real_escape_string() [mysqli.real-escape-string]: Couldn't fetch mysqli in /home/calico/_/_.com/_/index.php on line 20 

Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in /home/calico/_/_.com/_/index.php on line 28 
+1

Można użyć [wzorca singleton] (http://en.wikipedia.org/wiki/Singleton_pattern) – knittl

+1

lub można nauczyć się Dependency Injection zamiast używać [singleton antipattern] (http://stackoverflow.com/ pytania/4595964/who-needs-singletons/4596323 # 4596323) – Gordon

+1

Tak ... Singletony zawsze skutkują gorącymi debatami. Po prostu dawałem wkład i pomysły – knittl

Odpowiedz

14

Osobiście używam klasy singleton. Coś takiego:

<?php 

class Database { 

    private static $db; 
    private $connection; 

    private function __construct() { 
     $this->connection = new MySQLi(/* credentials */); 
    } 

    function __destruct() { 
     $this->connection->close(); 
    } 

    public static function getConnection() { 
     if (self::$db == null) { 
      self::$db = new Database(); 
     } 
     return self::$db->connection; 
    } 
} 

?> 

Następnie wystarczy użyć $db = Database::getConnection();, gdy jest to potrzebne.

+0

Twój Singleton można serializować i klonować, co oznacza, że ​​nie zapewnia on tylko jednego wystąpienia. – Gordon

+0

OK, dodałem go do klasy config i próbowałem go załadować. Są jednak błędy (patrz główny post, pod linią --- edit ---). Jakieś pomysły, co jest nie tak? – Peter

+1

@Peter Nie dodawaj go do innej klasy. Jest to klasa pojedyncza, która powinna być samodzielna i nie powinna mieć publicznego konstruktora. Po prostu użyj '$ db = Database :: getConnection();', aby uzyskać otwartą instancję MySQLi tam, gdzie jej potrzebujesz. – megaflop

Powiązane problemy