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

标签 php

让其他函数访问我的数据库连接函数中的 $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)
}

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

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

最佳答案

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

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 应该是 public 如果您希望能够通过 Database 访问它: :$conn 来自任何地方。如果它是私有(private)的,那么您总是需要调用 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 但在一个类中。上课确实不是必需的,但如果你像我一样喜欢上课,那就太好了。

关于PHP : Make other functions access the $conn variable inside my database connection function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32188985/

相关文章:

php - Codeigniter 3 中的分页

php - 重新填充后尝试删除数据

php - 将所有 mysql 错误记录到数据库或排序?

php - mysql:在控制台中工作正常,在 php 中将无法访问数据

php - htmlspecialchars 不工作

PHP MySQL INSERT语句语法错误

php - Yii:获取登录用户的角色并根据角色显示内容

php - 组合多个 MySQL JOIN 查询

php - 相关子查询在 phpMyAdmin 中有效,但在 PHP 脚本中超时

php - 如何在一个循环中显示按日期列排序的多个 mysql 表的结果