将mysql转换为mysqli - 如何获取超全局连接对象?

时间:2009-01-28 12:01:15

标签: php mysql mysqli

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

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

看起来像mysqli_connect并非如此,返回的对象不是全局的。

这是否意味着我必须添加:global $ mysqli;在每个功能的顶部,还是有办法使它成为一个超级全球?

4 个答案:

答案 0 :(得分: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(....

答案 1 :(得分: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因为太过错误而被认为是可用的。很遗憾。

答案 2 :(得分: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();

答案 3 :(得分:0)

一个非常简单的方法是使用固定的数据库类,只是为了保存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);