LINUX.ORG.RU

PHP обертка для PDO

 ,


0

1

Правильно ли написал, как можно улучшить/исправить? Задача класса только одна, избавить от постоянного написания new PDO (бла, бла, бла).

Сам класс:

<?php
require_once "settings.php";

class DataBase
{
    public $pdo;
    
    public function __construct()
    {
        try {
            $this->pdo = new PDO('mysql:host=host;dbname=name;charset=utf8', 'user','pass');
        }
        catch (PDOException $e) {
            echo $e->getMessage();
            die();
        }
    }

    public function Close()
    {
        $this->pdo = null;
    }
}
?>

вызываем как-то так:
$db = new DataBase;
$stmt = $db->pdo->query('SELECT * from images ORDER BY `id` DESC LIMIT 1');
$stmt->setFetchMode(PDO::FETCH_ASSOC);
while($row = $stmt->fetch())
{
echo "<p>" . $row['image_url'] . "</p>";
}

Не знаю зачем тебе это, но мой совет небольшой, лучше почитай про паттерны (для начала registry), и глянь как работают Active Record и ORM в Yii2 и Doctrine ORM соответственно.

Sora ★★ ()
Ответ на: комментарий от Sora

Не знаю зачем тебе это

Только для одной цели, что бы потом в любом классе наследовать его class B extends DataBase, и больше не писать соединение с базой new PDO (...)

pleiotropy ()
Ответ на: комментарий от pleiotropy

Не будь дебилом. Приложение соединяется с базой один раз в начале своей работы и закрывает соединение в конце работы. С открытым соединением взаимодействуют компоненты которым это надо. Соединение ВСЕГДА одно. Нет, не всегда. Бывает еще несколько соединений, когда у тебя есть репликация, тогда там может быть одно или более мастер соединения и одно или более слейв соединения.

deep-purple ★★★★★ ()
Ответ на: комментарий от Sora

Какой к чертям AR? Какой ORM? Ты посмотри какую муть (и как) он пишет. Ему то что ты прописал — еще очень рано.

deep-purple ★★★★★ ()
Ответ на: комментарий от deep-purple

Не будь дебилом

Пример не дебильного в студию. Во всех манах пдо инициализируют в каждой функции заново, это и есть тру?

pleiotropy ()
Ответ на: комментарий от pleiotropy

инициализируют в каждой функции заново

Ты несешь чушь. В манах показаны примеры никак не связанные между собой. Поэтому там показано от и до.

в любом классе наследовать его class B extends DataBase

Ты же делаешь говно которое будет наследовать или перегружать конструктор с вызовом parent::__construct(); что повлечет за собой новый коннект на каждый создаваемый объект.

Пример не дебильного в студию

А ты поймёшь? Или уже понял?

deep-purple ★★★★★ ()

echo $e->getMessage(); die();

Иди почитай что такое rethrow

deep-purple ★★★★★ ()

Класс! Подскажешь, где такую траву выдают? Или это опиаты?

избавить от постоянного написания new PDO

А не плодить подключения пробовал? Говорят, помогает.

WereFox ★☆ ()
Ответ на: комментарий от pleiotropy

А там уровень джуна. По крайней мере он понимает о чем говорит, но это уровень джуна. Статья 15-го года. Возможно он уже подрос.

deep-purple ★★★★★ ()

А просто использовать фреймворки не пробовал? Или это задача по информатике? Тогда вперед изучать паттерны. Или как уже посоветовали выше – открываешь код любого фрейма (адекватного) и постепенно изучаешь. У тебя ж даже параметры не в конфигурации, остальной код нет смысла обсуждать.

znenyegvkby ()
Последнее исправление: znenyegvkby (всего исправлений: 1)
Ответ на: комментарий от anonymous

Ты, видимо, зацепился за статью + то что я назвал автора джуном. Так вот добавь к его знаниям на момент написания статьи: следование PSR, хорошее знание пары фреймворков и опыт работы с какимнить хайлоад (ненавижу это слово, хайлоад хайлоаду рознь), ну и ессно git, mercurial, svn, memcache, mongo — будет тебе пыхомиддл.

deep-purple ★★★★★ ()
Ответ на: комментарий от pleiotropy

Для тебя, пока выше даже не прыгай, сойдет вот так:

Чтобы был один интерфейс (DBI), котрый держит соединения (DBC, тупо массив объектов-оберток в которых экземпляры PDO) которые лениво коннектятся — в момент первого обращения для того чтобы сделать запрос, если запрашиваемый DBC еще не коннектился то, коннектится и возвращается. Таким образом ты в своих говноклассах даже соединение не будешь писать, а только вызов, где под капотом все сделано за тебя.

Во первых делаешь глобальную или почти глобальную обертку:

try {
    // тут весь твой код
} catch (Exception $e) {
    // сам придумай, писать в логи и/или показать жопу
    // вот тока подыхать тут не надо
}

Где-то в коде:

$resArr = DBI::getConnection('connName')->query(
    'SELECT a,b,c,d FROM tbl WHERE a = :a AND b = :b',
    [
        ':a' => 1
        ':b' => 2
    ]
)->fetchAll(PDO::FETCH_ASSOC);
Для соединений (ну, у тебя одно будет) заведи допустим массив соединений с доступом по ключу, где ключ в примере это 'connName'. Ну и раз у тебя одно соединение, то сделай с умолчанием:
class DBI
{
    private static $_connections = [];
    public static function getConnection($connName = null)
    {
        // сначала загрузи свой конфиг соединений, но тока один раз, понял?
        // берем первый в списке например
        if (!$connName) {
            $connName = key($connsConfig);
        }
        if (!array_key_exists($connName, $connsConfig)) {
            // не стесняйся кидать иксепшны, но и не перегибай
            throw new Exception('Бля, конфига нет');
        }
        self::$_connections[ $connName ] = new DBC($connsConfig[ $connName ]);

        return self::$_connections[ $connName ];
    }
    public static function closeConnection($connName)
    {
        if (array_key_exists($connName, self::$_connections)) {
            self::$_connections[ $connName ]->close();
            unset(self::$_connections[ $connName ]);
        }
    }
}
Ну а DBC это просто держалка PDO, пусть как ты запостил в самом начале, ток добавь еще метод query который возвращает отпрепареный и отэкзекуценый стейтмент готовый для фетча. Оставлю это тебе как самостоятельную работу. И не надо вот этих всех методов как у того поехавшего джуна. Я примером выше показал что все это делается таким же кол-вом строк (если не меньшим) при вызове и без лишних абсракций. Максимум, когда дозреешь, прикрутишь поддержку транзакций.

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

Все, давай, ато жж какое-то уже получается.

deep-purple ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.