首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用mysqli对象通过php对象连接到mysql的最佳方法

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

Stack Overflow用户
提问于 2009-10-29 10:34:49
回答 3查看 3.8K关注 0票数 1

如果我的php应用程序中有一个连接到数据库的对象,假设我正在使用mysqli作为我的数据库事务的对象。

示例:

代码语言:javascript
复制
$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对话。

代码语言:javascript
复制
<?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对象(我认为这有问题,因为我需要将连接信息传递给我拥有的每个对象),或者我是否可以通过使用

代码语言:javascript
复制
global $dbase

在get_data函数内部。

最好的实践是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-29 10:59:14

为DB连接创建一个包装类。包装器可以是单例,也可以将mysqli连接存储在静态字段中。

代码语言:javascript
复制
class DB {
    static public $_connection;
    static function connection(...) {
        if (! self::$_connection) {
            self::$_connection = mysqli_connect(...);
        }
        return self::$_connection;
    }
}

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

您可以使用DB类本身,而不是DB类来公开连接。把connection()变成一个构造函数,写一个prepare()方法和一个DBStatement类。

代码语言:javascript
复制
class DB {
    static private $_connection;
    function __construct(...) {
        if (! self::$_connection) {
            self::$_connection = mysqli_connect(...);
        }
    }
    // returns an SQLStatement
    function prepare($query) {
    }
}
票数 1
EN

Stack Overflow用户

发布于 2009-10-29 10:58:24

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

因此,如果我需要进行3次数据库查询才能获得需要返回的结果,那么我会这样做,但在最后我会关闭该连接。

因此,我的控制器建立一个连接,调用所需的DAO,然后关闭它。

因此,如果这个Thing类只是要使用一个可能已经建立的连接,那么我只需要建立这个连接,然后在这个类中关闭它。

在控制器外部传递它的问题是很容易丢失连接的状态。

票数 0
EN

Stack Overflow用户

发布于 2009-10-30 12:47:09

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

代码语言:javascript
复制
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()公开。你能猜出我建议的密码是什么吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1641316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档