PHP: Сделать другие функции доступными к переменной $conn внутри моей функции подключения к базе данных

Сделать другие функции доступными к переменной $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)
}

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

Итак, как мне достичь чего-то вроде двух последних, но на самом деле работает. Возможна ли эта концепция?

Ответ 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 ИМО. Таким образом, вы можете иметь простой доступ к нему 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);
?>

EDIT

  • Вы также можете вызвать Database::initialize() сразу после объявления класса в этом файле PHP. Затем выполняется инициализация.
  • Теперь я гораздо больше люблю что-то вроде Database::getDb(), чем прямой доступ к свойству $conn. Затем initialize можно вызвать из функции getDb(). В основном как Желаемое решение, но внутри класса. Класс действительно не нужен, но было бы неплохо, если бы вы любили занятия, как я.

Ответ 2

Передайте аргумент вашей функции, например, и верните соединение

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

Ответ 3

простой ответ - просто передайте переменную $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);
}

Примечание. Не рекомендуется всегда устанавливать новое соединение для доступа к базе данных. Поэтому всегда устанавливайте соединение один раз и используйте его везде (но если ваше требование отличается и требует многократных соединений, вы можете сделать множественные соединения)

Ответ 4

Все ответы в этом разделе излишни, так как они делают накладные расходы, просто создав обертку вокруг объекта базы данных. Для разделения проблем (Maintainability) используйте отдельный файл PHP для подключения к базе данных и используйте require_once.

//Внутри Database_Connect.php

$ db = mysqi_connect (локальный хост, база данных, пароль);

Теперь используйте $ GLOBALS ['db'] внутри ваших функций mysqli_, где это необходимо.

ИЛИ, инициализируйте ваш скрипт/объект как

$ dbConn = $ GLOBALS ['db'];

и используйте $ dbConn внутри ваших функций mysqli_ везде, где это необходимо.

Ответ 5

Если у вас есть несколько php файлов, для которых требуется доступ к db, тогда вы можете создать файл connection.php с кодом подключения

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

И используйте include_once 'connection.php'; во всех других файлах, для которых требуется подключение.