реализация простого подготовленного запроса в PHP

Я пытаюсь создать очень простую абстракцию базы данных, одну часть ее с помощью подготовленных запросов.

Теперь, у меня есть функциональное взятие строка запроса и массив значений как это:

$query = "SELECT `first_name`, `last_name` FROM ::table_name WHERE `id` = :id"
$values = array(
    'table_name' = $this->table_name,
    'id' = $user_id,
);

это создаст запрос как это:

SELECT `first_name`, `last_name` FROM `sometablename` WHERE `id` = '1234'

моя проблема - это:
Я использую preg_replace_callback захватить:: идентификаторы и: идентификаторы от строки запроса и затем отправка его к функции санитизации. Проблема, я также должен отправить массив значений, так, чтобы функция могла взять соответствие от regexp, получить объект в массиве значений с тем ключом, выйти из значения, перенести его в правильные кавычки и затем возвратить его.

Но я не могу передать дополнительную информацию обратному вызову. Я мог использовать частную статическую переменную, но это очень hacky.

Что другой подход к этому?

6
задан Carson Myers 9 January 2010 в 23:04
поделиться

3 ответа

Одной из альтернатив, предложенных различными комментариями в Руководстве, является использование preg_replace () с модификатором «E» в рамках Regexp:

preg_replace("/pattern/e","strtoupper('\\1')",$subject);

по сути Указав код для оценки. Я думаю Этот комментарий имеет хороший пример, в результате чего вы создаете функцию, а затем небольшую строку, чтобы оценить ее, что позволяет вам проходить дополнительные параметры:

preg_replace('/pattern/e',"your_function(\$array,\$foo,\$bar,\$etc)",$str);
2
ответ дан 17 December 2019 в 04:47
поделиться

вы также можете проверить pdo, zend_db и mdb2. хорошо, что у них есть именованные параметры и драйверы, которые могут правильно создавать подготовленные операторы (или эмулировать подготовленные операторы) на многих механизмах хранения.

например, zend_db выполнит базовый синтаксический анализ sql для обработки крайних случаев, например, когда регулярное выражение, встроенное в запрос, представляет собой класс символов с двоеточием ...

2
ответ дан 17 December 2019 в 04:47
поделиться

Не соответствует ли vsprintf вашим потребностям?

1
ответ дан 17 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: