[英]PHP script with PostgreSQL commands returning NULL for JSon data
我创建了一个非常简单的 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 脚本,位于“Apache2.2\\htdocs\\server\\betya_ref\\getBetTypes.php”目录下的 Apache 2.2 服务器中:
$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);
我使用以下 URL 在浏览器中调用 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 手册。 我没有考虑到什么?
GRANT EXECUTE ON FUNCTION betya_ref."func_GetBetTypes"() TO public;
会覆盖它。 除了你甚至不需要那个。 手册:
对于其他类型的对象,授予
PUBLIC
的默认权限如下: [...] 函数和过程的EXECUTE
权限;
无需GRANT
在功能上的任何更多的权限。 对postgres
的GRANT
也只是噪音,因为postgres
是一个忽略特权的超级用户。
你也是:
GRANT USAGE ON SCHEMA betya_ref TO betya_users;
betya_users
应该与dummy_users
相同吗?
你有没有将GRANT dummy_users TO dummy_user
(单数)?
你是否也:
GRANT SELECT ON TABLE betya_ref."tbl_BET_TYPES" TO `dummy_user`
直接还是间接? 函数的特权不包括对相关表的特权,除非您使函数SECURITY DEFINER
。 在这种情况下,请务必阅读手册中的“安全地编写SECURITY DEFINER
函数”一章。
但是,我没有看到错误消息。 如果缺少权限,应该会出现错误消息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.