【问题标题】:Make a php ARRAY with a PostgreSQL ARRAY, array_to_json(), json_build_array()使用 PostgreSQL ARRAY、array_to_json()、json_build_array() 制作一个 php ARRAY
【发布时间】: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 useful cmets 的地方......但是你注释掉了那些 json_decode 调用,没有任何适当的解释这实际上不起作用。
  • 你好@04FS 帖子现在正在编辑
  • {role1,role2} 不是有效的 JSON,它会在这些字符串值周围缺少引号。删除开头和结尾的 { 和 },并在逗号处爆炸其余部分...? (如果其中任何一个值本身可能包含逗号,那将是有问题的。在这种情况下,您首先需要找出 postgres 如何在这样的返回值中编码/屏蔽它。)
  • 是的,我可以删除“{”和“}”并在逗号处爆炸,但我需要的只是一个数组,即使我这样做,我也不会得到一个数组......它总是会返回一个字符串
  • 如何用逗号分隔的值逗号,not得到一个数组?

标签: php arrays json postgresql


【解决方案1】:

感谢@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>';
    }

}

【讨论】:

    猜你喜欢
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多