Mysqli 在一个函数中建立连接,并将其用于其他函数中的 sql 查询


Mysqli Make connection in one function and use it for sql queries in other function

我试图创建一个类似于大多数cms的数据库类,所以我在一个函数中建立连接并返回连接对象以用于类中其他函数中的查询。

<?php

class my_database {
    var $host = 'localhost';
    var $user = 'prince';
    var $pass = 'abcd1234wxyz';
    var $db = 'world';
    function __construct() {
        $this->db_connect();
    }
    function db_connect() {
        $mysqli = mysqli_connect($host,$user,$pass,$db);
        /* check connection */
        if (!$mysqli) {
            printf("Connect failed: %s'n", mysqli_connect_error());
            exit();
        }
        return $mysqli;
    }
    function query($query) {
        $mysqli = $this->db_connect();

        if ($result = mysqli_query($mysqli, $query)) {
            while ($row = mysqli_fetch_row($result)) {
                echo "<pre>";
                print_r($row);
                echo "</pre>";
            }

            mysqli_free_result($result);
        }  else
            echo "fails"; exit;
    }

}
$database  = new my_database;
/*************** Class Ends ****************************/
function get_results() {
    global $database;
    $database->query("select * from city limit 10");
}
get_results();
?>

它总是输出fails,我是哎呀的新手&mysqli,也许我错过了一些明显的东西。请帮忙!

几个问题:

  • 您应该以 $this->varname 的形式访问实例变量。(例如,在连接中,您应该使用 $this->host...)
  • 您应该将$mysqli作为实例变量 $this->mysqli 进行访问。

(否则有很多免费的 php 数据库层,例如 adodb。

你的类在很多方面都是一种不好的做法。首先,您在这里使用的是旧的 PHP4 语法,该语法已经不受支持。强烈建议切换到 PHP5 (http://de2.php.net/manual/en/language.oop5.php)。

其次,我会使用PDO而不是MySQLi。但是,无论您使用哪种接口,它们都已经具有面向对象的接口。那么为什么要使用程序呢?-> http://de2.php.net/manual/en/class.mysqli.php (MySQLi)

http://de2.php.net/manual/en/book.pdo.php (PDO)

关于您的实施,也有一些非常糟糕的做法。只需仔细查看您的 db_connect() 函数:每当使用 query() 方法时都会调用它,这意味着每次执行查询时都会创建连接!这是没有用的,每个请求只需要一个连接!对此的解决方案是保存打开的数据库连接的对象属性。

最重要的是,在底部的代码中,您在使用"全局"时破坏了 OOP 的一些关键概念。继续使用依赖注入,这意味着将$database对象注入您的函数( function(my_database $db) {} )。

你在互联网上做的事情有很多实现,只需使用谷歌;)