Эта тема на forum.dklab.ru


Константин Буравцов: mysql_qw(). Аналог для sqlite
В книге PHP 5 авторы приводят очень полезную функцию, альтернативу mysql_query(). Вот так выглядит функция:

<?php ## Простейшая функция для работы с placeholder-ами.

// result-set mysql_qw($connection_id, $query, $arg1, $arg2, ...)
// - или -
// result-set mysql_qw($query, $arg1, $arg2, ...)
// Функция выполняет запрос к MySQL через соединение, заданное как
// $connection_id (если не указано, то через последнее открытое).
// Параметр $query может содержать подстановочные знаки ?,
// вместо которых будут подставлены соответствующие значения
// аргументов $arg1, $arg2 и т.д. (по порядку), экранированные и
// заключенные в апострофы.
function mysql_qw() {
// Получаем все аргументы функции.
$args = func_get_args();
// Если первый параметр имеет тип "ресурс", то это ID соединения.
$conn = null;
if (is_resource($args[0])) $conn = array_shift($args);
// Формируем запрос по шаблону.
$query = call_user_func_array("mysql_make_qw", $args);
// Вызываем SQL-функцию.
return $conn!==null? mysql_query($query, $conn) : mysql_query($query);
}

// string mysql_make_qw($query, $arg1, $arg2, ...)
// Данная функция формирует SQL-запрос по шаблону $query,
// содержащему placeholder-ы.
function mysql_make_qw() {
$args = func_get_args();
// Получаем в $tmpl ССЫЛКУ на шаблон запроса.
$tmpl =& $args[0];
$tmpl = str_replace("%", "%%", $tmpl);
$tmpl = str_replace("?", "%s", $tmpl);
// После этого $args[0] также окажется измененным.
// Теперь экранируем все аргументы, кроме первого.
foreach ($args as $i=>$v) {
if (!$i) continue; // это шаблон
if (is_int($v)) continue; // целые числа не нужно экранировать
$args[$i] = "'".mysql_escape_string($v)."'";
}
// На всякий случай запорняем 20 последних аргументов недопустимыми
// значениями, чтобы в случае, если число "?" превышает количество
// параметров, выдавалась ошибка SQL-запроса (поможет при отладке).
for ($i=$c=count($args)-1; $i<$c+20; $i++)
$args[$i+1] = "UNKNOWN_PLACEHOLDER_$i";
// Формируем SQL-запрос.
return call_user_func_array("sprintf", $args);
}
?>


На практике оказалось невероятно удобно. Теперь я начал работать с SQLite, и мне очень не хватает подобного инструмента. Я пытался модифицировать функцию сам, но получил постоянную 500-ую ошибку (уж не знаю, в чем конкретно была ее причина, я так и не выяснил).

Не могли бы вы помочь в написании схожей функции для SQLite?

Заранее благодарен!
Константин Жинько [tIT]:
Не могли бы вы помочь в написании схожей функции для SQLite?
50 баксов
Юрий Насретдинов:
Константин Буравцов
49.95$!!

Эта тема на forum.dklab.ru