PHP 更改为 mysqli。 mysqli_connection 不是全局的吗?

Posted

技术标签:

【中文标题】PHP 更改为 mysqli。 mysqli_connection 不是全局的吗?【英文标题】:PHP changing to mysqli. Is the mysqli_connection not global? 【发布时间】:2012-08-20 02:52:10 【问题描述】:

我刚刚开始了一个新的 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(*****); 然后在我的function.php 文件中我不能调用mysqli_query(***)。 (我也测试过面向对象,但它给了我同样的问题)。

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

【问题讨论】:

您应该在适当的范围内实例化连接。推荐使用全局变量的情况很少。 【参考方案1】:

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

【讨论】:

好的,所以您推荐的是将 db.php 和 functions.php 分开,我应该将页面上使用的所有 SQL 语法保存在一个文件中? 不,这根本不是我要说的。你应该把它们分开是有意义的。但是您需要能够传递保持连接的变量。这意味着有一个建立连接的函数和returns 连接,然后将它传递给需要它作为参数的每个函数。或者把整个事情包在一个班级里。但是,这进入了“适当的应用程序架构”领域,并且对于单个评论来说太深了。【参考方案2】:

这里有一个选项 - 创建一个静态类纯粹是为了将 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? 给出的答案的一种改进

【讨论】:

【参考方案3】:

如果您需要在函数中使用 $mysqli 变量,则需要将其设置为全局变量。

类似这样的:

...
function name ()  
        global $mysqli; 

...

【讨论】:

其实对于小应用来说是完全可以接受的答案

以上是关于PHP 更改为 mysqli。 mysqli_connection 不是全局的吗?的主要内容,如果未能解决你的问题,请参考以下文章

将 mysql 更改为 mysqli 及其 xampp 版本

php 数据库的增删改查

在 PHP 中设置数据库连接类

如何将此代码从mysqli更改为PDO

mysqli将位和整数作为字符串返回

PHP mysqli_fetch_assoc 没有返回正确的值