ФорумРазработкаБазы данных → Драйвер БД через PDO

Драйвер БД через PDO

  • seyfer

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

    Spritz 19 апреля 2012 г. 0:43

    Решил сделать драйвер БД через PDO. С mydql напрямую все просто и однозначно, но не с PDO.
    Возникло пару вопросов.

    Драйвер должен состоять всего из 4-х ф-й : select, insert, update, delete. Логика их работы не имеет значения. Вызов просто $this->db->select(); в чем и профит.

    У PDO есть ф-я query() которая просто для select и возвращает стейтмент, который можно потом fetch(). А что если в селекте есть параметры? Их же надо экранировать. Использовать sprintf() в связке с mysql_real_string когда речь идет о PDO не кошерно.

    Сначала я написал ф-ю

    public function Select($query) {
    try {

    $stmt = M_PdoDB::query($query);

    $result_rows = array();
    while ($row = $stmt->fetch()) {
    $result_rows[] = $row;
    }

    return $result_rows;
    } catch (PDOException $e) {
    echo $e;

    return false;
    }
    }


    И завис. Как же быть с параметрами? Для экранирования в PDO используется ф-я prepare(), куда передается sql запрос с параметрами WHERE например 'id = :id '. Далее делаем bindParam(':id', $my_id); и выполняем execute().
    Хорошо, можно переписать мою ф-ю иначе:

    public function Select($query, $param = array()) {

    try {

    $stmt = M_PdoDB::prepare($query);

    if ($param) {
    foreach ($param as $k => &$v) {
    $stmt->bindParam(':' . $k, $v);
    }
    }
    $stmt->execute();


    Но тогда надо помнить всегда про PDO, передавать sql в формате типа ':id' и параметры array( "id" => $id);
    Есть ли какое-то более элегантное решение?

    И что делать с запросами Insert и Update где я хочу узнать кол-во измененных столбцов? execute() возвращает true или false.
    Можно использовать exec() но снова - как тогда быть с параметрами?
  • Sinkler

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

    Spritz 19 апреля 2012 г. 0:53, спустя 9 минут 54 секунды

    Но тогда надо помнить всегда про PDO, передавать sql в формате типа ':id' и параметры array( "id" => $id);
    Есть ли какое-то более элегантное решение?

    вполне нормально юзается. проверено.
  • seyfer

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

    Spritz 19 апреля 2012 г. 1:22, спустя 29 минут 8 секунд


    Но тогда надо помнить всегда про PDO, передавать sql в формате типа ':id' и параметры array( "id" => $id);
    Есть ли какое-то более элегантное решение?

    вполне нормально юзается. проверено.


    Да нормально, например
    // Запрос.
    $query = "SELECT * FROM pro_articles
    WHERE id_article = :id";

    $param = array(
    "id" => $id_article
    );

    if ($article = $this->DB->Select($query, $param)) {
    return $article;
    } else {
    return FALSE;
    }


    Но не дает абстрагироваться от синтаксиса PDO типа :id.

    И самое насущное - возвращать кол-во измененных записей в Update и последний id в Insert. (конечно можно LASTID получать sql запросом).
    Есть ли решения через PDO? Я не нашел в документации.
  • Sinkler

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

    Spritz 19 апреля 2012 г. 1:39, спустя 17 минут 27 секунд

    Но не дает абстрагироваться от синтаксиса PDO типа :id.

    смысл от него абстрагироваться?
    И самое насущное - возвращать кол-во измененных записей в Update и последний id в Insert. (конечно можно LASTID получать sql запросом).
    Есть ли решения через PDO? Я не нашел в документации.

    у pdo есть lastInsertId() если не изменяет память
    резалт можно не только фетчить, но и получать через rowCount() то что тебе нужно
    Спустя 103 сек.
    http://ru.php.net/manual/ru/pdo.lastinsertid.php
    http://ru.php.net/manual/ru/pdostatement.rowcount.php
  • seyfer

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

    Spritz 19 апреля 2012 г. 1:40, спустя 33 секунды

    Да, туплю

    string lastInsertId ([ string $name = NULL ] )

    Нашел до того, как прочитал сообщение. Все равно благодарю.

    int rowCount ( void )

    Есть у стейтмента, действительно.

    Теперь есть все, что нужно. Тема закрыта.
  • Sinkler

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

    Spritz 19 апреля 2012 г. 1:40, спустя 23 секунды

    Я не нашел в документации.

    самая насущная проблема - неумение читать
  • seyfer

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

    Spritz 19 апреля 2012 г. 2:19, спустя 38 минут 26 секунд

    Я постил эту тему еще в 4 форума, и написал у себя в блоге постик с оценкой форумов, в общем оставлю это здесь.

    http://seyferseed.div-portal.ru/life/tret-ya-i-zavershayushhaya-pro-pdo-teoreticheski-i-php-forumy.html
  • technobulka

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

    Spritz 19 апреля 2012 г. 2:40, спустя 21 минуту 19 секунд

    http://pyha.ru/forum/ - наверное зе бест. и дизайном и атмосферой

    у Sinkler'a, видать, настроение плохое, вот и не троллил))
    Надо было мне внимательнее читать документацию

    чего только стоит оценка ответов — ХУЙНЯ

    не только с чтением документаций проблемы))
    Высокоуровневое абстрактное говно
  • Ivan

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

    Spritz 19 апреля 2012 г. 3:36, спустя 55 минут 31 секунду

    И самое насущное - возвращать кол-во измененных записей в Update

    $pdo->exec() return affected rows

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