如果我在我的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
?>
我有'//从dbase使用$ this-&gt; sql'行获取内容我希望连接到dbase并获取数据。
最好创建一个新的mysqli对象(我看到问题因为我需要将连接信息传递给我拥有的每个对象),或者我可以通过使用
以某种方式引用我已经拥有的对象global $dbase
在get_data函数中。
什么是最佳做法?
答案 0 :(得分:1)
为数据库连接创建一个包装类。包装器可以是单例,也可以将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) {
}
}
答案 1 :(得分:0)
Mysql在建立连接方面非常快,所以我倾向于在需要的地方打开和关闭我的连接。
所以,如果我需要进行3次数据库查询以获得我需要返回的结果,那么我会这样做,但最后我将关闭该连接。
因此,我的控制器建立连接,调用所需的DAO,然后关闭它。
所以,如果这个Thing
类只是使用可能已经建立的连接,那么我只是建立连接然后在这个类中关闭它。
将它传递到控制器外部的问题是,很容易迷失连接状态。
答案 2 :(得分:0)
我有一个工厂类,通过提示进行下一次调用来建立连接并缓存它们。它将支持创建到同一数据库的多个连接,以便保持连接凭证的独立性。
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()公开。你能猜出我建议的密码吗?