Сделайте php ARRAY с помощью PostgreSQL ARRAY, array_to_json (), json_build_array () - PullRequest
0 голосов
/ 23 сентября 2019

Позвольте мне объяснить мою проблему.Я управляю приложением, которое позволяет назначать роли пользователям и предоставлять им доступ к различным схемам, с базой данных 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() или что-нибудь еще ... Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 23 сентября 2019

Благодаря @ 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>';
    }

}
...