我试图代码从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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top