4

我正在尝试将代码从 mysql 转换为 mysqli。该代码在一个文件中使用单个 mysql_connect,该文件包含在所有其他文件中。

mysql_connect 返回一个超全局的 MySQL 链接标识符,因此您可以依赖在您自己的任何函数中提供数据库连接。

看起来 mysqli_connect 不是这种情况,返回的对象不是全局的。

这是否意味着我必须添加: global $mysqli; 在每个函数的顶部,或者有没有办法让它成为一个超全局的?

4

4 回答 4

5

如果您不指定一个,则依赖于 PHP 将使用最后打开的连接资源这一事实,这可能不是一个好主意。
如果您的应用程序发生更改并且您需要两个连接,或者连接不存在,会发生什么?
因此,无论如何您似乎都需要进行一些重构。

这是一个类似于 Karsten 的解决方案,它总是返回相同的 mysqli 对象。

class DB {
    private static $mysqli;
    private function __construct(){} //no instantiation

    static function cxn() {
        if( !self::$mysqli ) {
            self::$mysqli = new mysqli(...);
        }
        return self::$mysqli;
    }
}        

//use
DB::cxn()->prepare(....
于 2009-01-28T12:56:04.343 回答
3

我通常做一个功能:

$mysqli = new mysqli(...);

function prepare($query) {
  global $mysqli;
  $stmt = $msqyli->prepare($query);
  if ($mysqli->error()) {
    // do something
  }
  return $stmt;
}

function doStuff() {
  $stmt = prepare("SELECT id, name, description FROM blah");
  // and so on
}

然后调用它。话虽如此,我已经放弃了 mysqli ,因为它的漏洞太多而不能被认为是可用的。真是惭愧。

于 2009-01-28T12:08:23.770 回答
1

一个非常简单的方法是使用一个固定的数据库类,只保存 mysqli 连接对象:

class Database {
    public static $connection;
}

Database::$connection = new mysqli(HOST, USERNAME, PASSWORD, DATABASE);

然后您可以通过正常方式访问它:

$sql = 'SELECT * FROM table';
$result = Database::$connection->query($sql);
$result = mysqli_query(Database::$connection, $sql);
echo 'Server info ' . mysqli_get_server_info(Database::$connection);
于 2013-10-29T05:40:13.797 回答
0

要向您介绍一些 oop 并解决您的问题,您可以使用这样的类:

class MyDatabase
{
    private static $_connection;

    public static function connect()
    {
        $mysqli = new mysqli(...);
        self::$_connection = $mysqli;
    }

    public static function getConnection()
    {
        return self::$_connection;
    }
}

在您的数据库连接文件中,您将加载此类并执行MyDatabase::connect();一次。要在脚本中的任何位置获取 $mysqli-connection,只需调用MyDatabase::getConnection();.

于 2009-01-28T12:15:40.570 回答