7

我刚刚开始了一个新的 PHP 项目,我想是时候遵循 php 的建议并停止使用 mysql 并改用 mysqli 了。但这给了我一个问题。

通常我的设置是这样的

Index.php 文件,在这个文件中我有 2 个 require 语句。一个调用 db.php 文件,另一个调用 functions.php 文件。到目前为止,一切都很好。

在functions.php 文件中,有很多不同的函数在整个主页上都使用,其中许多都使用SQL。使用 php old mysql API 这没问题,但新的 mysqli api 不允许从包含的文件使用连接???

例如,在我的 db.php 中,我有 connect 语句。$db = mysql_connect(*******); 在我的function.php中,我拥有mysql_query(******)并且它完美无缺。

但是如果我将 db.php 更改为$db = mysqli_connect(*****); Then 在我的 function.php 文件中,我无法调用mysqli_query(***). (我也测试过面向对象,但它给了我同样的问题)。

那么如何解决这个问题呢?php 是否希望我将 mysqli_connect 语句放在每个使用 sql 语句的文件的开头?

4

3 回答 3

8

这是一个选项 - 创建一个静态类纯粹是为了将 mysqli 对象保存为公共静态变量:

class DBi {
    public static $conn;
}
DBi::$conn = new mysqli(HOST, USER, PASS, DB);

...在包含文件、数据库助手或其他任何内容中。

然后,无论您想拨打 mysqli 电话,您都可以

DBi::$conn->query(...) 

使其尽可能全球化。如果您觉得需要,您可以轻松地开始在其中弹出您自己的自定义函数(方法) - DBi::custom_method()

这是对Converting mysql to mysqli - how to get superglobal connection object 中给出的答案的一种改进?

于 2013-04-18T14:50:44.663 回答
8

是的,MySQLi 是面向对象的,您需要将$db对象传递给需要数据库连接的函数。程序替代方案还要求$db对象起作用。这是为了您自己好,因为隐式全局连接(实际上:任何形式的全局状态)都是不好的做法。mysql 扩展允许隐式连接一开始并不好。

于 2012-08-24T14:18:07.917 回答
5

You need to set your $mysqli variable to be global if you need it in functions.

Something like this:

...
function name (){  
        global $mysqli; 

...
于 2012-08-24T14:32:10.847 回答