如果我的php应用程序中有一个连接到数据库的对象,假设我正在使用mysqli作为我的数据库事务的对象。
示例:
$dbase = new mysqli('localhost','dbuser','dbpass','dbname');
$oresult = $dbase->query("SELECT `field` FROM `table` WHERE `otherfield` = 12;");
if($oresult->num_rows > 0) {
$row = $oresult->fetch_row();
$data = $row[0];
}但是我有另一个自定义对象,我想和dbase对话。
<?php
class Thing {
private $sql = '';
public $results = '';
public function __construct($sql) {
$this->sql = $sql;
$this->get_data();
}
private function get_data() {
// get the stuff from the dbase using $this->sql
$this->results = 'whatever';
}
}
$thing = new Thing("SELECT `field` FROM `table` WHERE 1");
// do whatever i want with $thing->results
?>在我使用$this->sql从dbase获取东西的地方,我希望连接到dbase并获取数据。
最好是创建一个新的mysqli对象(我认为这有问题,因为我需要将连接信息传递给我拥有的每个对象),或者我是否可以通过使用
global $dbase在get_data函数内部。
最好的实践是什么?
发布于 2009-10-29 10:59:14
为DB连接创建一个包装类。包装器可以是单例,也可以将mysqli连接存储在静态字段中。
class DB {
static public $_connection;
static function connection(...) {
if (! self::$_connection) {
self::$_connection = mysqli_connect(...);
}
return self::$_connection;
}
}这也使得隔离用户凭证变得很容易,将它们存储在单个脚本或配置文件中。
您可以使用DB类本身,而不是DB类来公开连接。把connection()变成一个构造函数,写一个prepare()方法和一个DBStatement类。
class DB {
static private $_connection;
function __construct(...) {
if (! self::$_connection) {
self::$_connection = mysqli_connect(...);
}
}
// returns an SQLStatement
function prepare($query) {
}
}发布于 2009-10-29 10:58:24
Mysql建立连接的速度非常快,所以我倾向于在需要的地方打开和关闭连接。
因此,如果我需要进行3次数据库查询才能获得需要返回的结果,那么我会这样做,但在最后我会关闭该连接。
因此,我的控制器建立一个连接,调用所需的DAO,然后关闭它。
因此,如果这个Thing类只是要使用一个可能已经建立的连接,那么我只需要建立这个连接,然后在这个类中关闭它。
在控制器外部传递它的问题是很容易丢失连接的状态。
发布于 2009-10-30 12:47:09
我有一个工厂类,它建立连接并通过提示缓存它们以供下一次调用。它将支持创建到同一数据库的多个连接,以便保持连接凭据的独立。
class dbtool
{
private static $instance = false;
private static $connections= false;
private function __construct() {
if( ! self::$instance ) {
self::$instance = $this;
self::$connections = array();
}
}
public function getInstance() {
if( ! self::$instance )
self::$instance = new dbtool();
return self::$instance;
}
public static function getConnection( $hint )
{
if( ! self::$instance ) return false;
if( ! array_key_exists( $hint, self::$connections ))
self::$connections[ $hint ] = self::$connectByHint( $hint );
return self::$connections[ $hint ];
}
// a list of database creds by hint, etc...
private static function connectByHint( $hint ) {}
}当脚本退出时,会关闭连接。如果您正在运行一个批处理进程,比如一个守护进程,您可能希望将连接本身包装在一个自行开发的连接器类中,该类执行mysqli_ping()来断言连接仍然有效,如果没有,则重新连接。
我也不鼓励将数据库密码作为成员变量,因为它们可以使用print_r()或var_export()公开。你能猜出我建议的密码是什么吗?
https://stackoverflow.com/questions/1641316
复制相似问题