По поводу расширения функционала есть еще предложение (я у себя поправил).
Предистория: нужно делать инсерт с заранее неизвестным количеством полей (ну или влом перечислять вначале поля, а потом подставлять массив результатов). Идею взял из dbsimple.
Было раньше:
$db->query("insert into ?t (?c,?c,?c) values(?i,?i,?i)", Array("table", "one", "two", "three", 1, 2, 3));
При этом чтобы добавить поле нужно было добавить ?с и ?i Ну или если запрос:
$db->query("insert into ?t (?c,?c,?c) values(?a)", Array("table", "one", "two", "three", array(1, 2, 3)));
После моих изменений можно сделать так:
$db->query("insert into ?t (?ca) values (?a)", Array("table", array("one", "two", "three"), array(1, 2, 3)));
Ну или как я обычно делаю:
$insert = array("one" => 1,
"two" => 2,
"three" => 3,
);
$db->query("insert into ?t (?ca) values (?a)", Array("table", array_keys($insert), array_values($insert)));
При этом, если изменить таблицу (добавить поле) - достаточно добавить запись в массив…
Вобщем, если кому так будет удобно, то вносим следующие изменения:
1. добавить в
private function _makeQuery($ph) после описания
case ('c'): …
case ('ac'):
case ('ca'):
foreach ($el as &$e) {
$e = "`{$e}`";
}
return implode(',', $el);
2. Добавить в регэксп в
public function makeQuery($pattern, $data, $prefix = '') одну букву
с во вторые скобки, чтобы получилось следующее:
$q = @preg_replace_callback('/\?([int?ca]?[inac]?);?/', Array($this, '_makeQuery'), $pattern);
И все…
ЗЫ… В этом случае, нельзя указать таблицу для поля, кроме как вручную без крайних апострофов, например (один из вариантов),
$insert = array("table`.`one" => 1,
"table`.`two" => 2,
"table`.`three" => 3,
);
$db->query("insert into ?t (?ca) values (?a)", Array("table", array_keys($insert), array_values($insert)));
Ну или
$table = 'table';
$insert = array("{$table}`.`one" => 1,
"{$table}`.`two" => 2,
"{$table}`.`three" => 3,
);
$db->query("insert into ?t (?ca) values (?a)", Array($table, array_keys($insert), array_values($insert)));