PHP:让其他函数访问数据库连接函数中的$conn变量


PHP : Make other functions access the $conn variable inside my database connection function

让其他函数访问数据库连接函数中的$conn变量

所以在这里,我绝对不顾一切地想要做点什么。我知道我要做的不是面向对象,也不是100%的最佳实践。这不是一个实时的网站,我只是学习一些基本的PHP概念在XAMPP。

我想做的是是使$conn变量在我的数据库连接函数访问到需要它的所有其他函数。我想传递它作为一个参数,,但如何做到这一点?我不喜欢使用PHP的"global"或$GLOBALS。我现在的工作方法是使用程序方法使用mysqli。

例如:

function db () {
$conn = mysqli_connect ("localhost", "root", "", "database");
}
function someFunction () {
$result = mysqli_query ($conn, "SELECT * FROM examples)
}
我一直没有找到我问题的答案……我最近熟悉的大多数解决方案都是基于面向对象的,或者使用了一些有问题的方法。

<>------------------------------------------------------------------------------------------------------------------------------------

解决方案A -我宁愿避免将连接放在包装器中并使用全局变量:

global $conn = mysqli_connect ("localhost", "root", "", "database");
global $conn;
function someFunction () {
global $conn;
$result = mysqli_query ($conn, "SELECT * FROM examples)
}

解决方案B -我还没有准备好面向对象,但我知道这是有效的。关键是我想学一些不一样的东西:

class Database
{
    private static $conn;
    public static function getObject()
    {
        if (!self::$conn)
            self::$conn = new mysqli("localhost", "root", "", "database");
        return self::$conn;
    }
}
function someFunction () {
$result = mysqli_query (Database::$conn, "SELECT * FROM examples)
}

解决方案C -根本不使用函数…只是让它打开,我觉得从长远来看不是很实用:

$conn = mysqli_connect ("localhost", "root", "", "database");
$result = mysqli_query ($conn, "SELECT * FROM examples)

<>------------------------------------------------------------------------------------------------------------------------------------

我正在努力实现的解决方案:

function db () {
$conn = mysqli_connect ("localhost", "root", "", "database");
return $conn;
}
function someFunction () {
$conn = db ();
$result = mysqli_query ($conn, "SELECT * FROM examples)
}

或类似的东西,我只是传递连接作为一个参数或其他东西(目前是伪代码)

function db () {
$conn = mysqli_connect ("localhost", "root", "", "database");
}
function someFunction ($conn) {
$result = mysqli_query ($conn, "SELECT * FROM examples)
}

<>------------------------------------------------------------------------------------------------------------------------------------

那么我如何实现像最后两个,但实际上是有效的。这个概念可行吗?

你想要的解决方案:这应该可以工作,你只需要建立一个连接。

function db () {
    static $conn;
    if ($conn===NULL){ 
        $conn = mysqli_connect ("localhost", "root", "", "database");
    }
    return $conn;
}
function someFunction () {
    $conn = db();
    $result = mysqli_query ($conn, "SELECT * FROM examples);
}

如果您使用function someFunction($conn),这会使您的代码更加混乱,因为您实际上无法从任何地方通用访问$conn

你应该用方案B。这样,您就可以简单地访问它Database::$conn,这将在整个脚本中保持一致。您可以应该有一个initialize函数(您可以使用不同的名称,如果您想),将初始化Database::$conn,然后您可以使用它来初始化Database类上的其他东西,如果需要的话。

解决方案A很糟糕。我做了很长一段时间(global化的东西),这是一个可怕的想法。我不该那么做的。但我做到了。我学会了。它只会让代码变得越来越潦草。

解决方案B: Database::$conn应该是public,如果你想能够从任何地方通过Database::$conn访问它。如果它是私有的,那么您总是需要调用Database::getObject();

方案C:你说得对。那太不切实际了。

解B重写:

class Database
{
    /** TRUE if static variables have been initialized. FALSE otherwise
    */
    private static $init = FALSE;
    /** The mysqli connection object
    */
    public static $conn;
    /** initializes the static class variables. Only runs initialization once.
    * does not return anything.
    */
    public static function initialize()
    {
        if (self::$init===TRUE)return;
        self::$init = TRUE;
        self::$conn = new mysqli("localhost", "root", "", "database");
    }
}

然后……在Database::initialize()被使用之前至少调用一次。

<?php
Database::initialize();
$result = mysqli_query (Database::$conn, "SELECT * FROM examples);
?>

编辑

  • 您还可以在该PHP文件中,在类声明之后立即调用Database::initialize()。然后处理初始化。
  • 我现在更喜欢像Database::getDb()这样的东西,而不是直接访问$conn属性。然后可以从getDb()函数调用initialize。基本上类似于期望的解决方案,但在一个类中。这个类真的不是必需的,但如果你像我一样喜欢类,它会很好。

本节中的所有答案都是多余的,因为它们只是通过在数据库对象周围创建包装器来增加开销。为了分离关注点(可维护性),为数据库连接使用单独的PHP文件,并使用require_once。

内部Database_Connect.php

//

$db = mysqi_connect(localhost, database, password);

现在在mysqli_函数中使用$GLOBALS['db']。

或者,将脚本/对象初始化为

$dbConn = $GLOBALS['db'];

并在mysqli_函数中使用$dbConn。

简单的答案只是传递你的$conn变量到另一个调用函数(而不是建立新的连接)

yourpage.php

$conn = new mysqli($servername, $username, $password, $dbname);
someFunction ($conn)//you can add other parameters if you like 
function someFunction ($conn) {
    $result = mysqli_query ($conn, "SELECT * FROM examples);
}

注意:总是为数据库访问建立新连接不是一个好做法。所以,每次都要建立联系,并在任何地方使用它。(但如果你的需求不同,需要多个连接,那么你可以创建多个连接)

向函数传递一个参数并返回连接

function db($conn){
   $conn = mysqli_connect ("localhost", "root", "", "database");
   return $conn;
}

如果您有多个php文件需要db访问,那么您可以使用连接代码

创建一个文件connection.php
<?php
$conn = mysqli_connect ("localhost", "root", "", "database");
?>
在所有其他需要连接的文件中使用include_once 'connection.php';