转换MySQL中的mysqli - 如何获得超全局连接对象?
题
我试图代码从MySQL转换为mysqli的。 所述代码使用单个的mysql_connect其中通过每隔一个文件包含一个文件。
的mysql_connect返回一个MySQL连接标识符是一个超全局变量,所以你可以依靠其在任何你自己的功能提供数据库连接。
它看起来像mysqli_connect不是这种情况下,返回的对象不是全局
这是否意味着我要补充:全球$ mysqli的;在每个函数的顶部,或者是有使其成为超全局的方式?
解决方案
依靠的事实,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(....
其他提示
我通常使一个函数:
$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的作为是太充满错误的被认为是可用的。羞真。
要介绍一些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的连接在你的脚本,只需拨打MyDatabase::getConnection();
。
一个非常简单的方法来做到这将是具有固定数据库类,只是为了保持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);
不隶属于 StackOverflow