2010-04-19 77 views
4

我有PostgreSQL的/ PLPGSQL具有以下簽名的函數:PHP調用PostgreSQL函數 - 類型問題?

CREATE OR REPLACE FUNCTION user_login(TEXT, TEXT) RETURNS SETOF _get_session AS $$ ... $$ 

_get_session一種觀點。從phpPgAdmin的調用時,它的功能工作正常,但是煥我把它從PHP我得到以下錯誤:

Warning: pg_query() [function.pg-query]: Query failed: ERROR: type "session_ids" does not exist CONTEXT: compile of PL/pgSQL function "user_login" near line 2 in /home/sites/blah.com/index.php on line 69

函數的定義段包含以下變量:

oldSessionId session_ids := $1; 
newSessionId session_ids := $2; 

域名session_ids確實存在,並且使用同一個域的其他函數在從同一個腳本調用時工作。該PHP如下:

$query = "SELECT * FROM $dbschema.user_login('$session_old'::TEXT, '$session'::TEXT)"; 
$result = pg_query($login, $query); 

我也嘗試過這種使用::session_ids代替::TEXT調用函數時,但是我收到了同樣的錯誤。

幫助:O(

+0

我會猜測,pg_query無法解析任意返回類型 - 它可以很好地處理TEXT,INT等,但可能不知道如何處理視圖。你是否嘗試過「返回記錄集」? :| – 2010-04-19 16:11:48

+0

謝謝,我沒有,但相同的原理與數據庫中的其他功能一起工作。總共有4個返回SETOF _whatever_view。真奇怪。另一個區別是這個函數是由其他用戶運行的(它有權運行所涉及的視圖)。我無法解決這個問題:o( – CitrusTree 2010-04-19 16:14:52

回答

1

只是讓你的代碼簡單:

$query = "SELECT * FROM $dbschema.user_login($1, $2)"; 
$result = pg_query_params($login, $query, array($session_old, $session)); 

現在,您從SQL注入安全

但是,你的功能仍然是錯誤的,沒有任何數據類型「session_ids」我想你想在DECLARE部分使用TEXT

+1

感謝您的提示 - 我會盡力做到這一點 雖然有一個session_ids域名 - 它在其他函數中使用:o( – CitrusTree 2010-04-19 16:18:05

+0

)您是否100%確定您'使用相同的數據庫爲您的腳本和pgAdmin? – 2010-04-19 16:49:24

+0

公平的問題...是的,所有其他位都工作得很好(在相同的請求/響應) - 只有這個功能導致問題 – CitrusTree 2010-04-19 17:23:10

1

如果你的查詢包含多行,那麼PHP很可能不會將它們作爲同一個transac的一部分發送灰。如果是這種情況,你有兩種選擇。

第一個選項是發送所有查詢在相同的呼叫

pg_query("query1; query2; query3;"); 

第二個選項(在我看來是最好的)是使用交易。這將允許您通過多行進行調用,儘管begin語句很可能需要與初始查詢一起發送。

pg_query("begin; query1;"); 
pg_query("query2;"); 
pg_query("commit;"); 

如果發生錯誤,則用回滾替換該提交,並且不會對該數據庫進行更改。

當使用Postgres時,這實際上是一個很好的經驗法則,無論如何。

+0

謝謝。我已經解決了我已經遇到的問題,但這是一些有趣的建議。 – CitrusTree 2010-05-21 09:55:27