Использование класса базы данных в нескольких сценариях PHP - PullRequest
0 голосов
/ 15 января 2019

Я использую класс DB (с PDO) для доступа к серверу MySQL, и у меня есть вопрос на этот счет.

У меня есть структура проекта, которая выглядит следующим образом: Структура проекта

Моя проблема в том, что мне нужно в каждом скрипте создавать и закрывать объект БД или есть другое решение этой проблемы? Какова привычка в этих случаях? Могу ли я как-то обобщить фрагмент кода ниже?

Прямо сейчас это выглядит так на затронутых страницах:

try
{
    $db = new DB();
} catch (DBException $e)
{
    forwardToErrorPage($e->getMessage());
    return;
}

try
{
    if ($db->someDBFunction($args) == 0)
        header("Location: ../templates/success.php");
    else
        forwardToErrorPage('Adding person failed');
} catch (DBException $e)
{
    forwardToErrorPage($e->getMessage());
}
finally
{
    $db->close();
}

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Каждый раз, когда вы хотите использовать свою БД, вы должны создать соединение БД. Есть много библиотек, которые помогают вам управлять БД, но если вы хотите хороший и простой подход, используйте Singleton .

Другой хороший подход - изменить класс db на сервис и внедрение зависимостей .

Я не хочу объяснять паттерн Синглтона, DI и сервисы здесь, потому что в Интернете и на SO было много инструкций для этого.

0 голосов
/ 15 января 2019

вы можете включить require_once('/path/to/project/src/DB.php'); в заголовок всего файла и в DB.php сделать вашу базу данных дескриптором:

try
{
    $db = new DB();
} catch (DBException $e)
{
    forwardToErrorPage($e->getMessage());
    return;
}

Лучшее решение, которое я бы порекомендовал использовать как ORM Eloquent ( ссылка ):

composer require illuminate/database

затем в вашем файле DB.php:

require_once "vendor/autoload.php";
use Illuminate\Database\Capsule\Manager as Capsule;

$capsule = new Capsule;

$capsule->addConnection([
   "driver" => "mysql",
   "host" =>"127.0.0.1",
   "database" => "acl",
   "username" => "root",
   "password" => ""
]);

$capsule->setAsGlobal();
$capsule->bootEloquent();
...