Класс базы данных с помощью ПДО


Точки этот вопрос

Я на самом деле использовать его при разработке простых приложений и, кажется, чтобы покрыть все мои потребности. Также он использует ПДО, так что мы не придется беспокоиться о SQL-инъекции. Я знаю, что я обычно странный код, но я надеюсь, что вы могли бы дать мне свои предложения и отзывы, чтобы улучшить его.

Код: Класс Базы Данных

/* Operate on the database using our super-safe PDO system */
class db
{
    /* PDO istance */
    private $db = NULL;
    /* Number of the errors occurred */
    private $errorNO = 0;

    /* Connect to the database, no db? no party */
    public function __construct()
    {
        try
        {
            $this->db = new PDO(
                'mysql:dbname='.reg::get('db-name').';host='.reg::get('db-host'), reg::get('db-username'), reg::get('db-password')
            );
        }
        catch (Exception $e) 
        {
            exit('App shoutdown');
        }
    }

    /* Have you seen any errors recently? */
    public function getErrors() { return ($this->errorNO > 0) ? $this->errorNO : false; }

    /* Perform a full-control query */
    public function smartQuery($array)
    {
        # Managing passed vars
        $sql = $array['sql'];
        $par = (isset($array['par'])) ? $array['par'] : array();
        $ret = (isset($array['ret'])) ? $array['ret'] : 'res';

        # Executing our query
        $obj = $this->db->prepare($sql);
        $result = $obj->execute($par);

            # Error occurred...
            if (!$result) { ++$this->errorNO; }

        # What do you want me to return?
        switch ($ret)
        {
            case 'obj':
            case 'object':
                return $obj;
            break;

            case 'ass':
            case 'assoc':
            case 'fetch-assoc':
                return $obj->fetch(PDO::FETCH_ASSOC);
            break;

            case 'all':
            case 'fetch-all':
                return $obj->fetchAll();
            break;

            case 'res':
            case 'result':
                return $result;
            break;

            default:
                return $result;
            break;
        }
    }

    /* Get PDO istance to use it outside this class */
    public function getPdo() { return $this->db; }

    /* Disconnect from the database */
    public function __destruct() { $this->db = NULL; }
}

Использовать

$db = new db;
$user = $db->smartQuery(array(
    'sql' => "SELECT UserName FROM `post` WHERE UserUID = :uid",
    'par' => array('uid' => $uid),
    'ret' => 'fetch-assoc'
));
echo $user['Username'];

Что я считаю неправильным

Ну, я столкнулся с этими 2 очка, в то время как приехала в этот код, и я хотел бы получить некоторую обратную связь о них в частности:

  1. Системная ошибка (которая, скажем прямо, хреново сейчас)
  2. Первый попробовать-поймать код, который на самом деле работает, но я ей не пользуюсь поэтому, пожалуйста, взгляните на это.

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



12485
8
задан 4 февраля 2011 в 03:02 Источник Поделиться
Комментарии
5 ответов

Несколько вещей.

Когда вы подключаетесь, не жесткий код MySQL, то вы уже на выборку всех БД информация из реестр/конфиг ... сделать настраиваемый тип dbtype, а также. То есть после все, точка ПДО.

Когда вы ловите ошибки в связи или при выполнении запроса, используйте исключение pdoexception класс

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

лично я бы сломать этот класс в конкретные методы. вместо подключения к БД в конструкторе, у меня есть метод Connect() для этого. Я тоже бы запрос, подготовить и метод bind, а затем есть способ взаимодействия: удаление, обновление, вставка и набор из выборки методы fetchOne, fetchAll, fetchCol и т. д.

Также метод Connect будет проверить для набора Конн, и подключаться только если вы уже не имеют существующее подключение. Метод запрос вызова Connect(). Причина этого заключается в том, что вы можете включить свой класс DB, то ваш код, даже если вы не принести что-то конкретное просит...с вашим кодом в этом случае соединение будет выполняться независимо. То, что вы хотите отложенной загрузки...означает, что подключение к БД будет осуществляться только если вы на самом деле пытаются использовать БД с выборки/обновления/удаления/вставки и т. д.

Вот некоторые примеры псевдо код

$db = new MyPdoClass();
$db->connect();
$stmt = $db->query($sql, $params);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
// or call your MyPdoClass::fetchAll, which would do that so you would just call
$results = $db->fetchAll($sql, $params);

5
ответ дан 7 февраля 2011 в 06:02 Источник Поделиться

Почему бы не сделать ДБ Одноэлементного класса?

Делая это синглтон позволит предотвратить множественный вход УНС. Теперь в коде, каждый раз при создании объекта БД, проверка подлинности с сервером базы данных.

Если вы сделаете это синглтон, просто нужно один раз подключиться. И всякий раз, когда вам нужен экземпляр, вы просто должны взять его.

3
ответ дан 6 февраля 2011 в 04:02 Источник Поделиться

Муфта

Первое, что приходит на ум, является тесная взаимосвязь между БД и Рег.

С дБ на самом деле не нужно ничего знать о Рег, и только несколько значений из нее, я чувствую, что это лучшая практика, чтобы пройти требуемые значения по мере необходимости:

public function __construct($host, $database, $username, $password)
{
...
}

Обработка исключений

Как уже упоминалось в другой ответ, поймать исключение pdoexception вместо. Кроме того, у вас будет большое разочарование вниз по дорожке, пытаясь выяснить, что такое "приложение shoutdown" ошибка означает улучшенные отчеты об ошибках.

try
{
$db = new DB(...);
}
catch (PDOException $e)
{
logError($e);
exit('Sorry, the site is broken!');
}

Комментируя

phpDoc комментарии могут оказаться весьма ценными как от размера и сложности классы растут. Даже если это не обязательно для простых проектов, я нашел, что это полезная привычка.

1
ответ дан 7 февраля 2011 в 04:02 Источник Поделиться

Я бы избегать синглтонов - вы можете ограничить доступ с использованием инжектора зависимость как YADIF, что делает написание тестов на компоненты, которые используют подключение проще создавать (а также проверки самого класса)

Это сложный вопрос - DBAL (абстракции данных слоев) обманчиво короткое сокращение для очень широкого (и горячо обсуждаемой) теме.

Если вы хотите, чтобы держать его свет, вы можете написать сценарий сделки:

http://martinfowler.com/eaaCatalog/transactionScript.html

В основном ООП обертки для ваших приложений наиболее распространенные запросы (т. е. saveCompanyEmployees, deleteEmployee, selectEmployee и т. д.).

Вы можете принять это на ступеньку выше и использовать собрать запросы программно, в этом случае ваши методы могут стать более похожими на это:Выберите($таблице$ИД), selectWhere($таблице$условие) - это больше, чем доступ к данным объекта сделки скрипт

Если вы окажетесь переходит к свободно интерфейса или класса представления таблиц - тогда вы можете также хотеть рассматривать ORM, в некоторых описание (это на самом деле не стоит писать свою собственную, хотя она имеет то преимущество, что больше подходит для вашего приложения и, возможно, более легкий, и, конечно, вы узнаете на своей шкуре - как это часто лучший способ...), хотя это может быть смешанное благословение - и лично я считаю это несколько неправильным, чтобы быть настолько ненавидит SQL, чтобы полностью спрятать его в этом образе.

Я бы зарезервировать прямого выполнения SQL-в качестве "задней двери" способу можно прибегнуть, когда все остальное не даст результатов - так как необходимости писать SQL в вашем приложении логика как бы разрушает инкапсуляцию преимущества ООП

1
ответ дан 20 февраля 2011 в 11:02 Источник Поделиться

Я предполагаю, что вы используете в php5, в этом случае у вас есть хорошая причина, чтобы не использовать существующие библиотеки, как использует Doctrine2 DBAL де-факто стандарт на базе абстракции, или Pear_MDB2?

В этот день и возраст библиотек с открытым исходным кодом, прокатки свой собственный домашний (и возможных ошибок класс) решать уже основательно решены проблемы делает себе и PHP-сообществу в целом больше вреда, чем пользы вам не кажется?

Эти библиотеки хорошо документированы (не столько в случае Pear_MDB2), тщательно протестированы и имеют 1000 часов использования продукции в различных условиях. И должны вы нашли проблему или есть предложение, что помощь сообщества PHP. По крайней мере взглянуть на эти фантастические проекты, вы могли бы узнать что-то и возможно даже ответить на некоторые из ваших вопросов, которые вы должны настаивать на делаете свой собственный путь.


Правда Pear_MDB2 немного отстал от жизни, но она делает серьезную работу

0
ответ дан 10 февраля 2011 в 12:02 Источник Поделиться