是否有可能把所有我的数据库相关的配置(主机名,用户名,密码和数据库)以及功能来连接和一个单独的类中选择正确的数据库?
我想是这样的:
class Database
{
var $config = array(
'username' => 'someuser',
'password' => 'somepassword',
'hostname' => 'some_remote_host',
'database' => 'a_database'
);
function __construct() {
$this->connect();
}
function connect() {
$db = $this->config;
$conn = mysql_connect($db['hostname'], $db['username'], $db['password']);
if(!$conn) {
die("Cannot connect to database server");
}
if(!mysql_select_db($db['database'])) {
die("Cannot select database");
}
}
}
然后在另一个类我将在类__construct功能使用:
require_once('database.php');
var $db_conn = new Database();
但这并不保存连接,它结束了默认为服务器的本地数据库连接。 或做我必须做的数据库每次命令之前,我执行一些数据库的命令?
我修改你的类工作,因为你似乎是它期待:
<?php
class Database
{
var $conn = null;
var $config = array(
'username' => 'someuser',
'password' => 'somepassword',
'hostname' => 'some_remote_host',
'database' => 'a_database'
);
function __construct() {
$this->connect();
}
function connect() {
if (is_null($this->conn)) {
$db = $this->config;
$this->conn = mysql_connect($db['hostname'], $db['username'], $db['password']);
if(!$this->conn) {
die("Cannot connect to database server");
}
if(!mysql_select_db($db['database'])) {
die("Cannot select database");
}
}
return $this->conn;
}
}
用法:
$db = new Database();
$conn = $db->connect();
请注意,您可以调用connect()多次,只要你喜欢,它会使用当前的连接,或创建一个,如果它不存在。 这是一件好事 。
此外,注意,每次实例化一个数据库对象时(使用新的),你将创建一个到数据库的新连接。 我建议你看看到实现你的数据库类作为一个单身或者其存储在注册表的全局访问。
你也可以做到这一点的肮脏的方式和$ GLOBALS推它。
编辑
我把修改您的类来实现Singleton模式,并按照PHP5 OOP惯例的自由。
<?php
class Database
{
protected static $_instance = null;
protected $_conn = null;
protected $_config = array(
'username' => 'someuser',
'password' => 'somepassword',
'hostname' => 'some_remote_host',
'database' => 'a_database'
);
protected function __construct() {
}
public static function getInstance()
{
if (null === self::$_instance) {
self::$_instance = new self();
}
return self::$_instance;
}
public function getConnection() {
if (is_null($this->_conn)) {
$db = $this->_config;
$this->_conn = mysql_connect($db['hostname'], $db['username'], $db['password']);
if(!$this->_conn) {
die("Cannot connect to database server");
}
if(!mysql_select_db($db['database'])) {
die("Cannot select database");
}
}
return $this->_conn;
}
public function query($query) {
$conn = $this->getConnection();
return mysql_query($query, $conn);
}
}
用法:
$res = Database::getInstance()->query("SELECT * FROM foo;");
要么
$db = Database::getInstance();
$db->query("UPDATE foo");
$db->query("DELETE FROM foo");
你当然可以保持你的连接信息在一个单独的文件。
只需保存你的连接对象 - 在你的connect()函数$连接 - 在一个类变量。 然后,您就可以在调用重用。
在你的方法连接()$ conn是只有局部变量,只有在该方法的范围存在。 一旦该方法返回不会有(其他)参照连接资源,它会被收集/配置。 你需要至少
$this->conn = mysql_connect(...)
这里附带PDO例如单身。 由于@hodobave
<?php
/**
* DB Connection class
* Singleton pattern
* An single instance of DB connection is created
**/
class Db{
protected static $_instance = null;
protected $_conn;
protected $_config = [
'username' => 'root',
'password' => '',
'hostname' => 'localhost',
'database' => 'news',
];
protected function __construct(){
}
public function getInstance(){
if(null === self::$_instance){
self::$_instance = new self();
}
return self::$_instance;
}
public function getConnection(){
if(is_null($this->_conn)){
//connect here
$db = $this->_config;
$dsn = "mysql:host={$db['hostname']};dbname={$db['database']}";
$this->_conn = new PDO($dsn, $db['username'], $db['password']);
}
return $this->_conn;
}
public function query($sql){
$args = func_get_args();
array_shift($args);
$statement = $this->getConnection()->prepare($sql);
$statement->execute($args);
return $statement->fetchAll(PDO::FETCH_OBJ);
}
}
$res = Db::getInstance();
$users = $res->query("SELECT * FROM `user` WHERE id=?",1);
print_r($users);
?>