php - 使用 PostgreSQL ARRAY、array_to_json()、json_build_array() 制作一个 php ARRAY
问题描述
让我解释一下我的问题。我管理一个应用程序,该应用程序允许为用户赋予角色并让他们使用数据库访问不同的模式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;
}
}
但是,(据我所知),我需要在查询中的某处放置 aarray_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()
其他任何东西......有人可以帮助我吗?
解决方案
感谢@04FS,我不必在 json 中编码。&我没有修改我的功能UserManager::getList();
。
让我演示给你看 :
$list = UserManager::getList();
foreach ($list as $elt) {
echo '<p>' . $elt->getLogin() . '</p>';
echo '<p>' . $elt->getPassword() . '</p>';
$roles=$elt->getRoles();
if(isset($roles) && !empty($roles) && $roles!=="{}"){
$roles = trim($roles, "{}");
$roles = explode (",", $roles);
echo '<p>Membership of :</p>';
echo '<ul>';
foreach ($roles as $role) {
echo '<li>'.$role.'</li>';
}
echo '</ul>';
}
$schemas=$elt->getSchemas();
if(isset($schemas) && !empty($schemas) && $schemas!=="{}"){
$schemas = trim($schemas, "{}");
$schemas = explode (",", $schemas);
echo '<p>Use schemas :</p>';
echo '<ul>';
foreach ($schemas as $schema) {
echo '<li>'.$schema.'</li>';
}
echo '</ul>';
}
}
推荐阅读
- nhibernate - Nhibernate Criteria 检索父母的孩子,但对父母的其他孩子有限制
- celery - 如何根据传递给 Celery 任务事件的参数找到任务 ID?
- javascript - reactjs中组件内部的功能
- reactjs - React 组件在与同一个组件交换时不会重新渲染
- java - 在java中打印日历
- python - 检查日期是否存在
- java - 如何从 HttpServlet 访问同一个 bean 实例?
- google-text-to-speech - Google Cloud Text-to-Speech 请求的最大大小
- git - 是否有可能知道文件是否存在于 git 存储库的文件夹中?
- php - 在一个查询中更新多个表