0

我得出的结论是,在 OO 方法中使用 mysqli 比程序方法更好。(来源:为什么使用 mysqli 的面向对象 PHP 比过程方法更好?)。但我不太确定我所做的是否真的比我以前所做的更有效率。

我有一个运行 sql 查询的函数。这就是我的代码块的样子:

数据库连接:

function connectDB(){
     $con = mysqli_connect(server, username, password, database);
     return $con;
}

查询功能:

function executeQuery($payload){
     $con = connectDB;
     $result = mysqli_query($con, $payload);
     return $result;
}

如您所见,这不是很有效,因为每次executeQuery调用我都会创建一个新的数据库连接。所以我想我会尝试使用 OOP。

数据库连接(OOP):

function connectDB(){
     $con = new mysqli(server, username, password, database);
     return $con;
}

数据库查询(OOP):

function executeQuery($payload){
     $con = connectDB();
     $result = $con->query($payload);
     return $result;
}

现在对我来说,似乎我显然做错了什么。每次调用查询时,我都会重新实例化mysqli该类,并且我认为这意味着我正在建立另一个数据库连接。

那么我该如何正确有效地做到这一点呢?

4

3 回答 3

4

那么我该如何正确有效地做到这一点呢?

这实际上与以程序与 OOP 方式使用 MySQLi 无关。

这与以下行有关:

$con = connectDB();

这将在每个查询上重新创建数据库连接。正如您所指出的,这不是有效的。

有很多方法可以解决这个问题。例如:

  • 直接使用mysqli类。
  • 传递$conexecuteQuery()依赖注入
  • connectDB()使用和创建一个 DB 类executeQuery()

我通常mysqli直接使用,因为我认为没有理由包装原生类。我全局创建连接对象(在配置文件中)并在其他对象/函数需要它时使用依赖注入。

于 2013-09-03T16:49:51.353 回答
-1

尽管您的程序方法可以很容易地解决

function connectDB(){
     return mysqli_connect(server, username, password, database);
}
function executeQuery($payload){
    static $con;
    id (!$con)
    { 
        $con = connectDB();
    }
    return $con->query($payload);
}

OOP 方法确实会更好。我不是 OOP 专业人士,但您可以看看我的方法,该方法至少使用封装来隐藏内部的所有脏工作,并提供简洁的方法来获取所需格式的数据,如下所示:

// to get a username
$name = $db->getOne('SELECT name FROM table WHERE id = ?i',$_GET['id']);
// to get an array of data
$data = $db->getAll("SELECT * FROM ?n WHERE mod=?s LIMIT ?i",$table,$mod,$limit);
// to get an array indexed by id field
$data = $db->getInd('id','SELECT * FROM ?n WHERE id IN ?a','table', array(1,2));
// to get a single dimensional array
$ids = $db->getCol("SELECT id FROM tags WHERE tagname = ?s",$tag);

// a simple code for the complex INSERT
$data = array('offers_in' => $in, 'offers_out' => $out);
$sql = "INSERT INTO stats SET pid=?i,dt=CURDATE(),?u ON DUPLICATE KEY UPDATE ?u";
$db->query($sql,$pid,$data,$data); 
于 2013-09-03T17:13:23.213 回答
-2

作为您确切问题的解决方案:“您不想在每次执行查询时都实例化一个新的 MySQL 连接”,

好吧,我们可以考虑以下几点:

您需要在 GLOBAL 范围内创建连接变量 ($con),这样当通过任何函数访问时,您可以获取之前设置的变量,而不是实例化新变量。

我们可以使用关键字“global”来做到这一点,如下所示:


连接功能:

function &connectDB(){
     global $con;
     if(empty($con)) {
         $con = new mysqli(server, username, password, database);
     }
     return $con;
}

为了获得更高的性能,我们避免使用引用函数 ( &connectDB ) 克隆/复制连接变量/资源,


查询执行功能

现在我们已经灵活地设置了连接函数,要设置queryExecution函数,我们可以使用多个解决方案:

第一个解决方案:

function executeQuery($payload){
     $con = &connectDB(); // do not forget the () , it's good practice
     return $con->query($payload);
}

在这个解决方案中,我们使用了“reference”,所以表达式:

$con = &connectDB();

将变量 $con 设置为全局 $con 的引用/快捷方式(即:仅指向全局变量 $con)

或者

第二种解决方案:

function executeQuery($payload){
     global $con;
     return $con->query($payload);
}

但对于第二种解决方案:函数“connectDB()”必须在调用“executeQuery()”之前至少调用一次,以确保已与数据库建立连接,

请记住,根据此解决方案,多次调用“connectDB()”不会创建多个连接,一旦调用,就会创建连接,如果再次调用,它将返回之前创建的连接。

希望能帮助到你 :)

顺便说一句:数据库连接使用 OOP 方法,它比程序方法有更多好处,我推荐使用PDO,它更便携。

于 2013-09-03T17:11:52.550 回答