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 语法保存在一个文件中? 不,这根本不是我要说的。你应该把它们分开是有意义的。但是您需要能够传递保持连接的变量。这意味着有一个建立连接的函数和return
s 连接,然后将它传递给需要它作为参数的每个函数。或者把整个事情包在一个班级里。但是,这进入了“适当的应用程序架构”领域,并且对于单个评论来说太深了。【参考方案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 不是全局的吗?的主要内容,如果未能解决你的问题,请参考以下文章