【问题标题】:PHP : Make other functions access the $conn variable inside my database connection functionPHP:让其他函数访问我的数据库连接函数中的 $conn 变量
【发布时间】:2015-08-24 18:15:01
【问题描述】:

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

所以在这里我绝对不顾一切地试图让某些东西发挥作用。我知道我想要做的不是 OOP,也不是 100% 的最佳实践。这不是一个实时网站,我只是在 XAMPP 上学习一些基本的 PHP 概念。

我要做的是让我的数据库连接函数中的 $conn 变量可供所有其他需要它的函数访问。我正在考虑将它作为参数传递,但是如何做到这一点?我不喜欢使用 PHP 的“全局”或 $GLOBALS。我现在的工作方法是使用 mysqli 使用过程方法。

例如我有这样的事情:

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

function someFunction () {
$result = mysqli_query ($conn, "SELECT * FROM examples)
}

我从来没有找到我的问题的答案...我最近熟悉的大多数解决方案都是基于 OOP 或使用一些有问题的方法。

------------------------------------------ -------------------------------------------------- --------------------------------------

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

global $conn = mysqli_connect ("localhost", "root", "", "database");
global $conn;

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

解决方案 B - 我还没有为 OOP 做好准备,但我知道这是可行的。关键是我想学习一些不同的东西:

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)
}

------------------------------------------ -------------------------------------------------- --------------------------------------

那么我如何实现类似于最后两个但实际上有效的东西。这个概念可行吗?

【问题讨论】:

  • OOP 并不是要选择最迟钝的方法。对于您的实际使用案例,使用最省力且 API 复杂度最低的那个。过度计划你实际上没有的问题或仅仅为了一些最佳实践模因是不可取的。
  • 你已经在这里展示了一个解决方案 "我正在尝试实现的解决方案:" ;为什么这对你不起作用?

标签: php


【解决方案1】:

您想要的解决方案:这应该可行,而且您只需建立一个连接。

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 IMO。这样,您可以轻松访问它Database::$conn,这将在您的整个脚本中保持一致。你可以应该有一个initialize函数(如果你愿意,你可以使用不同的名字)初始化Database::$conn,然后你可以用它来初始化Database类上的其他东西稍后,如果需要。

解决方案 A 很糟糕。我这样做了很长时间(globalizing things),这是一个可怕的想法。我不应该那样做的。但我做到了。我学会了。它只是让代码变得越来越草率。

解决方案 B: 如果您希望能够在任何地方通过 Database::$conn 访问它,Database::$conn 应该是 public。如果它是私人的,那么你总是需要打电话给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。基本上像 Desired Solution 但在一个类中。课程确实不是必需的,但如果您像我一样喜欢课程,那就太好了。

【讨论】:

  • 对了$Jakar,静态conn是做什么的?
  • 这样价值不会在外面丢失?
  • 当我声明 static $conn 时,它使得只有一个 $conn 的实例存在于该函数中......所以$conn 将引用静态的实例(通过多个函数调用)而不是本地(函数的本地)变量。如果没有static $conn,那么每次调用db()$conn 将是未定义的/NULL,直到你分配它。
  • 另外,如果你使用Solution B,那么你也可以使用自动加载器来自动调用initialize。我的网站上有一个示例forum.jakar.co/php-static-class-initializer-using-autoloading/…
  • 有趣。我使用的是所需的解决方案,但会 100% 使用 OOP 单例(我认为这就是你所说的),当我转到 OOP 时,你向我展示了它
【解决方案2】:

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

//Database_Connect.php内部

$db = mysqi_connect(localhost, 数据库, 密码);

现在在你的 mysqli_ 函数中根据需要使用 $GLOBALS['db']。

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

$dbConn = $GLOBALS['db'];

并在需要时在 mysqli_ 函数中使用 $dbConn。

【讨论】:

    【解决方案3】:

    如果您有多个需要数据库访问的 php 文件,那么您可以选择使用连接代码创建文件 connection.php

    <?php
    $conn = mysqli_connect ("localhost", "root", "", "database");
    ?>
    

    并在您需要连接的所有其他文件中使用include_once 'connection.php';

    【讨论】:

    • 这不是 OP 要求的。
    【解决方案4】:

    将参数传递给您的函数并返回连接

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

    【讨论】:

    • .. 并从db 函数返回它:return mysqli_connect(...)
    • 你为什么要传递$conn然后设置$conn?我认为您走在正确的轨道上,但是编写的示例函数没用
    • 这如何回答 OP 的问题?
    【解决方案5】:

    简单的答案只需将您​​的 $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);
    }
    

    注意:总是为数据库访问建立新连接不是一个好习惯。所以总是建立一次连接并在每个地方使用它。(但如果您的要求不同并且需要多个连接,那么您可以建立多个连接)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-02
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多