Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
1 / 1 / 0
Регистрация: 11.04.2016
Сообщений: 14

Подключение PDO в ООП

09.02.2017, 11:16. Показов 3477. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю маленький сайт обьявлений, на ооп и mvc. Есть подключение к БД.
PHP
1
2
3
4
5
6
7
8
9
10
class Db {
    public static function getConnection() {
        $paramsPath = ROOT . '/config/db_params.php';
        $params = include($paramsPath);
        $dsn = "mysql:host={$params['host']};dbname={$params['dbname']}";
        $db = new PDO($dsn, $params['user'], $params['password']);
        $db->exec("set names utf8");
        return $db;
    }
}
И есть класс Advertisement, в котором реализованы методы удаления, добавления, сохранения и т.п.

Вот один из них:
PHP
1
2
3
4
5
6
7
8
public static function deleteAdvt($id) {
        $id = intval($id);
        $db = Db::getConnection();
        $sql = ("DELETE FROM advt WHERE id = :id");
        $result = $db->prepare($sql);
        $result->bindParam(':id', $id, PDO::PARAM_INT);
        return $result->execute();
    }
И вот третья строка в каждом из методов дублируется.

Вопрос, как в классе вызвать один раз подключение к БД? С помощью конструктора? Методы все статичные и метод подключения тоже.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.02.2017, 11:16
Ответы с готовыми решениями:

ООП и PDO
Привет, мир! Пытаюсь делать так: abstract class Gauga { protected $_db; public function __construct() { //...

Вывод из БД с использованием ООП, PDO и namespace
Код работает, правильно ли я всё сделал? Какие недочёты есть? index.php <?php header('Content-Type: text/html;...

Мануал, в котором бы раскрывалась вся мощь ООП при работе с MySQL (через PDO)
Приветствую! Сейчас пишу приложение где активно используется база данных. Код уже порядком разросся :) и вижу потребность его...

7
123 / 77 / 33
Регистрация: 05.03.2013
Сообщений: 449
09.02.2017, 12:35
Я бы сделал так

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Db {
    private static $connections = [];
 
    public static function getConnection($connectionName) {
        if (empty(self::connections[$connectionName])) {
            $paramsPath = ROOT . '/config/db_params.php';
            $params = include($paramsPath);
            $dsn = "mysql:host={$params['host']};dbname={$params['dbname']}";
            $db = new PDO($dsn, $params['user'], $params['password']);
            $db->exec("set names utf8");
            self::connections[$connectionName] = $db;
        }
        return self::connections[$connectionName];
    }
}
0
1 / 1 / 0
Регистрация: 11.04.2016
Сообщений: 14
09.02.2017, 12:45  [ТС]
Я понял Вас. А в вот как правильно сделать, чтоб вот например эти методы отработали с таким статическим подключением
PHP
1
2
3
4
5
6
7
8
public static function getAdvtById($id) {
        $id = intval($id);
        $db = Db::getConnection();
        $result = $db->query("SELECT * FROM advt "
                . "WHERE id=$id ");
        $result->setFetchMode(PDO::FETCH_ASSOC);
        return $result->fetch();
    }
или
PHP
1
2
3
4
5
6
7
8
public static function deleteAdvt($id) {
        $id = intval($id);
        $db = Db::getConnection();
        $sql = ("DELETE FROM advt WHERE id = :id");
        $result = $db->prepare($sql);
        $result->bindParam(':id', $id, PDO::PARAM_INT);
        return $result->execute();
    }
0
123 / 77 / 33
Регистрация: 05.03.2013
Сообщений: 449
09.02.2017, 13:02
Работа с подключением у вас заканчивается на 3й строчке. Дальше идет работа с запросом. Каким образом вы установили подключение - не имеет значение, главное что оно у вас есть.
0
1 / 1 / 0
Регистрация: 11.04.2016
Сообщений: 14
09.02.2017, 13:05  [ТС]
Это да, но оно дублируется из метода в метод. Имеет смысл этого избегать. Вот я пробую, но не могу это сделать.
0
123 / 77 / 33
Регистрация: 05.03.2013
Сообщений: 449
09.02.2017, 13:15
Вам в любом случае потребуется инстанс подключения. Само подключение не дублируется, с каждым запросом вам будет возвращаться один и тот же объект. То есть
PHP
1
2
3
4
5
$db1 = Db::getConnection();
$db2 = Db::getConnection();
$db3 = Db::getConnection();
$db4 = Db::getConnection();
$db5 = Db::getConnection();
это все один и тот же объект подключения, который вы переиспользуете.
0
1 / 1 / 0
Регистрация: 11.04.2016
Сообщений: 14
09.02.2017, 14:12  [ТС]
А в конструкторе класса можно подключиться к БД и потом юзать во всех методах это подключение сразу в запросе
PHP
1
2
3
4
  $sql = ("DELETE FROM advt WHERE id = :id");
        $result = $db->prepare($sql);
        $result->bindParam(':id', $id, PDO::PARAM_INT);
        return $result->execute();
https://bitbucket.org/rodnoy/advertisement

Вот в компанентах лежи т класс БД с статическим методом подключения. в моделях есть класс Advt с статическими методами, в каоторых каждый раз идет подключение к БД, можно где-то единожды сделать подключение?
0
123 / 77 / 33
Регистрация: 05.03.2013
Сообщений: 449
09.02.2017, 14:49
Читай пост №2 до полного просветления. Сделаешь, как там написано, и подключение будет делаться единожды.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.02.2017, 14:49
Помогаю со студенческими работами здесь

Подключение к mssql PDO
Здравствуйте! Скажите, что я делаю не так? Хочу создать класс с подключение к базе данных и потом использовать его по мере нужды. Вот...

Подключение к Бд через ООП. Написание класса корзины
Вот небольшой пример кода, как будет использоваться подключение. Правильно ли это? Или как вообще лучше сделать? <?php ...

Регистрация и авторизация на php, ajax, pdo и ооп
Посоветуйте правильные примеры страницы регистрации авторизации с помощью php, ajax, ООП и pdo. Примеры по pdo есть достаточно, но все они...

PDO подключение к бд
Доброго времени суток, использую код с применением класса, но по какой то причине, он не может использовать класс CFG Файл подключения...

Подключение к БД (PDO). Админка
Доброго всем. После авторизации админа - переход на админку (ниже код). //Если логин совпадает, проверяем пароль if(count($rows) >...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru