繁体   English   中英

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

[英]Best way to connect to mysql with php objects using mysqli object

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

什么是最佳实践?

创建用于数据库连接的包装器类。 包装器可以是单例,也可以将mysqli连接存储在静态字段中。

class DB {
    static public $_connection;
    static function connection(...) {
        if (! self::$_connection) {
            self::$_connection = mysqli_connect(...);
        }
        return self::$_connection;
    }
}

这也使隔离用户凭证,将它们存储在单个脚本或配置文件中变得容易。

可以使用数据库类本身来代替暴露连接的类数据库。 connection()变成构造函数,编写prepare()方法和DBStatement类。

class DB {
    static private $_connection;
    function __construct(...) {
        if (! self::$_connection) {
            self::$_connection = mysqli_connect(...);
        }
    }
    // returns an SQLStatement
    function prepare($query) {
    }
}

Mysql建立连接的速度非常快,因此我倾向于在需要连接的地方打开和关闭我的连接。

因此,如果我需要进行3个数据库查询以获取需要返回的结果,则可以这样做,但是最后我将关闭该连接。

因此,我的控制器建立了连接,对所需的DAO进行了调用,然后将其关闭。

因此,如果Thing类将使用可能已经建立的连接,那么我将建立连接,然后在该类中将其关闭。

将其传递到控制器外部的问题在于,很容易丢失连接状态。

我有一个工厂类,可以建立连接并通过提示为下一次调用缓存它们。 它将支持创建到同一数据库的多个连接,以保持连接凭据独立。

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()公开它们。 您能猜出我对密码的建议吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM