PHP-скрипт с командами PostgreSQL, возвращающий NULL для данных JSon - PullRequest
0 голосов
/ 28 марта 2012

Я создал очень простую функцию PostgreSQL:

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 \ server \ 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 в браузере, используя этот URL:

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. Что я не учел?

1 Ответ

1 голос
/ 28 марта 2012
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_users (betya_users) до dummy_user (форма единственного числа)?

Вы тоже

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

прямо или косвенно? Привилегии для функции не охватывают привилегии для задействованных таблиц, если только вы не сделали функцию SECURITY DEFINER. В этом случае обязательно прочитайте главу «Безопасное написание функций БЕЗОПАСНОСТИ» в руководстве.

Хотя я не вижу сообщения об ошибке. При отсутствии привилегий должно появиться сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...