Ankündigung

Einklappen
Keine Ankündigung bisher.

Update einer Zuordnungstabelle

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Update einer Zuordnungstabelle

    Hallo zusammen,
    ich erlaube mir mal im Fortgeschrittenen-Forum zu Posten.

    Ich bin gerade dabei eine Benutzerverwaltung für mein Projekt zu erstellen, hierbei möchte ich schön/einfach die Berechtigungen der User verwalten können.
    Das Berechtigungssystem ist relativ simpel aufgebaut, ich schreibe nach erfolgreichem Login einen Array in die Session auf diese kann jederzeit über eine Methode zugegriffen werden.
    Der Array mit den Berechtigungen sieht z.B. so aus: (Die Keys der SubArrays repräsentieren den Seitenname und die Werte die Rechte)
    PHP-Code:
    array (size=2)
      
    'termine' =>
        array (
    size=3)
          
    => string 'eintragen' (length=9)
          
    => string 'bearbeiten' (length=10)
          
    => string 'loeschen' (length=8)
      
    'news' =>
        array (
    size=3)
          
    => string 'eintragen' (length=9)
          
    => string 'bearbeiten' (length=10)
          
    => string 'loeschen' (length=8
    Nun gut jetzt zum eigentlichen Problem.
    Ich lasse mir nun in der Benutzerverwaltung für alle Verfügbaren Rechte eine Checkbox erstellen, falls der User das Recht hat wird mit dem Attribute checked selektiert.
    Wenn ich jetzt das geänderte Formular abschicke möchte ich ungern alle Berechtigungen des Users löschen und neu schreiben, es sollen also die Unterschiede ermittelt werden und nur die betroffenen Einträge in der Zuordungstabelle gelöscht/hinzugefügt werden.

    Hier meine Lösung:
    PHP-Code:
    public function updateUser($user_id) {
        
    $sql 'UPDATE benutzer SET vorname = :vorname, name = :name, email = :email WHERE id = :id';
        
    $stmt $this->dbconn->prepare($sql);
        
    $stmt->execute(array(':vorname' => $_POST['vor-name'], ':name' => $_POST['nach-name'], ':email' => $_POST['email'], ':id' => $user_id));

        
    // Update Rechte
        
    $sql 'SELECT id, seite FROM benutzer_seiten';
        
    $stmt $this->dbconn->prepare($sql);
        
    $stmt->execute();
        
    $seiten $stmt->fetchAll(PDO::FETCH_ASSOC);
        
    $userRechte = array();
        
    $stmt $this->dbconn->prepare('SELECT benutzer_rechte.recht FROM benutzer_zuweisung_seiten_rechte LEFT JOIN benutzer_rechte ON benutzer_rechte.id=benutzer_zuweisung_seiten_rechte.recht_id WHERE benutzer_id = :user_id AND seite_id = :seite');
        foreach (
    $seiten as $seite) {
            
    $stmt->execute(array(':user_id' => $user_id':seite' => $seite['id']));
            
    $userRechte[$seite['seite']] = $stmt->fetchAll(PDO::FETCH_COLUMN);
        }
        
    var_dump($userRechte);
        
    var_dump($_POST['rechte']);

        
    $stmtInsert $this->dbconn->prepare('INSERT INTO benutzer_zuweisung_seiten_rechte (benutzer_id, seite_id, recht_id) VALUES (:benutzer, (SELECT id FROM benutzer_seiten WHERE seite = :seite), (SELECT id FROM benutzer_rechte WHERE recht = :recht)');
        
    $stmtDelete $this->dbconn->prepare('DELETE FROM benutzer_zuweisung_seiten_rechte WHERE benutzer_id = :benutzer AND seite_id = (SELECT id FROM benutzer_seiten WHERE seite = :seite) AND recht_id = (SELECT id FROM benutzer_rechte WHERE recht = :recht)');
        foreach (
    $userRechte as $seite => $rechte) {
            if (
    array_key_exists($seite$_POST['rechte'])) {
                foreach (
    array_diff($_POST['rechte'][$seite], $rechte) as $recht) {
                    echo 
    'Insert ' $seite ' ' $recht '<br>';
                    
    //$stmtInsert->execute(array(':benutzer' => $user_id, ':seite' => $seite, ':recht' => $recht));
                
    }
                foreach (
    array_diff($rechte$_POST['rechte'][$seite]) as $recht) {
                    echo 
    'Delete ' $seite ' ' $recht '<br>';
                    
    //$stmtDelete->execute(array(':benutzer' => $user_id, ':seite' => $seite, ':recht' => $recht));
                
    }
            } else {
                foreach (
    $rechte as $recht) {
                    echo 
    'Delete ' $seite ' ' $recht '<br>';
                    
    //$stmtDelete->execute(array(':benutzer' => $user_id, ':seite' => $seite, ':recht' => $recht));
                
    }
            }
        }

    Ich würde gerne eure Meinungen dazu hören könnte mir vorstellen das es bessere Wege gibt das zu lösen..


    Mir freundlichen Grüßen

    Bodo

  • #2
    Wenn ich jetzt das geänderte Formular abschicke möchte ich ungern alle Berechtigungen des Users löschen und neu schreiben, es sollen also die Unterschiede ermittelt werden und nur die betroffenen Einträge in der Zuordungstabelle gelöscht/hinzugefügt werden.
    Wozu? Du machst es dir unnötig kompliziert.
    Dein Problem fällt in die Kategorie 'Ich will nicht, dass die autoincrement-ID lücken bekommt'
    [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
    [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

    Kommentar


    • #3
      Danke für die schnelle Antwort

      Mir wäre eigentlich egal wenn dort Lücken entstehen, also würdest du einfach alle Einträge in der Zuweisungstabelle die dem User zugeordnet sind löschen und anhand der Formulardaten neu eintragen?

      Kommentar


      • #4
        Habe jetzt folgenden Code:
        PHP-Code:
        public function updateUser($user_id) {
            
        $sql 'UPDATE benutzer SET vorname = :vorname, name = :name, email = :email WHERE id = :id';
            
        $stmt $this->dbconn->prepare($sql);
            
        $stmt->execute(array(':vorname' => $_POST['vor-name'], ':name' => $_POST['nach-name'], ':email' => $_POST['email'], ':id' => $user_id));

            
        // Alle Rechte vom User löschen
            
        $stmt $this->dbconn->prepare('DELETE FROM benutzer_zuweisung_seiten_rechte WHERE benutzer_id = :benutzer');
            
        $stmt->execute(array(':benutzer' => $user_id));

            
        // Neue Rechte eintragen
            
        $sql = <<<SQL
        INSERT INTO benutzer_zuweisung_seiten_rechte (benutzer_id, seite_id, recht_id)
            SELECT :benutzer, benutzer_seiten.id, benutzer_rechte.id
            FROM benutzer_seiten
            JOIN benutzer_rechte ON recht = :recht
            WHERE seite = :seite
        SQL;
            
        $stmt $this->dbconn->prepare($sql);
            foreach (
        $_POST['rechte'] as $seite => $rechte) {
                foreach (
        $rechte as $recht) {
                    
        $stmt->execute(array(':benutzer' => $user_id':seite' => $seite':recht' => $recht));
                }
            }

        Bitte dennoch um Meinungen was nun Sinnvoller ist.. oder auch ganz andere Vorschläge.

        Kommentar

        Lädt...
        X