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

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

Shasoft

Новичок
Ну так и пиши дальше так на абапе. Пхп-то тут причем?
При том, что ABAP - это на работе. А сайты - это для себя.
Появилась идея - решил поделиться с другими. Вдруг этот велосипед уже давно изобрели. Но, судя по всему, - нет. Значит сам сделаю.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Шаблон возвращает текст - мне нужен именно результат работы функции.
Я, честно говоря, эту фразу вообще не понял. "Текст" и "результат работы функции" --- понятия несколько ортогональные.

Т.е. он тоже формирует статический php файл для работы?
Нет, он формирует статический SQL, который при неизменении исходного DQL и продолжает использоваться.

Я имею в виду, что если цель, грубо говоря, шаблонизатор для SQL, то проще взять готовый шаблонизатор (который уже умеет генерировать PHP код по шаблону) и добить его примочками для работы с SQL. Писать с нуля --- месяцы работы.
 

Фанат

oncle terrible
Команда форума
Идея переписать SQL на свой говноязык приходила, действительно, многим. В то место, куда они едят.
Беда, собственно, не с самой идеей, а с тем что носители (все как один), очень смутно представляют себе синтаксис SQL, который собираются переписать по-своему.
Итог немного предсказуем.

Впрочем, уже во второй серии пациент замахнулся и на пхпешечку. Написать
Код:
if( mysqli_stmt_insert_id($stmt) )
- для него непосильный труд. при этом о существовании функций он, похоже, не подозревает
 

hell0w0rd

Продвинутый новичок
Фанат, а почему говноязык?)
Если сильно в дебри не лезть, все довольно круто получается
PHP:
SELECT u, i FROM User u JOIN u.image
Что тут не так?
 

Shasoft

Новичок
Беда, собственно, не с самой идеей, а с тем что носители (все как один), очень смутно представляют себе синтаксис SQL, который собираются переписать по-своему.
Итог немного предсказуем.
Похоже вы так и не поняли о чем я. То ли я так объяснил непонятно, то ли ...

Написать
Код:
if( mysqli_stmt_insert_id($stmt) )
- для него непосильный труд. при этом о существовании функций он, похоже, не подозревает
Написать
Код:
    %SQL("SELECT * FROM cms5_users
          WHERE %mandt
            AND `id` = %($id)
             {(year==2014){($id!=2) AND `name` = %s($name)}
            AND year > 1977}
            AND year < 2000")
гораздо проще и удобнее чем
Код:
    sqlmeta::connect($config);
$_v__sql .= "SELECT * FROM cms5_users WHERE `mandt`='".$config->mandt."' AND `id` = ".$id." ";
if(year==2014)
{
if($id!=2)
{
$_v__sql .= "AND `name` = ".mysqli_real_escape_string(sqlmeta::$DBHandle,$name)." ";
}
$_v__sql .= "AND year > 1977 ";
}
$_v__sql .= "AND year < 2000 ";
$__result = @mysqli_query(sqlmeta::$DBHandle,$_v__sql,MYSQLI_STORE_RESULT);
Но, судя по всему, некоторые предпочитают писать 10 строк кода на одну строку запроса, а при изменении запроса переписывать этот код. Просто некоторым больше нравится сопровождать тонны коды и тратить свое время при в внесении изменений, а другие стараются свести эти затраты к минимуму, потратив немного времени на разработку.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Просто некоторым больше нравится сопровождать тонны коды и тратить свое время при в внесении изменений, а другие стараются свести эти затраты к минимуму, потратив немного времени на разработку.
В этом ты прав. Неправ ты в том, что думаешь что находишься в "других", находясь в "некоторых".
Другие предпочитают проектировать нормально данные и логику, а не писать неподдерживаемые полуготовые куски кода для эмуляции подготовленных выражений.
 

Shasoft

Новичок
флоппик, нормальные данные и логика - это одно. Реализация этого - это совсем другое. Само собой если делать на заказ по типу "сделал, отдал заказчику, деньги получил и забыл" то это одно. Другое дело писать для себя, чтобы и через год можно было просто модифицировать. Каждому своё.
 

Shasoft

Новичок
Весьма точные (на мой взгляд) слова по теме (да и ссылка полезная):
Если говорить именно о «функциях mysql_*», то в коде приложения их действительно быть не должно! Равно как и функций mysqli_*, pdo_* или любых других обращений к «голому» API. Прошу отметить — речь идёт о прикладном коде, а не о коде вообще: просто все обращения к функциям API должны быть упакованы в библиотеки, и в коде приложения нужно обращаться уже к библиотечным функциям. А использование всех этих mysql(i)_query(), и mysql(i)_fetch_array() для исполнения конкретных запросов говорит, увы, о непрофессионализме.
Отсюда
 

hell0w0rd

Продвинутый новичок
Shasoft, при чем тут это?
Ты хочешь создать искуственный язык, который будет компилироваться в php. А я предлагаю тебе написать, или разобраться с готовым query-builderом.
PHP:
$qb = $db->qb()->select('*')->from('cms5_users')->where('mandt = s:mandt')->andWhere('id = i:id');
if ($year === 2014) {
    if ($id != 2) {
        $qb->andWhere('name = s:name');
    }
    $qb->andWhere('year > 1997');
}
$qb->andWhere('year < 2000');
$result = $qb->getQuery()->execute($config);
Вот как выглядел бы твой пример.
 

Shasoft

Новичок
hell0w0rd, смысл ссылки - защита от инъекций. Одна из функций мета языка именно в этом.
Я смотрел в сторону такого синтаксиса. В том плане чтобы использовать что-то из уже существующего. Но синтаксис "в одно строку" мне больше нравится, так как его проще править и он более наглядный.

И я не хочу создавать язык. Просто обычные макросы поверх PHP.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
hell0w0rd, смысл ссылки - защита от инъекций. Одна из функций мета языка именно в этом.
Инъекции - миф. Это проблема по сути своей была порождена клейкой SQL запросов в обычную строку.
Подготовленные выражения, где данные передаются отдельно от запроса, не имеют такой проблемы архитектурно.
 

Shasoft

Новичок
флоппик, подготовленные выражения в этом плане очень хороши. Но писать несколько строк кода для выполнения одного запроса - это, по моему мнению, не есть хорошо. Ну и по динамическим условиям я, честно говоря, не очень понял как оно должно работать.
Т.е. есть запрос
Код:
SELECT * FROM table WHERE a = 1 {(b<10)AND b = 2}
При клейке понятно, при условии b<10 к запросу доклеится дополнительное условие AND b=2. А при подготовленном выражении? Тоже доклеится? При этом параметры всё-равно будут переданы все
В общем пока сделаю (точнее уже сделал) трансляцию в "клеющиеся запросы", а потом, если что, переделаю на подготовленные выражения. Подход с метаязыком (точнее с макроподстановками) позволяет такие финты. Да и в любом случае у меня классы будут генерироваться динамически.
 

akd

dive now, work later
Команда форума
"Вам не нравятся кошки? Вы просто не умеете их готовить!"
where a = 1 and (b >= 10 or b = 2)
 
  • Like
Реакции: WMix

флоппик

promotor fidei
Команда форума
Партнер клуба
akd, да тут поциэнту уже намекали, что стоит для начала выучить SQL, но как об дверь фасоль.
 

akd

dive now, work later
Команда форума
я заметил, просто повторил ему на пальцах :)
 

Shasoft

Новичок
akd, я привел простой пример. В реальности он может быть посложнее.
К примеру условие isset($b) или ещё более сложное по типу: для администратора условие не должно выполняться, для обычного пользователя должно? Заводить дополнительные переменные и передавать их значение в запрос?
 

akd

dive now, work later
Команда форума
мда ... в реальности тебе все-таки надо почитать немного теории по SQL и что он умеет. пока твои "сложные" примеры говорят только о том, что с темой ты знаком поверхностно.
 

Shasoft

Новичок
akd, "аргументы" убийственные. Уже писал, и неоднократно. Если не можете объяснить - лучше МОЛЧИТЕ, не засоряйте тему своими "умными" рассуждениями.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху