Denisov80
@Denisov80
Юный Программист

Как правильно использовать PDO если несколько php скриптов?

Подключение к базе данный mysql с помощью PDO используется несколькими скриптами (файл php),
в каждом подключен файл с настройками подключения к базе, в этом же файле прописано несколько функций:
  1. инициализация PDO
  2. loginUser
  3. getParamUser

которые вызываются из других скриптов/программ(файл php).

Подскажите - Инициализация PDO при обращении к каждому php файлу ведь Не требуется?
В настройках можно прописать чтоб подключение к базе оставалось активным?

Когда использовал mysli - всегда закрывал соединение.

И второй вопрос , если я подключаю файл конфига БД с функциями, то всегда приходится сначала вызвать функцию connectPDO(), получить дескриптор и потом его-же передавать в следующую функцию, например для получения данных из базы по username, как можно убрать вызов connectPDO(), либо что-бы он автоматом передавался в другие функции по работе с DB.
  • Вопрос задан
  • 86 просмотров
Пригласить эксперта
Ответы на вопрос 3
Adamos
@Adamos
Правильная работа с БД в РНР подразумевает, что вся работа с БД собрана в классы, а из скриптов дергаются только и исключительно методы этих классов. Никакого понятия о базе скрипты иметь вообще не должны.
Ответ написан
Комментировать
Lastor
@Lastor
В чем сила, брат? В ньютонах.
1. В обычном штатном случае скрипт один, если вы сознательно не запускали каких-либо асинхронных процессов.
Даже если в ходе выполнения подключаются другие файлы (include или require), то скрипт всё равно один.
Когда скрипт выполнен, открытые соединения прекращаются автоматически.

2. Я делаю примерно так:
class DB
class DB
{
    public ?PDO $pdo;
    private ?array    $opt;
    public ?string $pHolders;
    public ?array  $parArr;

    public function __construct(
        string $connectName = '',
        string $charset = 'utf8mb4',
        bool $flat = false
    )
    {
        if($flat) return;

        $con = ConnectDB::byName($connectName);

        $dsn = "mysql:host=$con->host;dbname=$con->name;charset=$charset";
        $this->opt = [
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES   => FALSE
        ];
        $this->pdo = new PDO($dsn, $con->user, $con->pass, $this->opt);
    }

    public function qwe($sql, $args = NULL): bool|PDOStatement
    {
        if (!$args) {
            return self::query($sql);
        }
        return self::execute($sql, $args);
    }

    private function execute(string $sql, array $args): PDOStatement
    {
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($args);
        return $stmt;
    }

    private function query($sql): PDOStatement
    {
        return $this->pdo->query($sql);
    }
}


Объявляю функцию в файле и подключаю его с помощью autoload в composer.json
spoiler
function qwe(string $sql, array $args = null): bool|PDOStatement
{
    global $DB;
//Синглтон
    if(!isset($DB)){
        $DB = new DB();  
    }
    return $DB->qwe($sql,$args);
}


Вызываю:
$qwe = qwe("Select * from users where id = :id", ['id' => $id]);
Ответ написан
Комментировать
Denisov80
@Denisov80 Автор вопроса
Юный Программист
Спасибо за верное направление, классами (объектами) никогда не пользовался, пишу процедурным стилем, но давно хочется перейти на ООП (чистый PHP и Си/Си++).
Обязательно основательно почитаю ваши советы, по поводу класса для работы с pdo даже не думал.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы