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';
во всех других файлах, для которых требуется подключение.