我正在尝试将代码从 mysql 转换为 mysqli。该代码在一个文件中使用单个 mysql_connect,该文件包含在所有其他文件中。
mysql_connect 返回一个超全局的 MySQL 链接标识符,因此您可以依赖在您自己的任何函数中提供数据库连接。
看起来 mysqli_connect 不是这种情况,返回的对象不是全局的。
这是否意味着我必须添加: global $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 ,因为它的漏洞太多而不能被认为是可用的。真是惭愧。
一个非常简单的方法是使用一个固定的数据库类,只保存 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);
要向您介绍一些 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();
.