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

Лучше делать драйвер через?


  • Всего проголосовало
    8

Фанат

oncle terrible
Команда форума
А в ответе на изначальный вопрос я не определился.
Делал бы на простом мускуле, если бы эти лентяи не забили на него болт.

а из этих двух выбирать душа не лежит. Кривые они оба какие-то.
чтобы сделать тот самый хелпер для SET, нужно, блин, чтобы он возвращал аж две переменные
 

fixxxer

К.О.
Партнер клуба
Фанат
Отсутствие нормальной возможности делать хелпер-методы для set или () values () вполне объяснимо наличием такой штуки, как нативные prepared statements.

Я, кстати, до сих пор пользуюсь своими врапперами на ext/mysql и мне пофигу. :) Никуда не денется, в крайнем случае перепишу на mysqli.
 

seyfer

Новичок
Не могу получить доступ к ластИд свойству. У меня M_PDO промежуточный определен, который не наследует PDO, для singleton

PHP:
if (!self::$pdo_instance) {
            //создаем экземпляр и сразу задаем кодировку
            self::$pdo_instance = new PDO($connect, self::$db_user, self::$db_passw);
//это можно и в оптион, знаю
            self::$pdo_instance->exec("SET CHARACTER SET utf8");
            self::$pdo_instance->exec("SET NAMES utf8");
        }

        return self::$pdo_instance;
Далее после инсерта (т.е. execute()) в дб драйвере пробую вызвать ф-ю для получения ластИД.
PHP:
  if ($stmt->execute()) { 
                    $cnt = M_PdoDB::getLastId();
                    var_dump($cnt);
                    return $cnt;
                } else {
                    $err = $stmt->errorInfo();
                    throw new PDOException($err[2]);
                }
Вар дам = нулл.. а сама ф-я вот
PHP:
static public function getLastId () {
        $p_inst = self::getPdoInstance();
        return $p_inst->lastInsertId;
    }
Почему же нулл.. я же правильно обращаюсь к свойству >_<
 

seyfer

Новичок
Вопрос подписавшимся:

Как быть в таком случае?

string 'UPDATE pro_articles SET title=:title,content=:content WHERE title = :title AND id_article = :id_article' (length=104)

Тут повторяется title в условии и в сете, чисто для примера сделано. Запрос генерируется в драйвере из передаваемого массива (массивов сеттера и условия). Далее идет
PHP:
 foreach ($where as $k => &$v) {
                $stmt->bindParam(":$k", $v);
            }

            foreach ($object as $k => &$v) {
                $stmt->bindParam(":$k", $v);
            }
Ну и конечно ничего не обновляется, т.к. title биндуется повторно на последнее значение, и в базе не находит или пишет то же значение.
Как быть с механизмом передачи параметров для SET и WHERE и генерации запроса ?
 

seyfer

Новичок
Вот вся ф-я

PHP:
//
// Изменение строк
// $table 		- имя таблицы
// $object 		- ассоциативный массив с парами вида "имя столбца - значение"
// $where		- условие массив "условие => значение"
// результат            - число измененных строк
//	
    public function Update($table, $object, $where) {
        $sets = array();
        $wheres = array();

        try {

            foreach ($object as $key => $value) {

                if ($value === null) {
                    $sets[] = "$key=NULL";
                } else {
                    $sets[] = "$key=:$key";
                }
            }

            $wi = 0;
            foreach ($where as $k => $v) {
                $wheres[$wi] = $k . " = " . ":$k";
                //если больше 1 параметра делаем AND
                if (++$wi > 1) {
                    $wheres[$wi - 2] .= " AND ";
                }
            }

            $sets_s = implode(',', $sets);
            $where_s = implode(' ', $wheres);

            $query = "UPDATE $table SET $sets_s WHERE $where_s";
            var_dump($query);
            $stmt = M_PdoDB::prepare($query);

            foreach ($where as $k => &$v) {
                $stmt->bindParam(":$k", $v);
            }

            foreach ($object as $k => &$v) {
                $stmt->bindParam(":$k", $v);
            }

            if (!$stmt->execute()) {
                $err = $stmt->errorInfo();
                throw new PDOException($err[2]);
            } else {
                return $stmt->rowCount();
            }
        } catch (PDOException $e) {
            echo $e;
            return false;
        }
    }
 

seyfer

Новичок
Путем костылей привел к виду

PHP:
UPDATE pro_articles SET title=:title1,content=:content2 WHERE title = :title3'
Таким образом идентификаторы разные и работает.
 

seyfer

Новичок
Убрал костыль, работает. Просто не было совпадения title и id для обновления. Если убрать id из условия, то находит другую статью (созданную специально) с другим id и обновляет ее.

И тут открытие. Получается, что bindParam() биндит переменные поочереди, а не все по идентификатору?

У меня выходит
string 'UPDATE pro_articles SET title=:title,content=:content WHERE title = :title' (length=74)
:title:content:title

В цикле bindParam() вызывается для :title 2 раза, и получается значение от первого раза берет первое вхождение :title, а от второго - второе. Я думал, что все метки :title берут переданное значение, а второй вызов затирает первое значение.
 
Сверху