【问题标题】:PHP changing to mysqli. Is the mysqli_connection not global?PHP 更改为 mysqli。 mysqli_connection 不是全局的吗?
【发布时间】: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 语句的 每个 文件的开头?

【问题讨论】:

  • 您应该在适当的范围内实例化连接。推荐使用全局变量的情况很少。

标签: php mysql function mysqli


【解决方案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; 
    
    ...
    

    【讨论】:

    • 其实对于小应用来说是完全可以接受的答案
    猜你喜欢
    • 2014-09-17
    • 2013-01-25
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 2018-02-07
    相关资源
    最近更新 更多