8

I am trying to connect to a database (MySQLi) just once, but am having problems doing so.

How do I make a connection global for the entire script? There are multiple files (index.php, /classes/config.class.php, /classes/admin.class.php, etc).

I've tried the following:

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

Again, 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;
}

I use the class with the following code: $config = new db();

I really am puzzled at how I'm to do this. Can anyone help?

--- Edit --- This is my new config.class.php file:

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

And this is how I'm loading it:

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

However, running a real_escape_string results in the following errors:

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
7
  • 1
    You could use the singleton pattern Commented Oct 17, 2011 at 11:20
  • 1
    or you could learn Dependency Injection instead of using the singleton antipattern Commented Oct 17, 2011 at 11:26
  • 1
    Yeah… singletons always result in hot debates. I was just giving input and ideas Commented Oct 17, 2011 at 11:28
  • SingletonVsJustCreateOne Commented Oct 17, 2011 at 11:37
  • Is there any way to have the connection as a global variable for each class? Eg: I set up a global variable called $sql, and set it to $sql = new mysqli(db::$config['host'], db::$config['user'], db::$config['pass'], db::$config['db']);? I don't want to repeat the database connectoin for every class. Commented Oct 17, 2011 at 12:16

1 Answer 1

17

Personally, I use a singleton class. Something like this:

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

?>

Then just use $db = Database::getConnection(); wherever I need it.

Sign up to request clarification or add additional context in comments.

6 Comments

Your Singleton can be serialized and cloned which means it does not ensure there is only one instance.
OK, I've added it to the config class, and have attempted to load it. However, there are errors (see the main post, under the ---edit--- line). Any ideas whats wrong?
@Peter Don't add it to another class. This is a singleton class that should be stand-alone and should not have a public constructor. Just use $db = Database::getConnection(); to get an open MySQLi instance wherever you need it.
@Gordon Yes, this is just a quick example; hence "Something like this"
Could I implement PDO with this?
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.