Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Mysqli::stmt - Подготовленные выражения 
:(
    Опции темы
Gold Dragon
Дата 22.10.2012, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



Читаю литературу и везде один и тот же пример.. Общую теорию освоил:
- т.е. мы готовим запрос ->prepare() с вопросительными знаками
- далее связываем типы с данными ->bind_param()
- и выполняем запрос ->execute()

На первый взгляд очень всё понятно, наглядно и безопасно. Но возникло несколько вопросов, которые я так и не могу реализовать..

Допустим у меня есть "обёртка" MySQLi. Где-то в начале я подключаюсь в базе..  Далее при необходимости я делаю два вызова метода класса обёртки: первый - формирую сам запрос, второй - то что хочу получить.

Например
Код

$db->setQuery('SELECT * FROM table WHERE id_cat = ? AND name = ?', 'is', array('2','имя'));

Т.е. отправляю запрос, строку с типами (число и строка) и массив с данными

Следующим запросом я хочу получить допустим ассоциативный массив с объектами в формате
Цитата

[0]
   id_cat->X 
   name->Y
[1]
   id_cat->X 
   name->Y
[2]
   id_cat->X 
   name->Y

И соответственно делаю запрос
Код

$db->getObjectArray();

И тут возникают проблемы.. 
Во-первых, в bind_param нужно перечислять переменные, а значит массив не покатит.
Во-вторых, не совсем понятно как мне доставать результат.

Кто уже активно работает с этим прошу научить ;) а если есть готовая обёртка, то буду просто рад

Это сообщение отредактировал(а) Gold Dragon - 27.10.2012, 11:15


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Aliance
Дата 22.10.2012, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 3
Всего: 137



Или я не очень понял сути, или все зависит от фреймворка, не?
PM MAIL WWW ICQ Skype   Вверх
Gold Dragon
Дата 22.10.2012, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



Я делаю CMS в том числе сейчас пишу обёртку для MySQLi. Вернее у меня уже есть класс для работы с mysqli, но хочу её переделать чтобы использовать mysqli_stmt. Но что-то пока не могу понять как этим вообще пользоваться. На простых примерах всё просто, а вот сделать что-то универсальное пока не получается. Т.е. когда не известно сколько и каких данных поступает в запросе и в каком формате выдать результат



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Aliance
Дата 22.10.2012, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 3
Всего: 137



У Котерова в книге PHP5 можно прочитать про placeholders, впервые я это увидел там (еще до появления многих фрейморков). Вообще не очень понятно зачем что-то возвращать, или имеется ввиду внутренний механизм? Если так, то там просто идет замена ? на значения массива.
PM MAIL WWW ICQ Skype   Вверх
Gold Dragon
Дата 22.10.2012, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



Может не совсем понятно объяснил... В общем чтобы получить какой-либо результат мне нужно вызвать два метода "обёртки"
Первый формирует сам запрос, т.е. всё подставляет: меняет префиксы таблицы в соответствии с настройками движка, проверяет входные данные на соответствие и т.п. и т.д. Сейчас использую простое экранирование для строк (mysqli_real_escape_string). А вот этот подход должен меня избавить от подобного и сам запрос будет безопаснее, да и работать с ним проще.

А вот второй метод (вернее их множество) должен возвращать данные в том виде в котором я их хочу получить. Допустим, только первую строку или весь результат в ассоциативном массиве или же объектом или только первое значение первой строки и т.п.


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 22.10.2012, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



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

PS
документации по mysqli_stmt практически вообще нет :(


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 22.10.2012, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Цитата(Gold Dragon @  22.10.2012,  08:19 Найти цитируемый пост)
 а если есть готовая обёртка, то буду просто рад

Вообще-то она есть, и называется PDO. Во всяком случае- методы именно оттуда. В нем есть, разной степени удобства, механизм подстановки параметров. Вместе с bindParam или прямо в execute массивом. Именованные параметры или вопросики по порядку и так далее...

Другое дело, если ли в этом pdo поддержка mysqli_stmt?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 22.10.2012, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



Цитата(ksnk @  22.10.2012,  14:40 Найти цитируемый пост)
Вообще-то она есть, и называется PDO
мне нужен не монстр, а маленький, удобный, понятный, простой класс smile
В принципе DbSimple это то что мне нужно, но немного не то что я хочу получить в идеале.. попробую сначала его поломать и посмотреть... 



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
baldina
Дата 22.10.2012, 14:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 2
Всего: 101



Цитата(Gold Dragon @  22.10.2012,  13:48 Найти цитируемый пост)
мне нужен не монстр, а маленький, удобный, понятный, простой класс

в итоге вы родите монстра, но для вас он останется маленьким, удобным и пушистым. потому что понятным.
PM MAIL   Вверх
Gold Dragon
Дата 22.10.2012, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



Цитата(baldina @  22.10.2012,  15:02 Найти цитируемый пост)
в итоге вы родите монстра, но для вас он останется маленьким, удобным и пушистым. потому что понятным. 
пусть будет так smile Но мне сейчас очень хочется вообще понять принцип этого всего



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 22.10.2012, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Цитата(Gold Dragon @  22.10.2012,  13:48 Найти цитируемый пост)
В принципе DbSimple это то что мне нужно

Если не смущают конструкции типа 
Код

$object =& new $class($parsed);

на которые ругается синтаксически анализатор, начиная с 5-го php, то почему бы и нет.  smile 

А вообще, вместе с Котеровской debugConsole - достаточно удобная штука. Хотя я от нее недавно отказался в пользу класса из instantCMS. Он там совсем никакой, даже сам не эскейпит параметры и его еще нужно допиливать, зато маленький и понятный  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 22.10.2012, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



а разве его (DbSimple) не допилили до 5-й? А вообще. я уже не рассматриваю всё что ниже PHP5.3


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 23.10.2012, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



В общем нашёл обёртку, практически то что мне нужно.. сделана как утверждает автор на основе DbSimple.
Правда стиль написания очень своеобразный: всё на ссылках, вызовах пользовательских функций и callback.. Да и как-то наследуемый класс получается вспомогательным для основного.. Очень не привычно... Честно говоря пока очень путаюсь...

Но главное всё работает и отлично работает

вот SVN
http://code.google.com/p/simple-mysqli-class/

Выборку можно делать как так
Код

$query=$db->select('SELECT * FROM test WHERE id =? AND id_cat =?', 2, 3);

так и вот так
Код

$query=$db->select('SELECT * FROM test WHERE id =? AND id_cat =?', array(2, 3));


Основные выборки

    Выборка строки: selectRow()
    Выборка ячейки: selectCell()
    Выборка столбца: selectCol()
    Выборка всего: select()
    Вставка данных: insert()
    Удаление: delete()
    Замена: replace()

Очень маленький и ничего лишнего... Но вот пока думаю как туда своё добавить, очень непонятный и запутанный стиль написания кода, не люблю передавать ссылки на переменные, не понятно что и где берётся тогда

Это сообщение отредактировал(а) Gold Dragon - 23.10.2012, 18:11


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 24.10.2012, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



В общем вот собрал класс-обёртку. Прошу посмотреть, оценить, покритиковать, дополнить, улучшить... в общем вы всё знаете сами smile
Постарался всё полностью прокомментировать.
Код

class GDLDatabase
{
    /** @var string - префикс для таблиц */
    private $_db_prefix;

    /** @var null|object - интерфейс */
    protected static $_resource = null;

    /** @var \mysqli - MySQLi object */
    protected $db_resource;

    /** @var \mysqli_stmt - MySQLi_STMT object */
    protected $stmp;

    /** @var string - имя метода для подготовленного запроса */
    protected $returnMethod;

    /** @var array - ассоциациативный массив
     *      [affected_rows] - Количество строк, затронутых последним запросом
     *      [insert_id]     - ID, сгенерированный предыдущей операцией INSERT,
     *      [num_rows]      - Число строк в результате запроса
     *      [field_count]   - Число полей в заданном выражении
     *      [sqlstate]      - SQLSTATE ошибка последнего запроса
     */
    public $queryInfo;

    /***************************************************************************
     * Magic methods
    /***************************************************************************/

    /**
     * Конструктор
     * Защищаем от создания через new
     */
    private function __construct()
    {

        // Проверка существует ли вообще функция подключения
        if (!function_exists('mysqli_connect')) {
            throw new GDLException(_EXC_MYSQLI_MODULE_NOT);
        }

        // Создаём объект базы
        $this->db_resource = new mysqli(_config('db_host'), _config('db_user'), _config('db_password'), _config('db_name'), _config('db_port'), _config('db_socket'));

        // Устанавливаем кодировку
        $this->db_resource->set_charset('utf8');

        if ($this->db_resource->connect_error) {
            throw new GDLException(_EXC_ERROR_CONNECT_DB);
        }

        // записываем логи запросов
        if (_config('db_debug')) {
            $this->db_resource->query('set profiling=1');
            $this->db_resource->query('set profiling_history_size=100');
        }

        // запоминаем префикс таблиц
        $this->_db_prefix = _config('db_prefix');
    }

    /**
     * Защищаем от создания через клонирование
     */
    private function __clone()
    {
    }

    /**
     * Защищаем от создание через unserialize
     */
    private function __wakeup()
    {
    }

    /**
     * @static Подключение класса
     *
     * @return object
     */
    public static function Init()
    {
        if (!is_object(self::$_resource)) {
            $class_name = __CLASS__;
            self::$_resource = new $class_name;
        }

        return self::$_resource;
    }


    /***************************************************************************
     * Private methods
    /***************************************************************************/

    /**
     * Передаёт параметры в подготовленный запрос
     *
     * @param  array  $bindVars - значения для заметы
     * @param  array  $params   - параметры
     *
     * @return mixed
     */
    private function _bindParams($bindVars, &$params)
    {
        $params[] = $this->_getParamTypes($bindVars);
        foreach ($bindVars as $key => $param) {
            $params[] = &$bindVars[$key]; // pass by reference, not value
        }

        return call_user_func_array(array($this->stmp, 'bind_param'), $params);
    }

    /**
     * Связывает результат с запросом
     *
     * @param  $data
     *
     * @return mixed
     */
    private function _bindResult(&$data)
    {
        $this->stmp->store_result();
        $variables = array();

        $meta = $this->stmp->result_metadata();

        while ($field = $meta->fetch_field()) {
            $variables[] = &$data[$field->name];
        }

        return call_user_func_array(array($this->stmp, 'bind_result'), $variables);
    }

    /**
     * Возвращает полный результат запроса
     *
     * @param  string $data - строка запроса
     *
     * @return array|bool - двухмерный массив с результатом запроса
     */
    private function _mysqliFetchAssoc(&$data)
    {
        $i = 0;
        $array = array();
        while ($this->stmp->fetch()) {
            $array[$i] = array();
            foreach ($data as $k => $v) {
                $array[$i][$k] = $v;
            }
            $i++;
        }

        return $array;
    }

    /**
     * Возвращает первый столбец запроса
     *
     * @param string $data - строка запроса
     *
     * @return array|bool - возвращаемые значения
     */
    private function _mysqliFetchCol(&$data)
    {
        $i = 0;
        $array = array();
        while ($this->stmp->fetch()) {
            $array[$i] = array();
            foreach ($data as $v) {
                $array[$i] = $v;
                break;
            }
            $i++;
        }

        return $array;
    }

    /**
     * Возвращает первую строку запроса
     *
     * @param string $data - строка запроса
     *
     * @return array - возвращаемые значения
     */
    private function _mysqliFetchRow(&$data)
    {
        $this->stmp->fetch();

        return $data;
    }

    /**
     * Возвращает первую ячейку первой строки запроса
     *
     * @param string $data - строка запроса
     *
     * @return string - возвращаемые значения
     */
    private function _mysqliFetchCell(&$data)
    {
        $this->stmp->fetch();

        return $data[key($data)];
    }

    /**
     * Возвращает откомпелированную строку для связи с параметрами
     *
     * @param  $arguments
     *
     * @return string
     */
    private function _getParamTypes($arguments)
    {
        unset($arguments[0]);
        $retval = '';
        foreach ($arguments as $arg) {
            $retval .= $this->getTypeByVal($arg);
        }

        return $retval;
    }

    /**
     * Замена префикса в SQL-запросе
     *
     * @param $sql
     *
     * @return mixed
     */
    private function _replacePrefix(&$sql)
    {
        $sql = str_replace('#__', $this->_db_prefix, $sql);
    }
    /***************************************************************************
     * Protected methods
    /***************************************************************************/

    /**
     * Выполнение запроса
     *
     * @param array $arguments - данные запроса
     *
     * @return bool
     */
    protected function query($arguments)
    {
        $this->prepareQuery($arguments);
        $query = $arguments[0];

        if ($this->stmp) {
            $this->stmp->close();
        }

        $this->stmp = $this->db_resource->prepare($query);
        if (!$this->stmp) {
            return false;
        }

        if (count($arguments) > 1) {
            $bindVars = $arguments;
            unset($bindVars[0]);
            $params = array();
            $binding = $this->_bindParams($bindVars, $params);
            if (!$binding) {
                return false;
            }
        }

        return true;
    }

    /**
     * Метод для запросов SELECT-подобных
     *
     * @return array|string|bool
     *      array: select, selectCol, selectRow
     *      string: selectCell
     *      bool: false при ошибке
     */
    protected function s_query()
    {
        $data = null;
        $arguments = func_get_args();
        $this->query($arguments);
        if (!$this->stmp) {
            return false;
        }

        $execute = $this->stmp->execute();
        if (!$execute) {
            return false;
        }

        $result = $this->_bindResult($data);
        if (!$result) {
            return false;
        }

        $returnPrepareMethod = $this->returnMethod;
        $rows = $this->$returnPrepareMethod($data);
        $this->setQueryInfo();

        return $rows;
    }

    /**
     * Метод для запросов INSERT/DELETE-подобных
     *
     * @return bool|MySQLi_STMT
     */
    protected function i_query()
    {
        $arguments = func_get_args();
        $this->query($arguments);
        if (!$this->stmp) {
            return false;
        }

        $execute = $this->stmp->execute();
        if (!$execute) {
            return false;
        }
        $this->setQueryInfo();

        return true;
    }

    /**
     * Сохранение дополнительной информации
     *
     * @return void
     */
    protected function setQueryInfo()
    {
        $info = array('affected_rows' => $this->stmp->affected_rows, 'insert_id' => $this->stmp->insert_id, 'num_rows' => $this->stmp->num_rows, 'field_count' => $this->stmp->field_count, 'sqlstate' => $this->stmp->sqlstate,);
        $this->queryInfo = $info;
    }

    /**
     * Extended placeholder %s (array)<br>
     *
     * @param  $arguments
     *
     * @return void
     */
    protected function prepareQuery(&$arguments)
    {
        $sprintfArg = array();

        // замена префикса
        $this->_replacePrefix($arguments[0]);

        // Строка запроса
        $sprintfArg[] = $arguments[0];
        foreach ($arguments as $pos => $var) {
            if (is_array($var)) {
                $insertAfterPosition = $pos;
                $replaceWith = array();
                unset($arguments[$pos]);
                foreach ($var as $arrayVar) {
                    array_splice($arguments, $insertAfterPosition, 0, $arrayVar);
                    $insertAfterPosition++;
                    $replaceWith[] = '?';
                }
                $sprintfArg[] = implode(',', $replaceWith);
            }
        }
        $arguments[0] = call_user_func_array('sprintf', $sprintfArg);
    }

    /**
     * Определяет тип данных (int,float or string)
     *
     * @param  string $variable - значение
     *
     * @return string - тип
     */
    protected function getTypeByVal($variable)
    {
        switch (gettype($variable)) {
            case 'integer':
                $type = 'i';
                break;
            case 'double':
                $type = 'd';
                break;
            default:
                $type = 's';
        }
        return $type;
    }

    /***************************************************************************
     * Public methods
    /***************************************************************************/

    /**
     * Возвращает полный результат запроса
     *
     * @param  string $query - строка запроса
     *
     * @return array|bool - двухмерный массив с результатом запроса
     */
    public function select($query)
    {
        $this->returnMethod = '_mysqliFetchAssoc';
        $arguments = func_get_args();

        return call_user_func_array(array($this, 's_query'), $arguments);
    }

    /**
     * Возвращает первый столбец запроса
     *
     * @param string $query - строка запроса
     *
     * @return array|bool - возвращаемые значения
     */
    public function selectCol($query)
    {
        $this->returnMethod = '_mysqliFetchCol';
        $arguments = func_get_args();

        return call_user_func_array(array($this, 's_query'), $arguments);
    }

    /**
     * Возвращает первую ячейку первой строки запроса
     *
     * @param string $query - строка запроса
     *
     * @return string - возвращаемые значения
     */
    public function selectCell($query)
    {
        $this->returnMethod = '_mysqliFetchCell';
        $arguments = func_get_args();

        return call_user_func_array(array($this, 's_query'), $arguments);
    }

    /**
     * Возвращает первую строку запроса
     *
     * @param string $query - строка запроса
     *
     * @return array|bool - возвращаемые значения
     */
    public function selectRow($query)
    {
        $this->returnMethod = '_mysqliFetchRow';
        $arguments = func_get_args();

        return call_user_func_array(array($this, 's_query'), $arguments);
    }

    /**
     * Выполнение UPDATE
     *
     * @param  string $query - строка запроса
     *
     * @return bool
     */
    public function update($query)
    {
        $arguments = func_get_args();

        return call_user_func_array(array($this, 'i_query'), $arguments);
    }

    /**
     * Выполнение INSERT
     *
     * @param  string $query - строка запроса
     *
     * @return bool
     */
    public function insert($query)
    {
        $arguments = func_get_args();

        return call_user_func_array(array($this, 'i_query'), $arguments);
    }

    /**
     * Выполнение REPLACE
     *
     * @param  string $query - строка запроса
     *
     * @return bool
     */
    public function replace($query)
    {
        $arguments = func_get_args();

        return call_user_func_array(array($this, 'i_query'), $arguments);
    }

    /**
     * Выполнение DELETE
     *
     * @param  string $query - строка запроса
     *
     * @return bool
     */
    public function delete($query)
    {
        $arguments = func_get_args();

        return call_user_func_array(array($this, 'i_query'), $arguments);
    }

    /**
     * Старт транзакции
     * @return void
     * @example:
    *      $db=GDLDatabase::Init();
     *      $db->transactionStart();
     *      $db->insert('INSERT INTO `test` set testval=?',20);
     *      $db->insert('INSERT INTO `test` set testval=?',10);
     *      $db->insert('INSERT INTO `test` set testval=?',123);
     *      $db->transactionCommit();
     */
    public function transactionStart()
    {
        $this->db_resource->autocommit(false);
    }

    /**
     * Остановка транзацкии
     *
     * @return void
     */
    public function transactionCommit()
    {
        // фиксирует текущую транзакцию
        $this->db_resource->commit();

        // Включает автоматическую фиксацию изменений базы данных
        $this->db_resource->autocommit(true);
    }

    /**
     * Откат текущей транзакции
     *
     * @return void
     * @example:
     *      $db=GDLDatabase::Init();
     *      $db->transactionStart();
     *      $db->insert('INSERT INTO `test` set testval=?',20);
     *      $db->insert('INSERT INTO `test` set testval=?',10);
     *      $db->insert('INSERT INTO `test` set testval=?',123);
     *      $db->transactionRollBack();
     *      $db->transactionCommit();
     */
    public function transactionRollBack()
    {
        $this->db_resource->rollback();
    }

    /**
     * @param string $query - Простое выполнение запроса
     *
     * @return bool|mysqli_result
     */
    public function simpleQuery($query = '')
    {
        return $this->db_resource->query($query);
    }

    /**
     * Возвращает ошибку
     *
     * @return string
     */
    public function getError()
    {
        return $this->db_resource->error;
    }

    /**
     * Возвращает номер ошибки запроса
     *
     * @return int
     */
    public function getErrno()
    {
        return $this->db_resource->errno;
    }

    /**
     * Возвращает обьект класса mysqli для нереализованных операций
     *
     * @return mysqli
     */
    public function getObject()
    {
        return $this->db_resource;
    }

    public function __destruct()
    {
        $this->db_resource->close();
    }
}


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

function _config($key = ''){
     return Config::$config->$key;
} 


Это сообщение отредактировал(а) Gold Dragon - 24.10.2012, 10:40


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Fortop
Дата 25.10.2012, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 3
Всего: 42



Цитата(Gold Dragon @  24.10.2012,  10:33 Найти цитируемый пост)
function _config($key = ''){
     return Config::$config->$key;


Вопрос. как ты планируешь обращаться к свойству класс с именем ''?


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.2908 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.