ksnk
прохожий
Как-то, вот, сочинилось. Язык, в принципе, похож на Котеровский из dbSimple. Прелесть его в том, что сама реализация - 50 строк...
Основной смысл - комбинации с ? в начале, служат плейсхолдерами для переменных, передаваемых в функцию. Можно указывать тип передаваемой переменной. ?d - число? привести к числу, вставлять без кавычек, ?s - строка, вставлять с двойными кавычками, ?k - строка, которую требуется обрамить обратными `` кавычками, ?x - просто тупо вставить без коррекции и так далее. Просто вопросик вызывает анализ параметра. Число вставляется без кавычек, строка - с кавычками. Понятно, в нужных местах, делается escape.
Каждый вопросик сдвигает указатель на следующую переменную. Если сразу после ? стоит число - считается, что нужно использовать переменную с таким номером и не двигать текущий указатель переменной. Пока все предсказуемо и не ново. А вот и ноухау:
?(...) - применяется к параметру - массиву. Все значения массива пробегаются и комбинация символов из строчки в скобках, применяется к паре - ключ (первый параметр),значение (второй параметр). Все полученные значения соединяются через запятую. Нехитрый, казалось бы, трюк позволяет мастерить практически всё многообразие запросов.
Вот примерчики, для того,чтобы понять - надо оно или сразу в морг...
$db - драйвер базы данных, _ - внутренний метод, который получает массив параметров, переданных из внешних функций драйвера. Первый элемент ассива - sql-форма, последующие - параметры.
Ну и реализация:
Какого либо контроля на число передаваемых переменных и соответствие их sql-формату нет. imho, cам php в варнингах исправно сообщит о кривости шаблона, при первом же его применении.
Основной смысл - комбинации с ? в начале, служат плейсхолдерами для переменных, передаваемых в функцию. Можно указывать тип передаваемой переменной. ?d - число? привести к числу, вставлять без кавычек, ?s - строка, вставлять с двойными кавычками, ?k - строка, которую требуется обрамить обратными `` кавычками, ?x - просто тупо вставить без коррекции и так далее. Просто вопросик вызывает анализ параметра. Число вставляется без кавычек, строка - с кавычками. Понятно, в нужных местах, делается escape.
Каждый вопросик сдвигает указатель на следующую переменную. Если сразу после ? стоит число - считается, что нужно использовать переменную с таким номером и не двигать текущий указатель переменной. Пока все предсказуемо и не ново. А вот и ноухау:
?(...) - применяется к параметру - массиву. Все значения массива пробегаются и комбинация символов из строчки в скобках, применяется к паре - ключ (первый параметр),значение (второй параметр). Все полученные значения соединяются через запятую. Нехитрый, казалось бы, трюк позволяет мастерить практически всё многообразие запросов.
Вот примерчики, для того,чтобы понять - надо оно или сразу в морг...
$db - драйвер базы данных, _ - внутренний метод, который получает массив параметров, переданных из внешних функций драйвера. Первый элемент ассива - sql-форма, последующие - параметры.
PHP:
$db->_(array('insert into ?k (?(?k)) values (?2(?2))','x_table'
,array('one'=>1,'two'=>2,'three'=>'облом')))
insert into `x_table` (`one`,`two`,`three`) values (1,2,"облом")
PHP:
$db->_(array("SELECT * from table AS e
WHERE e.`ID` in (?1(?d))
ORDER BY FIELD(e.`ID`, ?1(?d))",
array(25,24,2345));
Единственно "некрасивая" фенечка - генерация простыни из insert valuesSELECT * from table AS e
WHERE e.`ID` in (25,24,2345)
ORDER BY FIELD(e.`ID`, 25,24,2345)
PHP:
// генерация простыни
$x=array(
array('x'=>1,'y'=>2,'z'=>3),
array('x'=>1,'y'=>2,'z'=>3),
array('x'=>1,'y'=>2,'z'=>3),
);
$part=array();
foreach($x as $xx) $part[]= $db->_(array(array('(?(?2))',$xx)));
$db->_(array('insert into ?k (?(?k)) values ?3(?2x);','table',$x[0],$part)))
PHP:
/**
* helper-заполнятель sql конструкций.
* список подстановок
* ?_ - подставить префикс таблицы, указатель парамемтров не перемещается
* ?12x - подставить 12 по счету параметр. Указатель параметров не перемещается
* без номера - указатель перемещается на следующий параметр
* ?x - подставить параметр без обработки
* ?d, ?i - параметр - чиcло. Явно приводится к числовому значению, каычек нет.
* ?k - параметр - имя поля, обрамляется `` кавычками
* ?s - параметр - строка - выводится в двойных кавычках,
* делается mysql_real_escape_string
* ? - анализируется значение, для чисел не вставляются кавычки,
* для строк делается ескейп
* ?(...) - параметр - массив, для каждой кары ключ-значение массива
* применяется формат из скобок. Разделяются запятыи
*
* @param array $args - нулевой параметр - формат
* @return string
*/
function _($args)
{
static $pref;
//$args=func_get_args();
$format = $args[0];
$cnt = 1;
$start = 0;
while (preg_match('/(?<!\\\\)\?(\d*)(i|d|x|k|_|s|\(([^\)]+)\)|)/i'
, $format, $m, PREG_OFFSET_CAPTURE, $start)
) {
$x = '';
$cur = $m[1][0];
if (empty($cur)) $cur = $cnt++;
if (empty($m[2][0])) {
if (is_int($args[$cur]) || ctype_digit($args[$cur]))
$x = (0 + $args[$cur]);
else
$x = '"' . mysql_real_escape_string($args[$cur]) . '"';
} else switch ($m[2][0]) {
case '_':
if (!isset($pref))
$pref = ENGINE::option('database.prefix', 'xxx_');
$x = $pref;
break;
case 'i':
case 'd':
$x = (0 + $args[$cur]);
break;
case 'x':
$x = $args[$cur];
break;
case 'k':
$x = '`' . mysql_real_escape_string($args[$cur]) . '`';
break;
case 's':
$x = '"' . mysql_real_escape_string($args[$cur]) . '"';
break;
default: //()
if (is_array($args[$cur])) {
$s = array();
foreach ($args[$cur] as $k => $v)
$s[] = $this->_(array($m[3][0], $k, $v));
$x = implode(',', $s);
}
}
$format = substr($format, 0, $m[0][1]) . $x . substr($format, $m[2][1] + strlen($m[2][0]));
$start = $m[0][1] + strlen($x);
}
return $format;
}