Is there any possibility to create a configuration file with global variables that are visible inside the class? Something similar to this:
config.php:
$config['host_address'] = 'localhost';
$config['username '] = 'root';
$config['password'] = 'root';
$config['name'] = 'data';
db.php:
include('config.php');
class DB
{
private $_config = array($config['host_address'], $config['username'], $config['password'], $config['name']);
...
Current property:
private $ _config = array();
I don't want to transmit through the constructor to my Singleton database connector:
DB::getInstance(array('localhost', 'root', 'root', 'data'));
Your problem is that you are trying to use an expression in the class definition here:
class DB
{
private $_config = array($config['host_address'], ...
That is syntactically incorrect (you can only use constant values for that), and I wouldn't expect it to locate the intended scope there. What you should do instead is initialize this property in the construtor instead:
class DB
{
private $_config;
function __construct() {
global $config;
$this->_config = array($config['host_address'], $config['username'], $config['password'], $config['name']);
}
Or even lazier, just use include('config.php');
in place of the global $config
alias. That way your config script will extract $config as local variable within the constructor, which is all you need.
Everyone has their own preferences. I prefer to store my DB settings in a .ini outside of the webroot and then give it a 0600 chmod value, to prevent anyone but the owner reading it.
An example .ini will look like:
[database]
driver = mysql
host = localhost
;port = 3306
schema = yourdbname
username = dbusername
password = some_pass
Then you can use the php function parse_ini_file
then in your constructor you just read that in and parse it into an array:
public function __construct($file = 'dbsettings.ini')
{
// @todo: change this path to be consistent with outside your webroot
$file = '../' . $file;
if (!$settings = parse_ini_file($file, TRUE)) throw new exception('Unable to open ' . $file . '.');
$dns = $settings['database']['driver'] .
':host=' . $settings['database']['host'] .
((!empty($settings['database']['port'])) ? (';port=' . $settings['database']['port']) : '') .
';dbname=' . $settings['database']['schema'];
// if not PDO, this part needs to be changed parent::__construct($dns, $settings['database']['username'], $settings['database']['password']);
}
And viola, you have a simple and secure way to setup your database connection. This class was taken from a PDO extender class, so if you are not using PDO you need to change that line, but as yo ucan see you get the username etc in a $settings
array.
I would HIGHLY avoid storing any type of database information into a CONSTANT
or GLOBAL
type variable. This way, the $settings
is only available to that class function and nothing else, providing an extra bit of security layer.
You could try defines:
define('host_address', 'root');
define('username', 'root');
`Usage:
DB::getInstance(array(host_address, username, ...));