Примеры построения SQL запросов

SKY / WINGS / FIRST / SQL /
PRAXIS1
Пример построения запроса с отложенной итерацией в модели для файла вида (VIEW) с pagination.
001
002
003
004
005
006
007
008
009
010
011
012
013
<?
$select qp('select !! from $_files $$'); # парсинга нет, т.к. нет параметров
$where qp('where type="upload"');
self::$user->allow() or $where->_(' and status="ok"'); # append
list ($pagination$limit) = pagination(sql("+$select"'count(1)'$where), $ipp 45); # do query
$select ->_(' order by p.id desc limit $., $.'); # append
$where->pre('p left join $_users u on (u.id=p.uid) '); # prepend
return [
    'callback' => [$this'callback_row'],
    'query' => $q sql($select'p.*, u.login'$where$limit$ipp), # do query
    'num_rows' => cnt($q),
    'pagination' => $pagination,
];

Примеры простого использования шаблонов, работа с флагами:
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
<?php
 
sql('insert into city @@', [
  'id' => null# null всегда подставляется как NULL
  '!created' => 'now()'# ! отключает эскейпинг
  '`desc' => "Lon'don",
]);
# даст: insert into city (id, created, `desc`) VALUES (NULL, now(), 'Lon\'don')
 
sql(SKY_SQL::_UPD'insert into city set @@', [ # insert в стиле update
  '.country_id' => $_GET['id'],
  'city' => 'London',
]);
# даст: insert into city set country_id=1, city='London'
 
sql('select * from `tbl` where @@', [
  '.user_id<' => $_GET['id'],
  '$name ' => qp('like $+'"%$_GET[name]%"),
]);
# даст: select * from `tbl` where user_id<100 AND name like '%username%'
 
sql(SKY_SQL::_OR'select * from `tbl` where @@', [ # and заменяется на or
  '.user_id<' => $_GET['id'],
  '$name' => qp(' like $+'"%$_GET[name]%"),
]);
# даст: select * from `tbl` where user_id<100 OR name like '%username%'
 
sql('delete from `tbl` where id in ($@)'$_POST['id']); # имеется ввиду массив значений id
# даст: delete from `tbl` where id in (12, 15)
# если значения будут строчные, они заэскейпятся, шаблон безопасен
 
$w = ['$1' => qp('name like $+'"%'$_POST[name]%")];
if ($_POST['rubric']) $w += ['$2' => qp('rubric like $+'"%$_POST[rubric]%")];
sql(SKY_SQL::_NC'select * from `tbl` where @@'$w);
# даст select * from `tbl` where name like '%\'some-name%' AND rubric like '%some-word%'
 
$w = ['$1' => qp('name like $+'"%$_POST[name]%")];
if ($_POST['rubric']) $w += ['$2' => qp('rubric like $+'"%$_POST[rubric]%")];
if (true$w += ['!mydate=' => 'now()'];
sql(SKY_SQL::_NC SKY_SQL::_OR'select * from `tbl` where @@'$w);
# даст select * from `tbl` where name like '%some-name%' OR rubric like '%some-word%' OR mydate=now()
 
sql('~select !! from visitors v
  left join users u on (u.id = abs(v.uid))
  where $$ hash=$+ and v.ip=$+', [
    'v.*',
    'u.*',
    'v.id as vid',
    'ifnull(u.id, 0) as user_id',
    '$1' => qp('now() - interval $. minute > v.dt_l as visit'$sky->s_visit),
    'now() <= v.dt_l + interval 1 second as flood',
    'now() > v.dt_l + interval 1 hour as banend',
], $pretty qp('sky=$+ or '$this->cookie) : ''$hash$IP);
# здесь шаблон !! безопасен, так как в него подставляются строки заключенные в одинарные кавычки и безопасный
# шаблон $, т.е. если параметр который подставляется в !! безопасный, то и использование !! есть безопасное
# шаблон !! здесь используется для лаконичного представления результатов выборки и его можно было бы
# не использовать
 

В файле классов MVC `main/w2/view.php`, класс Model_t предоставляет базовые методы ->one(), ->update() и другие, которыми можно пользоваться для сокращения кода:
001
002
003
004
005
006
007
008
009
010
011
012
<?php
 
class t_article extends Model_t
{
    function get_article($pval$rubric_id) {
        $tpl = 'uri=$+ and rubric_id=$. and lg in ($@) order by field(lg, \3) limit 1';
        $where qp($tpl$pval$rubric_id, [LGDEFAULT_LANG]);
        $row $this->one($where);
        if ($rowIS_BOT or $this->update(['!viewed' => '1 + viewed']);
        return $row;
    }
}
опубликовано ENERGY - 17 Jul 2017 10:37 GMT
последнее редактирование - 4 Jun 2018 08:15 GMT
 +  0  -  комментировать