使用mysqli对象使用php对象连接到mysql的最佳方法

时间:2009-10-29 02:34:49

标签: php mysql

如果我在我的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函数中。

什么是最佳做法?

3 个答案:

答案 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()公开。你能猜出我建议的密码吗?