реализация простого подготовленного запроса в PHP - PullRequest
6 голосов
/ 10 января 2010

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

Теперь у меня есть функция, принимающая строку запроса и массив значений, подобных этому:

$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 для извлечения :: идентификаторов и: идентификаторов из строки запроса, а затем отправляю их в функцию очистки. Проблема в том, что мне также нужно отправить массив значений, чтобы функция могла взять совпадение из регулярного выражения, получить элемент в массиве значений с этим ключом, экранировать значение, обернуть его в правильные кавычки и затем вернуть его .

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

Какой еще подход к этому?

Ответы [ 3 ]

2 голосов
/ 10 января 2010

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

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

2 голосов
/ 10 января 2010

Одной из альтернатив, предложенных различными комментариями в руководстве, является использование preg_replace() с модификатором 'e' как части регулярного выражения:

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

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

preg_replace('/pattern/e',"your_function(\$array,\$foo,\$bar,\$etc)",$str);
1 голос
/ 10 января 2010

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

...