我正在尝试将代码从mysql转换为mysqli。 该代码在文件中使用单个mysql_connect,该文件包含在每个其他文件中。
mysql_connect返回一个超级全局的MySQL链接标识符,因此您可以依赖于任何自己的函数中的数据库连接。
看起来像mysqli_connect并非如此,返回的对象不是全局的。
这是否意味着我必须添加:global $ mysqli;在每个功能的顶部,还是有办法使它成为一个超级全球?
答案 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);