Класс для работы с БД - мета язык?

Статус
В этой теме нельзя размещать новые ответы.

Shasoft

Новичок
Обычно для работы с БД используют какой-то класс в качестве прослойки. Но ведь можно использовать и свой мета язык, который будет компилироваться в класс PHP и потом исполняться.
Т.е. к примеру пишем так:
Код:
SQL("SELECT * FROM table WHERE years=%($years) AND fam=%s($fam)")
и это разворачивается в
Код:
mysql_query("SELECT * FROM table WHERE years=".$years." AND fam='".mysql_real_escape_string($fam)."'")
При разработке можно динамически преобразовывать. А для продуктива преобразовывать. При этом можно и необязательные условия как в DbSimple прикрутить + это будет, на мой взгляд, нгагляднее. Да и скорость работы будет быстрее (хотя и не намного думаю), так как запрос не будет парситься каждый раз. Также можно сделать трансляцию на несколько разных БД.

Как идея? Может уже что-то подобное давно придумано и просто придумал очередной велосипед?

p.s.Большая просьба не писать многозначительные "умные" комментария без обоснования.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Осталось ответить на вопрос "Какие преимущества это даст разработчику?"
А вообще это давно уже есть в подготовленных выражениях, гораздо быстрее, надежнее и нативными средствами БД.
 

Shasoft

Новичок
Читаемость кода и удобство его изменения. По моему мнению вот это
Код:
$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd', $code, $language, $official, $percent);
в таком виде выглядит более понятно и править его приятнее
Код:
SQL("INSERT INTO CountryLanguage VALUES (%s($code), %s($language), %s($official), %d($percent)));
 

akd

dive now, work later
Команда форума
Читаемость кода и удобство его изменения. По моему мнению вот это
Код:
$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd', $code, $language, $official, $percent);
в таком виде выглядит более понятно и править его приятнее
Код:
SQL("INSERT INTO CountryLanguage VALUES (%s($code), %s($language), %s($official), %d($percent)));
чет мне кажется, что оба приведенных варианта говорят о том, что афтар говнокодер :)
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Читаемость кода и удобство его изменения. По моему мнению вот это
Код:
$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd', $code, $language, $official, $percent);
Это не единственный существующий синтаксис подготовленных выражений.
 

Shasoft

Новичок
чет мне кажется, что оба приведенных варианта говорят о том, что афтар говнокодер :)
Пример кода я взял первый попавшийся который нагуглил. Чтобы показать что я имею ввиду под мета языком SQL. Само собой он не имеет отношения к действительности.
Вообще просил же ОБОСНОВЫВАТЬ свои высказывания. Но всё-равно находятся люди, которые начинают писать, не прочитав мой сообщение до конца. :(

Это не единственный существующий синтаксис подготовленных выражений.
Данный способ предлагается как альтернатива использования класса для доступа к БД. Если кто-то пишет сразу нативно такие вот конструкции,то ему лишняя прослойка и не нужна. (Хотя с трудом представляю чтобы кто-то писал именно вот в таком виде :) )
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Если кто-то пишет сразу нативно такие вот конструкции,то ему лишняя прослойка и не нужна. (Хотя с трудом представляю чтобы кто-то писал именно вот в таком виде :) )
Такие - какие?
Первый же пример в мануале:

PHP:
<?php
$sql = 'SELECT name, colour, calories
 FROM fruit
 WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql);
$sth->execute(array(':calories' => 150, ':colour' => 'red'));
$red = $sth->fetchAll();
Если тебе сложно представить, что кто-то использует хотя бы такое - у меня для тебя очень плохие новости.
 

Shasoft

Новичок
Такие - какие?
Первый же пример в мануале:
...
Если тебе сложно представить, что кто-то использует хотя бы такое - у меня для тебя очень плохие новости.
Вот как раз на такой вариант не наткнулся. Спасибо за подсказку, посмотрю.

p.s. мне то всё-равно придется транслировать файл, так как я таким образом ещё и входные данные проверяю. Но вот работу с БД возможно и не придется заворачивать в мета-язык. Сейчас ещё почитаю, что там с защитой от инъекций при подготовленных запросах. Как я понимаю, оно должно само подставлять строку как строку с заменой всех спец-символов.
 

Shasoft

Новичок
Фишка в том, что при написании на мета языке (также как и при написании с использованием класса для работы с БД) можно легко транслировать код в новую версию работы с БД и даже на любую версию MySql., либо через классы, либо через функции. Не требуется переписывать весь код, достаточно только транслятор переписать. Ну и БД другую можно использовать.
К тому же какая разница, насколько плохо работает транслятор если на выходе всё-равно будет простой код без заморочек. Но вообще флоппик достаточно четко всё написал и подсказал.

Ну а условные макроподстановки так вообще всё-таки на мета языке понятнее. да и править их в этом случае проще. Я так думаю.
 

Shasoft

Новичок
ты не прочитал даже первой страницы.
Обычно юморят, предлагая перелопатить весь гугль. Вы как-то мелко берете - предлагаете прочитать всего 7 страниц форума.

Я вроде писал ОБОСНОВЫВАЙТЕ, либо ничего не пишите!
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Фишка в том, что при написании на мета языке (также как и при написании с использованием класса для работы с БД) можно легко транслировать код в новую версию работы с БД и даже на любую версию MySql., либо через классы, либо через функции. Не требуется переписывать весь код, достаточно только транслятор переписать. Ну и БД другую можно использовать.
Мне особенно нравится в этом контексте слово "легко". Ты смотрел Доктрину, а в ней обработчик мета-языка DQL? Объём кода хорошо представляешь?
 

Shasoft

Новичок
Мне особенно нравится в этом контексте слово "легко". Ты смотрел Доктрину, а в ней обработчик мета-языка DQL? Объём кода хорошо представляешь?
Насчет легко, возможно, я и поторопился. Однако по первым прикидкам команд должно быть не так много. фактически все команды - это макроподстановки.
Я уже набросал класс для замены. В частности вот такой код
Код:
    %SQL("SELECT * FROM cms5_users
          WHERE %mandt
              AND `id` = %($id)
            {(year==2014){($id!=2) AND `name` = %s($name)}
            AND year > 1977}
            AND year < 2000")
    if( %INSERT_ID() )
    {
  
    }
транслируется вот в такой
Код:
$sql  = "SELECT * FROM cms5_users WHERE `mandt`='".$config->mandt."' AND `id` = ".$id." ";
if(year==2014)
{
if($id!=2)
{
$sql .= "AND `name` = ".mysqli_real_escape_string(sqlmeta::$link,$name)." ";
}
$sql .= "AND year > 1977 ";
}
$sql .= "AND year < 2000 ";

    if( mysqli_stmt_insert_id($stmt) )
    {
   
    }
Тут пока нет выполнения SQL команды. Но особо проблем в этом не вижу - добавить её Также я планирую вставить сюда создание самого соединения с БД. Т.е. один класс для каждого - вряд ли подойдет, так как для создания соединения нужно знать где хранятся параметры доступа к этой БД.
Так что я пока не вижу минусов в использовании в своем конкретном проекте. Для меня писать в таком виде удобнее, чем самому писать тот код, который получается в результате трансляции. При этом нечто монстроподобное типа DQL я писать не собираюсь.
Хотя, возможно в конце концов столкнусь с тем, то будет невозможно реализовать через этот мета язык, либо реализация будет "через костыли".
Но, насколько я понял. DQL всё-таки реализует выполнение запросов динамически. Я же разворачиваю всё это в статические классы.
 

hell0w0rd

Продвинутый новичок
ага)) возьми symfony/expression-language и допили по свои нужды))
То что ты хочешь сделать, можно и нужно делать через query-builder.
 

Shasoft

Новичок
ага)) возьми symfony/expression-language и допили по свои нужды))
Проще написать своё, чем допиливать.
То что ты хочешь сделать, можно и нужно делать через query-builder.
Не очень понял, через какой query-builder. Гугление дает много результатов.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Насчет легко, возможно, я и поторопился. Однако по первым прикидкам команд должно быть не так много. фактически все команды - это макроподстановки.
Макроподстановки есть в котеровском DBSimple, например.

Так что я пока не вижу минусов в использовании в своем конкретном проекте. Для меня писать в таком виде удобнее, чем самому писать тот код, который получается в результате трансляции.
Ещё вариант --- взять готовый шаблонизатор и дописать к нему примочки для облегчения работы с SQL.

При этом нечто монстроподобное типа DQL я писать не собираюсь.
Хотя, возможно в конце концов столкнусь с тем, то будет невозможно реализовать через этот мета язык, либо реализация будет "через костыли".
Но, насколько я понял. DQL всё-таки реализует выполнение запросов динамически. Я же разворачиваю всё это в статические классы.
Чочо? DQL транслируется в SQL, вощемта. При этом результат кэшируется.

Проще написать своё, чем допиливать.
Ха. Ха. Ха.
При твоём workflow допилить будет проще.
 

Shasoft

Новичок
Shasoft, помимо гугления не плохо почитать первые 3-4 результата
http://doctrine-orm.readthedocs.org/en/latest/reference/query-builder.html
Я и посмотрел. Только это ВЫ знаете о чем вы говорите. Я откуда могу знать, что то, о чем вы сказали, находится в первых 3-4 результатах.

Макроподстановки есть в котеровском DBSimple, например.
Знаю. Собственно оттуда и взял эту идею. :)

Ещё вариант --- взять готовый шаблонизатор и дописать к нему примочки для облегчения работы с SQL.
Шаблон возвращает текст - мне нужен именно результат работы функции.

Чочо? DQL транслируется в SQL, вощемта. При этом результат кэшируется.
Т.е. он тоже формирует статический php файл для работы?

При твоём workflow допилить будет проще.
?


p.s.Возможно у нас непонимание идет потому, что я на php пишу от случая к случаю "для себя". А на работе я пишу на ABAP поэтому мне мой подход кажется удобнее и проще. А для остальных проще писать через query-builder
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху