tro*_*ock 2 php mysql database oop mysql-connect
是否可以保留所有与数据库相关的配置(主机名,用户名,密码和数据库)以及连接到并在单独的类中选择正确数据库的功能?
我试过这样的事情:
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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后在另一个类中我会在类__construct函数中使用:
require_once('database.php');
var $db_conn = new Database();
Run Code Online (Sandbox Code Playgroud)
但这并没有保存连接,它最终默认为服务器本地数据库连接.或者,在执行某些数据库命令之前,我是否每次都必须执行数据库命令?
我修改了你的课程,因为你似乎期望它:
<?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;
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
$db = new Database();
$conn = $db->connect();
Run Code Online (Sandbox Code Playgroud)
请注意,您可以根据需要多次调用connect(),它将使用当前连接,或者如果它不存在则创建一个连接.这是一件好事.
另请注意,每次实例化 Database对象(使用new)时,您都将创建与数据库的新连接.我建议您考虑将Database类实现为Singleton或将其存储在Registry中以进行全局访问.
你也可以用脏的方式把它推到$ 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);
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
$res = Database::getInstance()->query("SELECT * FROM foo;");
Run Code Online (Sandbox Code Playgroud)
要么
$db = Database::getInstance();
$db->query("UPDATE foo");
$db->query("DELETE FROM foo");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4034 次 |
| 最近记录: |