2011-10-17 23 views
6

Sto cercando di connettersi a un database (MySQLi) solo una volta, ma sto avendo problemi a farlo.Variabile globale - connessione al database?

Come faccio a fare una connessione globale per l'intero script? Ci sono più file (index.php, /classes/config.class.php, /classes/admin.class.php, ecc.).

ho provato la seguente:

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

Anche in questo caso, in 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; 
} 

Io uso la classe con la codice seguente: $config = new db();

Sono davvero perplesso a t come devo farlo. Qualcuno può aiutare?

--- --- Modifica Questo è il mio nuovo file 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; 
} 

E questo è come sto caricarlo:

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

Tuttavia, l'esecuzione un real_escape_string risulta nei seguenti errori:

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

È possibile utilizzare il [modello singleton] (http://en.wikipedia.org/wiki/Singleton_pattern) – knittl

+1

oppure è possibile imparare l'iniezione di dipendenza invece di utilizzare il [singleton antipattern] (http://stackoverflow.com/ domande/4595964/who-needs-singletons/4596323 # 4596323) – Gordon

+1

Sì ... i singleton portano sempre a dibattiti accesi. Stavo solo dando contributi e idee – knittl

risposta

14

Personalmente, io uso una classe singleton. Qualcosa di simile a questo:

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

?> 

Poi basta utilizzare $db = Database::getConnection(); ovunque ne ho bisogno.

+0

Singleton può essere serializzato e clonato, il che significa che non garantisce l'esistenza di una sola istanza. – Gordon

+0

OK, l'ho aggiunto alla classe di configurazione e ho tentato di caricarlo. Tuttavia, ci sono errori (vedi il post principale, sotto la riga --- edit ---). Qualche idea che cosa è sbagliato? – Peter

+1

@Peter Non aggiungerlo a un'altra classe. Questa è una classe singleton che dovrebbe essere autonoma e non dovrebbe avere un costruttore pubblico. Basta usare '$ db = Database :: getConnection();' per ottenere un'istanza MySQLi aperta ovunque sia necessario. – megaflop

Problemi correlati