繁体   English   中英

带有 PostgreSQL 命令的 PHP 脚本为 Json 数据返回 NULL

[英]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在功能上的任何更多的权限。 postgresGRANT也只是噪音,因为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM