2014-10-09 160 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是否可以,但這是通常的解決方案。否則,只需根據您發送的實際查詢將參數追加到數組中。 – 2014-10-09 10:00:26

+0

@CraigRinger:當然,追加參數是一個解決方案,但它使得處理方式比它應該更復雜...... – 2014-10-09 10:04:09

回答

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

編輯:從有它周圍一看,似乎調用來自PostgreSQL C庫PQExecParams,那麼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); 
} 

我根本不但這個想法測試這是存在的。