ФорумПрограммированиеPHP для идиотов → Класс для работы С БД

Класс для работы С БД

  • komprenda

    Сообщения: 24 Репутация: N Группа: Кто попало

    Spritz 15 мая 2012 г. 17:18

    Написал класс(не один, ест-но, там в общей сложности 7 классов). Так вот есть класс такой:

    
    <?php
    
    class DB_Select {
        protected $db, 
                  $parts = array(
                      'SELECT' => '*',
                      'FROM' => '',
                      'WHERE' => '',                 
                      'GROUP BY' => '',
                      'HAVING' => '',
                      'ORDER BY' => '',
                      'LIMIT' => ''
                  );
        
        public function __construct($db, $table, $alias = null) {
            $this->parts['FROM'] = $db->table($table) . ($alias ? " AS $alias" : '');
            $this->db = $db;
            return $this;
        }
        
        public function columns($columns) {
            $this->parts['SELECT'] = $columns;
            return $this;
        }
        
        public function join($table, $alias, $clause, $type = 'INNER') {
            $this->parts['FROM'] .= " $type JOIN " . $this->db->table($table) . " AS $alias ON $clause";
            return $this;
        }
        
        public function where() {
            // включаем поддержку плейсхолдеров
            $this->db->args = func_get_args();
            $clause = (string) $this->prepareStatement();
            $this->parts['WHERE'] = $clause;
            return $this;
        }
        
        public function group($clause) {
            $this->parts['GROUP BY'] = $clause;
            return $this;
        }
        
        public function having() {
            $this->db->args = func_get_args();
            $clause = (string) $this->prepareStatement();
            $this->parts['HAVING'] = $clause;
            return $this;
        }
        
        public function order($clause) {
            $this->parts['ORDER BY'] = $clause;
            return $this;
        }
        
        public function limit($limit, $offset = 0) {
            $limit = (int) $limit;
            $limit = $limit > 0 ? $limit : 0;
            $offset = (int) $offset;
            $offset = $offset > 0 ? $offset : 0;
            $this->parts['LIMIT'] = "$offset, $limit";
            return $this;
        }
        
        public function __toString() {
            $sql = '';
            
            foreach ($this->parts as $key => $value) {
                if ($value) {
                    $sql .= "$key $value ";
                }
            }
            
            $sql .= ';';
            return $sql;
        }
        
        public function execute() {
            return $this->db->query($this);
        }
        
        public function fetch() {
            return $this->execute()->fetch();
        }
        
        public function fetchSingle() {
            return $this->execute()->fetchSingle();
        }
        
        public function fetchAll() {
            return $this->execute()->fetchAll();
        }
        
        public function fetchCol() {
            return $this->execute()->fetchCol();
        }
        
        public function fetchPairs() {
            return $this->execute()->fetchPairs();
        }
        
        public function getPage($limit, $page = 1) {
            $page = (int) $page;
            $offset = $limit * $page - $limit;
            $this->limit($limit, $offset);
            return $this->fetchAll();
        }
    }
    
    ?>
    
    


    Я вот думаю нужен ли он в принципе. Пример с ним такой:

    
    $limit = 5;
    $page = isset($_GET['page']) ? $_GET['page'] : null;
    // При вызове метода select создается объект DB_Select
    $arr = $db->select('news')->order('id DESC')->getPage($limit, $page);
    


    Этот код аналогичен такому:

    
    $limit = 5;
    $page = isset($_GET['page']) ? $_GET['page'] : null;
    $page = (int) $page;
    $page = $page > 1 ? $page : 1;
    $offset = $page * $limit - $limit;
    $arr = $db->rows("SELECT * FROM :news ORDER BY id DESC LIMIT $offset, $limit");
    


    вообще есть поддержка плейсхолдеров

    
    // можно и так
    $arr = $db->rows("SELECT * FROM :news ORDER BY id DESC LIMIT ?u, ?u", $offset, $limit); // ?u - unsigned int
    // или даже так
    $arr = $db->rows("SELECT * FROM :news ORDER BY id DESC LIMIT 2?u, 1?u", $limit, $offset);
    


    Вот думаю он(класс) по сути бесполезен какими его методами можно дополнить?
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи
  • komprenda

    Сообщения: 24 Репутация: N Группа: Кто попало

    Spritz 15 мая 2012 г. 17:52, спустя 10 минут 48 секунд

    мне такое не нравится
    Спустя 234 сек.
    Там юниона нету и вложенных запросов, комментариев больше чем строк кода и доктрина нужна(а мне не нужна). Ясно короче удаляю этот классвручную не особо много писать.
    Спустя 197 сек.
    Да и для таких операции как UPDATE, INSERT, DELETE можно пользоваться такими методами

    
    
       public function find($table, $id, $columns = '*') {
            $table = $this->table($table);
            $id = (int) $id;
            $result = $db->query("SELECT $columns FROM $table WHERE id = $id ;");
        }
        
        public function insert($table, $row) {
            $table = $this->table($table);
            $columns = implode(', ', array_keys($row));
            $values = $this->valueList($row);
            $this->query("INSERT INTO $table ($columns) VALUES ($values) ;");
            return $this->insertId();
        }
    
        public function update($table, $fields, $id) {
            $table = $this->table($table);
            $fields = $this->fieldSet($fields);
            $id = (int) $id;
            $this->query("UPDATE $table SET $fields WHERE id = $id ;");
        }
    
        public function delete($table, $id) {
            $table = $this->table($table);
            $id = (int) $id;
            $this->query("DELETE FROM $table WHERE id = $id ;");
        }
    
    
  • Ivan

    Сообщения: 1316 Репутация: N Группа: Адекваты

    Spritz 15 мая 2012 г. 18:07, спустя 14 минут 13 секунд

    хватит изобретать Doctrine
  • Troy

    Сообщения: 2532 Репутация: N Группа: Джедаи

    Spritz 15 мая 2012 г. 18:29, спустя 22 минуты 49 секунд

    комментариев больше чем строк кода

    Не задумывался для чего это нужно?
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 15 мая 2012 г. 18:50, спустя 20 минут 51 секунду


    комментариев больше чем строк кода

    Не задумывался для чего это нужно?

    индусам за строки платят, это какбэ все знают
    Сапожник без сапог
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 15 мая 2012 г. 22:01, спустя 3 часа 10 минут 28 секунд

    С постресом в общем случае работать не будет
    А вообще, каждый наверно писал свой куэрибилдер, это же тоже самое, либо часть того, чтобы начать писать свою цмс =)
    Work, buy, consume, die
  • komprenda

    Сообщения: 24 Репутация: N Группа: Кто попало

    Spritz 15 мая 2012 г. 23:32, спустя 1 час 31 минуту 37 секунд

    postgresql имел в виду? его заставить работать с моей оберткой легко будет. там нужно будет скопировать классы mysql & mysql_result и заменить с десяток строк и готовые обертки будут, тоже самое с sqlite. могу скинуть классы
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 15 мая 2012 г. 23:45, спустя 12 минут 55 секунд

    Не будет, как минимум эскейпинга имён полей, таблиц и схем нет. Ах да, нет поддержка схем. Плюс откуда ты ластинсертайди возьмешь, если имя последовательности не передавать. Ну и всякие фичи типа OFFSET, ONLY и тп
    Ты правда думаешь кому-то кроме тебя нужна эта приблуда?
    Спустя 190 сек.
    Я не в том смысле что зря ты её написал, а в том, что она нужна только тебе, потешить своё чсв, и сказать да я могу, да оно даже работает. Но в рабочих проектах её врядли кто будет использовать, кроме тебя самого.
    Work, buy, consume, die
  • komprenda

    Сообщения: 24 Репутация: N Группа: Кто попало

    Spritz 15 мая 2012 г. 23:57, спустя 11 минут 31 секунду


    Не будет, как минимум эскейпинга имён полей, таблиц и схем нет. Ах да, нет поддержка схем. Плюс откуда ты ластинсертайди возьмешь, если имя последовательности не передавать. Ну и всякие фичи типа OFFSET, ONLY и тп
    Ты правда думаешь кому-то кроме тебя нужна эта приблуда?
    Спустя 190 сек.
    Я не в том смысле что зря ты её написал, а в том, что она нужна только тебе, потешить своё чсв, и сказать да я могу, да оно даже работает. Но в рабочих проектах её врядли кто будет использовать, кроме тебя самого.


    я не про db select не про этот класс. я считаю что фильтровать нужно данные получаемы от пользователя, а программист несмотря на любую защиту и тысячу проверок всяких все может изламать. чсв ахаха, да я могу, да работает, но написал чисто для утилитарных целей и для себя да мне так удобно. все там есть кстати
  • Ivan

    Сообщения: 1316 Репутация: N Группа: Адекваты

    Spritz 16 мая 2012 г. 0:34, спустя 37 минут 16 секунд

    Юзайте pdo, не ебите мозги
  • komprenda

    Сообщения: 24 Репутация: N Группа: Кто попало

    Spritz 16 мая 2012 г. 0:51, спустя 17 минут 23 секунды

    хаха сразу чувствуется гуро пэхапе, блять, в реальном приложении даже для пдо обертку писать надо теже операции инсерт и апдейт автоматизировать, добавление преффиксов для таблиц и т.д…
  • komprenda

    Сообщения: 24 Репутация: N Группа: Кто попало

    Spritz 16 мая 2012 г. 1:00, спустя 8 минут 17 секунд

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

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 16 мая 2012 г. 1:19, спустя 19 минут 14 секунд

    когда выгода от их использования стремится к нулю ну не может быть два одинаковых запроса в приложении

    )))))))))))))))))))))))))))


    да ладно, детка :DDDDDD

    ты неплохой тролль, но не более, не обольщайся)))))))
    Сапожник без сапог
  • Sinkler

    Сообщения: 7958 Репутация: N Группа: в ухо

    Spritz 16 мая 2012 г. 1:20, спустя 1 минуту 26 секунд

    уже можно кричать "мудаки"?)

Пожалуйста, авторизуйтесь, чтобы написать комментарий!