моя оберточка под mysql

dimagolov

Новичок
DiMA, а как у тебя выглядят INSERT запросы?


The employer
?a предназначен для однородных массивов, именно для подстановки в in().
понятно, что однородных. но там и строка и число и дата может быть. или по-твоему надо все в кавычки брать, как DiMA? я не считаю это правильным, так как если нужно число, то дергать базу для запроса val = 'zhopa' не стоит даже если 'zhopa' корректно экранирована.
когда пример писал, на ходу передумал
The employer, вообще-то triumvirat живой код представил, который он уже написал и как-то протестировал. сравнивать его с измышлениями не стоит, а из этой фразы видно, что ты придумываешь синтаксис и функциональность по ходу написания сообщений, что не есть айс.
 

tf

крылья рулят
Я не про зависимость, а о костыле, что в начале каждой функции нужно подключать $db.
это ты о $this->getDb() толдычеш?
а оно во всеx классах необходимо?
register::get('getSql'); тоже нормально использовать

а как у тебя выглядят INSERT запросы?
наверное что-то вроде INSERT INTO ?t SET ?%
 

DiMA

php.spb.ru
Команда форума
PHP:
class modelName extends sql {

const select = "
    SELECT * FROM {{ t(TableName) }}
    WHERE id = {{ i(id) }} 
            {{ IF status }} and status IN {{ strIn(status) }} {{ END }}
    ";

public function select($id) {
    $arg=array(
        'id'=>$id,
        'status'=> ($id % 2 == 0) ? NULL : array('A', 'B'),
    );
    return $this->db()->getAll(self::select, $arg);
}

}
PS. Мне еще нужно исправить пару косяков, чтобы имя переменной не писать по 2 раза (пока приходится IF'ами проверять).
 

Rin

*
Когда-то я делал свой вариант подготовки sql запросов с использованием типизированных именованых меток-заменителей. Практика показала неудовлетворительную скорость работы и я от этого отказался. Парсер, написанный на PHP будет работать медленно -- это выяснится при обработке десятка sql запросов. Сейчас я использую MysqlRapid. О типизации думать почти не приходится -- методы quote(), quoteArray(), quoteRow(), quoteRows(), ident(), identArray() решают все проблемы для быстрого построения безопасных sql запросов.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
я делаю инсерт так:

PHP:
function voteLog($data){
    $expected_fields=array ('user_id','contest_id','round','pic_id');
    $array_keys = array_keys($data);

    if ($fields_missing= array_diff($expected_fields,$array_keys)){
        _Config:: DEBUG_MODE and var_dump($fields_missing);
        throw new pException(610);
    }

    $fields = $values = array();
    foreach ($expected_fields as $f){
        $fields[] = $f;
        if ($data[$f]===null){
            $values[] = 'NULL';
        }elseif (is_string($data[$f])){
            $values[] = $this->DB->quote($data[$f]);
        }elseif (is_array($data[$f])){
            $values[] = $this->DB->quote(implode(',',$data[$f]));
        }else {
            $values[] = $data[$f];       
        }
    }
    $sql = 'INSERT into `vote_log` ('.implode(',',$fields).') values ('.implode(',',$values).')';
Как бы его заменить вашим спец. синтаксисом?
 

Rin

*
PHP:
$expected_fields = array_flip(array('user_id','contest_id','round','pic_id'));
foreach ($data as $k => $v)
{
    if (! array_key_exists($k, $expected_fields)) unset($data[$k]);
}
if ($data)
{
    $sql = 'INSERT INTO `vote_log` SET ' . $db->quoteRow($data);
    $affected_rows = $db->query($sql);
    $insert_id = $db->insertId();
}
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
если SET разворачиавается в (...) values (...) - красиво

только в моем случае в data бывают "лишние" поля (1 массив для разных запросов), а запрос формируется по списку expected_fields

-~{}~ 26.07.09 16:50:

да, эксепшен я тоже бросаю специально, просто пропуск мне не подходит
 

fixxxer

К.О.
Партнер клуба
grigori

насколько я понимаю, там используется синтаксис

INSERT INTO Table
SET F1=V1, F2=V2, ...

может, оно и не по стандарту, зато удобнее и нагляднее.

вообще, на мой взгляд, синтаксис (...) VALUES (...) нужен только для мультиинсертов. если ограничиваться MySQL конечно.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
да, удобней
к сожалению, я так не смогу - люблю постгрес и пишу в универсальном стиле
 

fixxxer

К.О.
Партнер клуба
ну, ничто не мешает ввести конструкцию, которая разворачивается в (..) values (..)

правда понадобится либо куча конструкций для строковых/нестроковых + позволен/не позволен null, всякие default итд. хотя это можно разрулить и условно-строгой типизацией значений.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
>хотя это можно разрулить и условно-строгой типизацией значений.
да, этот путь я вижу для себя (если я правильн понял смысл твоих слов)
 

Alexandre

PHPПенсионер
$db->query($sql)->getOne() вместо $db->getOne($sql)
и именования методов постарайся сделать стандартным как в pear и zf
+1
Небольшой костыль "status=status" нужен, чтобы с AND не заморачиваться, если статус не передали
а может если статус не существует то всю строку "status=status AND " просто сбросить в пустоту?
 

Rin

*
Для вставки нескольких записей в Mysql за один вызов INSERT можно написать так:
PHP:
#$data -- индексированно-ассоц. массив
if (is_array($data) && $row = reset($data) && is_array($row))
{
    $sql = 'INSERT INTO `vote_log` (' . $db->identArray(array_keys($row)) . ') VALUES ' . $db->quoteRows($data);
}
else
{
    #ошибка -- неправильная структура данных в $data
}
А вообще, при желании, MysqlRapid можно портировать в PgsqlRapid и получить все богатые возможности этого класса :)
 

DarkLordis

Новичок
полгода назад делал оберточку... правда там использован mysqli. до сих пор пользуюсь. удобная мне вроде. от вашей есть отличия: она простая, она не "подруливает" запросы. Просто мне надо было максимально приблизить ее к ADO (ну нравится мне так). Могу скинуть посмотреть, но не знаю куда файл прицепить. А так с радостью скину, а если что поясню. Да еще была кросс-DB версия, но это надо поискать (это была иллюстрация шаблона class factory)
 

zerkms

TDD infected
Команда форума
зачем писать что-то кардинально своё, когда можно взять и расширить PDO?
 

DarkLordis

Новичок
Автор оригинала: zerkms
зачем писать что-то кардинально своё, когда можно взять и расширить PDO?
А свое програмисту написать проще чем в чужом ковыряться. Возможные причины: стандарты предприятия, высокий уровень програмиста, перенос технологии на другую платформу, требования конкретной задачи, оптимизация и многое другое... а еще за чужое надо автора как то благодарить - а свое оно свое и все - никаких проблем. главное давайте конкуренцию развивать - от этого проекты лучше. Вот автору поста например - приблизить свою библиотечку к ADO.
 

AmdY

Пью пиво
Команда форума
А свое програмисту написать проще чем в чужом ковыряться.
в нормальном коде и копаться не нужно, взял и пишешь, а на своё потратишь кучу времени и получится хуже, видел уже сотни подтверждений сему.

DarkLordis
а ты знаешь что такое pdo?
 

DarkLordis

Новичок
Автор оригинала: AmdY
в нормальном коде и копаться не нужно, взял и пишешь, а на своё потратишь кучу времени и получится хуже, видел уже сотни подтверждений сему.

DarkLordis
а ты знаешь что такое pdo?
я смотрел документацию. хорошая штука. но я уже использую свою и включать в свои проекты мне эту нет смысла, так как принципы построения сходные а работы ручками будет вагон. только такие мотивы.
Но мне кроссплатформенность не нужна, и у меня вся работа с базой через хранимые процедуры...
а так - появление такой библиотеки классов вполне закономерно. еще раз: хорошая штука
 
Сверху