2014-10-09 25 views
2

можно запросить базу данных с помощью метода pg_query_params, например:`pg_query_params` и слишком много параметров

pg_query_params($connection, 'SELECT foo FROM bar WHERE id=$1 AND name=$2',array("Foobar","Qux")); 

Однако, если запрос не использует все параметры, например, с SELECT foo FROM bar WHERE id=$1 запроса, один получает следующая ошибка:

Query failed: ERROR: bind message supplies 2 parameters, but prepared statement "" requires 1 

Почему pg_query_params так ограничительный? Можно «построить» запрос и просто добавить тесты динамически. Можно ли «отключить» это поведение? Каковы альтернативы для предложения запроса, который может (не) использовать меньше параметров, чем предоставленный один раз?

+0

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

+0

@CraigRinger: Конечно, добавляемые параметры - это решение, но это делает процесс более сложным, чем нужно ... –

ответ

0

Возможно, это просто оболочка подготовленного синтаксиса оператора в postgres.

PREPARE fooplan (int, text, bool, numeric) AS 
INSERT INTO foo VALUES($1, $2, $3, $4); 
EXECUTE fooplan(1, 'Hunter Valley', 't', 200.00); 

И как таковой просто поймать исключение, брошенную Postgres, если он выполняет свое утверждение с этой дополнительной переменной.

Postgresl Prepare Documentation

Edit: От иметь взгляд вокруг него, кажется, называют PQExecParams из библиотеки C PostgreSQL, libpq. http://www.postgresql.org/docs/9.1/static/libpq-exec.html#LIBPQ-PQEXECPARAMS

Если вам действительно нужно pg_query_params для получения избыточных аргументов, почему бы просто не написать оболочку для preg_match строк $ [0-9] в запросе и предоставить только общее количество совпадений функции pg_query_params.

Например:

function my_query_params($conn, $query, $params) 
{ 
    $matches = array(); 
    preg_match('/[^\'"]\$[0-9]+[^\'"]/', $query, $matches); 

    $params = array_slice($params, 0, count($matches) - 1); 

    return pg_query_params($conn, $query, $params); 
} 

Я не проверял это на всех, но идея есть.

Смежные вопросы