Я пытаюсь создать очень простую абстракцию базы данных, одну часть ее с помощью подготовленных запросов.
Теперь, у меня есть функциональное взятие строка запроса и массив значений как это:
$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.
Что другой подход к этому?
Одной из альтернатив, предложенных различными комментариями в Руководстве, является использование preg_replace ()
с модификатором «E» в рамках Regexp:
preg_replace("/pattern/e","strtoupper('\\1')",$subject);
по сути Указав код для оценки. Я думаю Этот комментарий имеет хороший пример, в результате чего вы создаете функцию, а затем небольшую строку, чтобы оценить ее, что позволяет вам проходить дополнительные параметры:
preg_replace('/pattern/e',"your_function(\$array,\$foo,\$bar,\$etc)",$str);
вы также можете проверить pdo, zend_db и mdb2. хорошо, что у них есть именованные параметры и драйверы, которые могут правильно создавать подготовленные операторы (или эмулировать подготовленные операторы) на многих механизмах хранения.
например, zend_db выполнит базовый синтаксический анализ sql для обработки крайних случаев, например, когда регулярное выражение, встроенное в запрос, представляет собой класс символов с двоеточием ...