PHP正在更改为mysqli。mysqli_连接不是全局的吗?

PHP正在更改为mysqli。mysqli_连接不是全局的吗?,php,mysql,function,mysqli,Php,Mysql,Function,Mysqli,我刚刚开始了一个新的PHP项目,我想是时候按照PHP的建议停止使用mysql和swith来代替mysqli了。但这给了我一个问题 通常我的设置是这样的 php文件,在这个文件中我有一个2个require语句。一个调用db.php文件,另一个调用functions.php文件。到目前为止还不错 在functions.php文件中,有许多不同的函数在整个主页中使用,其中许多函数都使用SQL。 对于php旧的mysql API,这没有问题,但是新的mysqli API不允许从包含的文件使用连接 例如,

我刚刚开始了一个新的PHP项目,我想是时候按照PHP的建议停止使用mysql和swith来代替mysqli了。但这给了我一个问题

通常我的设置是这样的

php文件,在这个文件中我有一个2个require语句。一个调用db.php文件,另一个调用functions.php文件。到目前为止还不错

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

例如,在我的db.php中有connect语句<代码>$db=mysql_connect(*******) 在我的function.php中,我有
mysql\u查询(*****)
,它工作得非常完美

但是如果我将db.php更改为
$db=mysqli_connect(*****)
然后在我的function.php文件中,我不能调用
mysqli\u查询(***)
。(我也测试过面向对象,但它给了我同样的问题)

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

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

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

大概是这样的:

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

...

这里有一个选项-创建一个静态类,将mysqli对象作为公共静态变量保存:

class DBi {
    public static $conn;
}
DBi::$conn = new mysqli(HOST, USER, PASS, DB);
。。。在include文件、数据库助手或其他任何文件中

那么无论你想在哪里打电话给mysqli,你都可以

DBi::$conn->query(...) 
让它尽可能全球化。如果您觉得有必要,可以很容易地在其中弹出您自己的自定义函数(方法)-DBi::custom_method()


这是对

中给出的答案的一种改进,您应该在适当的范围内实例化连接。很少有推荐全局变量的情况。好吧,你推荐的不是单独的db.php和functions.php,我应该把页面上使用的所有SQL语法都保存在一个文件中?不,这根本不是我要说的。你应该把它们分开。但是您需要能够传递保持连接的变量。这意味着有一个函数建立连接,并返回连接,然后将其作为参数传递给每个需要它的函数。或者把整件事都放在课堂上。不过,这已经进入了“适当的应用程序架构”领域,而且对一条评论来说太深了。对于一个小应用程序来说,这是一个完全可以接受的答案