PHP ARRAY,2个foreach,输入名称=“”问题

时间:2019-09-10 14:46:40

标签: php arrays postgresql loops foreach

好的,我有一个大问题。 让我解释一下。

我需要在一些输入(复选框)中列出所有模式,然后我们才能选择要操纵的一个或多个模式,以赋予特定用户特权。

反正我明白了,

<div id="list-schemas">
    <?php
        foreach ($schemas as $elt) {
        echo '<input type="checkbox" name="schemas[]" value="' . $elt->getSchema() . '"/>' . $elt->getSchema() . '<br />';
        }
    ?>
</div>

然后,我还需要添加一些具有特权的复选框,我这样做了:

<div id="div-privileges">
    <?php
        foreach ($schemas as $elt) {
            echo '<div class="list">';
            echo '<label for="list">' . $elt->getSchema() . ' :</label><br />';
            echo '<input type="checkbox" name="privileges[]" value="REVOKE"/> REVOKE ? <br />';
            echo '<input type="checkbox" name="privileges[]" value="ALL"/> ALL PRIVILEGES ? <br />';
            echo '<hr>';
            echo '<input type="checkbox" name="privileges[]" value="SELECT"/> SELECT ? <br />';
            echo '<input type="checkbox" name="privileges[]" value="INSERT"/> INSERT ? <br />';
            echo '<input type="checkbox" name="privileges[]" value="UPDATE"/> UPDATE ?  <br />';
            echo '<input type="checkbox" name="privileges[]" value="DELETE"/> DELETE ?  <br />';
            echo '<hr>';
            echo '<input type="checkbox" name="privileges[]" value="CREATE"/>CREATE ?  <br />';
            echo '</div>';
        }
    ?>
</div>

这么说,这是我的UserManager.class.php中的函数更新:

public static function update(User $newPerso){

    $db = DbConnect::getDb();
    $newLogin= pg_escape_string($newPerso->getLogin());
    $schemas=$newPerso->getSchemas();
    $privileges=$newPerso->getPrivileges();

    if (isset($schemas)){

        foreach($schemas as $schema){

            if (isset($privileges)){

                foreach($privileges as $privilege){

                    if($privilege=="REVOKE"){
                        pg_query("{$privilege} ALL ON ALL TABLES IN SCHEMA {$schema} FROM {$newLogin};");
                    }

                    else if($privilege=="CREATE"){
                        pg_query("GRANT {$privilege} ON SCHEMA {$schema} TO {$newLogin};");
                    }

                    else if($privilege=="ALL" || $privilege=="INSERT" || $privilege=="SELECT" || $privilege=="UPDATE" || $privilege=="DELETE"){
                        pg_query("GRANT {$privilege} ON ALL TABLES IN SCHEMA {$schema} TO {$newLogin};");
                    }
                }
            }
        }
    }
}

事实是,它有效,但

例如,当我选择2个模式时(比如说'schema1'和'schema2'), &当我为“ schema1”选择“ SELECT”,为“ schema2”选择“ INSERT”时,

结果:用户在“ schema1”和“ schema2”中将具有“ SELECT” +“ INSERT” ...

我真的很困,而且我真的不知道该怎么办...

1 个答案:

答案 0 :(得分:2)

只需将您的输入修改为

<input type="checkbox" name="privileges[schema1][]" value="REVOKE"/> REVOKE ? <br />

看到这个[schema1]吗?它将为您提供$_POST数组中的另一个级别。

因此,您可以像这样遍历它:

foreach ($_POST['privileges'] as $schema => $privileges) {
    foreach ($privileges as $privilege) {
        // you know what privilege is for what schema
    }
}