【发布时间】:2020-01-23 11:16:15
【问题描述】:
让我解释一下我的问题。我管理一个应用程序,该应用程序允许为用户分配角色并允许他们访问不同的架构,并使用 PostgreSQL 数据库。
我想查看每个用户的详细信息,所以我的意思是我想查看所有架构+角色。
所以我创建了一个函数getList(),它返回登录名+密码+角色+模式。
这是函数:
public static function getList()
{
$db = DbConnect::getDb();
$q = pg_query("SELECT
u.usesysid as idUser, u.usename as login,
u.passwd as password,
ARRAY(SELECT b.rolname FROM pg_catalog.pg_auth_members m JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid) WHERE m.member = r.oid) as roles,
ARRAY(SELECT nspname FROM pg_namespace pn WHERE pg_catalog.has_schema_privilege(r.rolname, nspname, 'USAGE')= true AND nspname <> 'information_schema' AND nspname !~~ 'pg_%') as schemas
FROM pg_catalog.pg_roles r JOIN pg_catalog.pg_user u on(r.rolname=u.usename)
WHERE usename !~ 'postgres' ORDER BY 1;");
if ($data = pg_fetch_assoc($q)) {
do {
$users[] = new User($data);
} while ($data = pg_fetch_assoc($q));
return $users;
} else {
return null;
}
}
但是,(据我所知),我需要在查询中的某处放置 array_to_json() 或 json_build_array() 或类似的东西,因为查询中的数组 (PostgreSQL) 在 PHP 中返回一个字符串而不是大批。
如你所见:
8 =>
object(User)[9]
private '_idUser' => string '24733' (length=5)
private '_login' => string 'efefhhh' (length=7)
private '_password' => string '********' (length=8)
private '_roles' => string '{role1,role2}' (length=13)
private '_schemas' => string '{schematest,public,schematest2}' (length=31)
所以我真的需要一个PHP 数组来使这个以下代码工作:
$list = UserManager::getList();
foreach ($list as $elt) {
echo '<p>' . $elt->getLogin() . '</p>';
echo '<p>' . $elt->getPassword() . '</p>';
$roles=$elt->getRoles();
//$roles=json_decode($roles); //Will be useful if I put a array_to_json() in the query of getList ?
if(isset($roles) && !empty($roles)){
echo '<p>Membership of :</p>';
echo '<ul>';
foreach ($roles as $role) {
echo '<li>'.$role.'</li>';
}
echo '</ul>';
}
$schemas=$elt->getSchemas();
//$schemas=json_decode($schemas); //Will be useful if I put a array_to_json() in the query of getList ?
if(isset($schemas) && !empty($schemas)){
echo '<p>Use schemas :</p>';
echo '<ul>';
foreach ($schemas as $schema) {
echo '<li>'.$schema.'</li>';
}
echo '</ul>';
}
}
但我真的不知道我可以在哪里放任何 array_to_json() 或 json_build_array() 或其他任何东西......
有人可以帮帮我吗?
【问题讨论】:
-
不清楚你在问什么。如果 postgres 以 JSON 格式返回数组“字符串”,那么解码该 JSON 就足够了,以获得可用的 PHP 数组。我希望最合乎逻辑的地方发生在你放置
//Will be usefulcmets 的地方......但是你注释掉了那些 json_decode 调用,没有任何适当的解释这实际上不起作用。 -
你好@04FS 帖子现在正在编辑
-
{role1,role2}不是有效的 JSON,它会在这些字符串值周围缺少引号。删除开头和结尾的 { 和 },并在逗号处爆炸其余部分...? (如果其中任何一个值本身可能包含逗号,那将是有问题的。在这种情况下,您首先需要找出 postgres 如何在这样的返回值中编码/屏蔽它。) -
是的,我可以删除“{”和“}”并在逗号处爆炸,但我需要的只是一个数组,即使我这样做,我也不会得到一个数组......它总是会返回一个字符串
-
如何用逗号分隔的值在逗号,not得到一个数组?
标签: php arrays json postgresql