2011-10-17 24 views
6

Estoy tratando de conectarme a una base de datos (MySQLi) solo una vez, pero estoy teniendo problemas para hacerlo.Variable global - conexión a la base de datos?

¿Cómo hago una conexión global para todo el script? Hay varios archivos (index.php, /classes/config.class.php, /classes/admin.class.php, etc.).

He intentado lo siguiente:

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

Una vez más, en 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; 
} 

utilizo la clase con el código siguiente: $config = new db();

Realmente me desconcierto t cómo voy a hacer esto. ¿Alguien puede ayudar?

--- --- Editar Este es mi nuevo archivo 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; 
} 

Y así es como estoy cargarlo:

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

Sin embargo, ejecutar un real_escape_string da como resultado los siguientes errores:

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

Puede usar el [patrón singleton] (http://en.wikipedia.org/wiki/Singleton_pattern) – knittl

+1

o puede aprender Dependency Injection en lugar de usar el [singleton antipattern] (http://stackoverflow.com/ preguntas/4595964/who-needs-singletons/4596323 # 4596323) – Gordon

+1

Sí ... los singletons siempre resultan en debates candentes. Solo estaba dando sugerencias e ideas – knittl

Respuesta

14

Personalmente, uso una clase singleton. Algo como esto:

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

?> 

Entonces simplemente use $db = Database::getConnection(); donde lo necesite.

+0

Su Singleton se puede serializar y clonar, lo que significa que no garantiza que solo haya una instancia. – Gordon

+0

OK, lo he agregado a la clase config, y he intentado cargarlo. Sin embargo, hay errores (vea la publicación principal, debajo de la línea --- edit ---). ¿Alguna idea de lo que está mal? – Peter

+1

@Peter No lo agregue a otra clase. Esta es una clase singleton que debe ser independiente y no debe tener un constructor público. Simplemente use '$ db = Database :: getConnection();' para obtener una instancia MySQLi abierta donde la necesite. – megaflop

Cuestiones relacionadas