2012-03-27 94 views
0

我創建了一個非常簡單的PostgreSQL的功能:PostgreSQL的PHP​​腳本命令返回NULL的JSON數據

CREATE OR REPLACE FUNCTION betya_ref."func_GetBetTypes"() 
RETURNS SETOF betya_ref."tbl_BET_TYPES" AS 
$BODY$ 
SELECT * FROM betya_ref."tbl_BET_TYPES";  
$BODY$ 
LANGUAGE 'sql' VOLATILE 
COST 100 
ROWS 20; 
ALTER FUNCTION betya_ref."func_GetBetTypes"() OWNER TO postgres; 
GRANT EXECUTE ON FUNCTION betya_ref."func_GetBetTypes"() TO public; 
GRANT EXECUTE ON FUNCTION betya_ref."func_GetBetTypes"() TO postgres; 
GRANT EXECUTE ON FUNCTION betya_ref."func_GetBetTypes"() TO dummy_users; 

我測試中pgAdmin的功能:

SELECT * FROM betya_ref."func_GetBetTypes"() 

它返回正確的結果:

ID NAME  
1 WIN/LOSE 
2 TRUE/FALSE" 
3 TRUE/ALTERN TRUE" 
4 RIGHT/WRONG" 

我創建了一個PHP腳本,坐在Apache 2.2服務器下的目錄「Apache2」下。 2個\ htdocs中\服務器\ betya_ref \ getBetTypes.php「:

$dbconn = pg_connect("host=192.168.1.222 port=5432 dbname=betya user=dummy_user password=dummy_pass") 
    or die('Could not connect: ' . pg_last_error()); 
print('connect ... ' . $dbconn); //debugging 
$result=pg_query($dbconn, 'SELECT * FROM betya_ref."func_GetBetTypes"()'); 
print(' *** result ... ' . $result); //debugging 
while($e=pg_fetch_row($result)) 
$output[]=$e; 
print(' *** output ... ' . $output . '... *** JSon ...'); //debugging 
print(json_encode($output)); 

pg_free_result($result); 

pg_close($dbconn); 

我打電話使用這個網址在瀏覽器中的PHP腳本:

http://localhost/server/betya_ref/getBetTypes.php 

將返回:

connect ... Resource id #2 *** result ... *** output ... ... *** JSon ...null 

其他(非常相似)我運行的現有腳本使用相同的連接字符串和相同的目錄,但是從同一個數據庫中的不同模式正確顯示JSon數據。這個新模式具有以下權限;

GRANT ALL ON SCHEMA betya_ref TO postgres; 
GRANT USAGE ON SCHEMA betya_ref TO betya_users; 

我想有在PHP腳本錯誤,但不能看到我錯了,考慮一切都是那麼的簡單,直接從PHP手冊。我沒有考慮過什麼?

+0

服務器正在運行PHP和Postgress啓用和測試。 – sMaN 2012-03-27 23:41:40

+0

另外我已經嘗試了直接的SQL,而不是PHP中的函數調用,結果相同。 – sMaN 2012-03-27 23:45:51

+0

在第二個打印語句之後'var_dump($ output)'的輸出是什麼? – Lars 2012-03-27 23:54:39

回答

1
GRANT EXECUTE ON FUNCTION betya_ref."func_GetBetTypes"() TO public; 

覆蓋它。無需在功能上授予更多權限。 GRANT到postgres也只是噪音,因爲postgres是一個超級用戶,不會給老鼠屁股特權。

GRANT USAGE ON SCHEMA betya_ref TO betya_users; 

betya_users應該是一樣的dummy_users? 並且您是否授予dummy_usersbetya_users)至dummy_user(單數形式)?

直接或間接難道你還

GRANT SELECT ON TABLE betya_ref."tbl_BET_TYPES" TO `dummy_user` 

?功能的權限爲而不是覆蓋相關表的權限,除非您使功能SECURITY DEFINER。在這種情況下,請務必閱讀手冊中的章節"Writing SECURITY DEFINER Functions Safely"

雖然我沒有看到錯誤消息。如果缺少權限,則應該有錯誤消息。

+0

是的,這是表本身上的權限問題。謝謝。但是,我沒有看到任何錯誤消息,特別是關於權限。發佈這個問題後,偶然偶然偶然發現了這個解決方案。 – sMaN 2012-03-28 02:30:08