ФорумПрограммирование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 секунд

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

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