Rechte in Array schreiben und vergleichen

Purdey

Erfahrenes Mitglied
Hallo ich möchte Rechte eines Benutzers vor dem Speichern (absenden des Formulars) mit dem Stand danach vergleichen um hier eventuelle entstandene Unterschiede in die Datenbank zu schreiben. Bisher gebe ich mir die Rechte aus mit einer Checkbox.

Der Wert der Checkbox wird jedoch nur an das Formular übermittelt, wenn ich die Box aktiviere. Hatte der Benutzer bereits ein Recht und ich entziehe es Ihm so wird dies nicht übergeben, daher der Vergleich. Oder gibt es eine bessere Möglichkeit?

Anbei mein Code:

PHP:
<? 
include('sessionhelpers.inc.php');
//$userId = $_GET['user'];
$userId="2";
$abfrage = "SELECT final.rightID, final.rightName, final.rightkatID, IF(SUM(final.hasRight)>=1, 1, 0) AS hasRight FROM ((SELECT r.rightID,r.rightName, r.rightkatID, IF(SUM(counter)>=1, 1, 0) AS hasRight FROM user_rm_rights r LEFT JOIN (SELECT rr.*, 1 AS counter FROM user_rm_role_rights rr, users ar WHERE ar.UserStatus_ID = rr.roleID AND ar.User_ID = $userId) rr  ON r.rightID = rr.rightID GROUP BY r.rightID) UNION (SELECT a.rightID, r.rightName, r.rightkatID, a.adjustment AS hasRight FROM user_rm_rights r, user_rm_account_rights_adjust a WHERE r.rightID = a.rightID  AND a.accountID = $userId))  AS final  GROUP BY final.rightkatID, final.rightID";
$ergebnis = mysql_query($abfrage);
$count = mysql_num_rows($ergbebnis);
?>
<html>
<head></head>
<body>

<form action="checkrechte.php" method="post">
<?php 
$tempSys=null;
while($row = mysql_fetch_object($ergebnis)){ 

if ($tempSys!=$row->rightkatID) {
        echo "<li><span>".$row->rightkatID."</span></li>";
        $tempSys=$row->rightkatID;
    }

if ($row->hasRight == 0) 
{
$check="";
} else {
$check="checked";
}
?>
  <p>RECHT <?php echo $row->rightID; ?> - <input type="checkbox" name="recht_<?php echo $row->rightID; ?>" <? echo $check;?> value="<?php echo $row->hasRight; ?>"><label for="recht_<?php echo $row->rightID; ?>"><?php echo $row->rightName; ?></label></p>
  <?php } ?>
  <input type="submit" name="save">



</form>
</body>
</html>
 
Zuletzt bearbeitet von einem Moderator:
Erstmal: Bitte PHP-Codetags verwenden damit es übersichtlich ist.

Kam zwar nicht ganz nach was genau du meinst mit vergleichen und so, aber du hast der Checkbox eine Value zugeordnet.
Wenn beim Absenden des Formulars diese Value in der $_POST['recht_ID'] ist dann war die Checkbox "gechecked". Wenn das Häckchen nicht gesetzt ist dan wird diese Variable leer sein.

Hoffe das hilft.

Gruss DexXxtrin
 
So nun in PHP Codetags..

Nun gut aber ich habe ja x rechte und kann ja nicht immer abfangen ob jedes recht aktiv ist etc.

ist $_POST['RECHTID'] immer gefüllt?
weil wenn ich das formular mit get sende ist dem nicht so.


PHP:
<? 
include('sessionhelpers.inc.php');
//$userId = $_GET['user'];
$userId="2";
$abfrage = "SELECT final.rightID, final.rightName, final.rightkatID, IF(SUM(final.hasRight)>=1, 1, 0) AS hasRight FROM ((SELECT r.rightID,r.rightName, r.rightkatID, IF(SUM(counter)>=1, 1, 0) AS hasRight FROM user_rm_rights r LEFT JOIN (SELECT rr.*, 1 AS counter FROM user_rm_role_rights rr, users ar WHERE ar.UserStatus_ID = rr.roleID AND ar.User_ID = $userId) rr  ON r.rightID = rr.rightID GROUP BY r.rightID) UNION (SELECT a.rightID, r.rightName, r.rightkatID, a.adjustment AS hasRight FROM user_rm_rights r, user_rm_account_rights_adjust a WHERE r.rightID = a.rightID  AND a.accountID = $userId))  AS final  GROUP BY final.rightkatID, final.rightID";
$ergebnis = mysql_query($abfrage);
$count = mysql_num_rows($ergbebnis);
?>
<html>
<head></head>
<body>
 
<form action="checkrechte.php" method="post">
<?php 
$tempSys=null;
while($row = mysql_fetch_object($ergebnis)){ 
 
if ($tempSys!=$row->rightkatID) {
        echo "<li><span>".$row->rightkatID."</span></li>";
        $tempSys=$row->rightkatID;
    }
 
if ($row->hasRight == 0) 
{
$check="";
} else {
$check="checked";
}
?>
  <p>RECHT <?php echo $row->rightID; ?> - <input type="checkbox" name="recht_<?php echo $row->rightID; ?>" <? echo $check;?> value="<?php echo $row->hasRight; ?>"><label for="recht_<?php echo $row->rightID; ?>"><?php echo $row->rightName; ?></label></p>
  <?php } ?>
  <input type="submit" name="save">
 
 
 
</form>
</body>
</html>
 
Du kannst nicht jedes Recht abfragen ob es Aktiv ist, aber jedes vergleichen ob es etwas geändert hat? Oder hab ich dich falsch verstanden.

Meines Wissens nach hat $_POST['RechtID'] nur einen Inhalt, wenn die Checkbox ausgewählt (Häckchen) ist (und die Value gesetzt).

Du kannst diese Rechte ja auch in einer Schlaufe abfragen.
Ich hab mal etwas kleines geschrieben:

test.php
PHP:
<?PHP
$rights = array(1 => 0, 2 => 1, 3 => 1, 4 => 0);
?>
<form action="test2.php" method="post"> 
<?
for($x = 1; $x < 5; $x++){
?>
<p>RECHT <?php echo $x; ?> - <input type="checkbox" name="recht_<?php echo $x; ?>" <? if($rights[$x]==1){echo "checked";}?> value="checked"><label for="recht_<?php echo $x; ?>"><?php echo $x; ?></label></p>
  
 <?php } ?>
  
  <input type="submit" name="save"> 
  
<?



?>

test2.php
PHP:
<?
for($x = 1; $x < 5; $x++){
	echo "Recht ".$x." ".$_POST['recht_'.$x]."<br>";
}
?>

Das funktioniert wunderbar. Bei den Rechten, die ausgewählt sind wird nachher "checked" angezeigt. Also kannst du dann in der schlaufe einfach überprüfen ob die Value in der POST-Variable ist. Wenn ja...
 
Als erstes, ein kleiner Tipp am Rande. Ich bedaure den armen Tor der dein SQL-Statement verstehen soll. Man kann auch in PHP die Queries sauber formatiert hinterlegen so dass sie lesbar sind

a) den SQL-Teil in PHP formatieren: Heredoc-Syntax
b) Die Complex (Curly) Syntax anwenden um die Strings zusammenzusetzen. Das reduziert das Chaos mit öffnenden und schliessenden Anführungszeichen und den Verbindungs-Punkten
PHP:
$abfrage = <<<SQL
SELECT
    final.rightID,
    final.rightName,
    final.rightkatID,
    IF(SUM(final.hasRight)>=1, 1, 0) AS hasRight 
FROM 
    (
        (
            SELECT 
                r.rightID,
                r.rightkatID,
                r.rightName,
                IF(SUM(counter)>=1, 1, 0) AS hasRight 
            FROM 
                user_rm_rights r 
                LEFT JOIN (
                    SELECT 
                        rr.*,
                        1 AS counter 
                    FROM 
                        user_rm_role_rights rr,
                        users ar 
                    WHERE 
                        ar.UserStatus_ID = rr.roleID 
                        AND ar.User_ID = {$userId}
                    ) rr  
                    ON r.rightID = rr.rightID 
            GROUP BY 
                r.rightID
        ) UNION ( 
            SELECT 
                a.rightID,
                r.rightName,
                r.rightkatID,
                a.adjustment AS hasRight 
            FROM
                user_rm_rights r,
                user_rm_account_rights_adjust a 
            WHERE 
                r.rightID = a.rightID  
                AND a.accountID = {$userId}
        )
    )AS final
GROUP BY 
    final.rightkatID,
    final.rightID;
SQL;
$ergebnis = mysql_query($abfrage);

Zeiter Tipp:
Formatiere dein Code. Bei jeder { einrücken damit man sieht welche Schleife wo beginnt und wo endet.
Ich habe versucht herauszufinden wie dein Formular aufgebaut ist . Ich habs mal analog zum SQL-Statement mal ein wenig lesbarer gemacht (die endlos lange Zeile von dir half da nicht gerade mit
PHP:
<form action="checkrechte.php" method="post">
<?php 
$tempSys=null;
while($row = mysql_fetch_object($ergebnis)){ 
    if ($tempSys != $row->rightkatID) {
        echo "<li><span>{$row->rightkatID}</span></li>";
        $tempSys=$row->rightkatID;
    }
    $check = ($row->hasRight == 0) ? "" : "checked";
    echo <<<HTML
<p>RECHT {$row->rightID} - 
    <input type='checkbox' name='recht_{$row->rightID}' {$check} value='{$row->hasRight}' />
    <label for='recht_{$row->rightID}'>{$row->rightName}</label>
</p>
HTML;
}
?>
<input type="submit" name="save" />
</form>

Zum Thema
Ich würde es so lösen, dass ich die Checkboxen in ein Array nehme.
PHP:
<form method="post">
    <!-- Umstellen des Names des Inputs damit die Rechte in einem Array sind: -->
    <!-- Den Value entfernen. Ob die Checkbox gesetzt ist sieht man daran, ob sie in $_POST[recht] auftaucht oder nicht -->
    <input type="checkbox" name="recht[1]" />
    <label for="recht[1]">Hallo</label>
    <input type="checkbox" name="recht[2]" />
    <label for="recht[2]">Hallo</label>
    <input type="submit">    
</form>
<pre>
<?php 

    //TODO: Folgende Liste aus der DB laden
    //Liste aller möglichen RechteIds
    $rightIds = array('1', '2', '3');

    //Die Liste wandeln zu RechtId->false
    $definedRights = array_fill_keys($rightIds, false);
    
    //$_POST auswerten
    $selectedRights = isset($_POST['recht']) ? $_POST['recht'] : array();
    //Und alle auf true setzen
    $selectedRights = array_fill_keys(array_keys($selectedRights), true);
    
    //Beide Listen zusammenhängen
    $rights = $selectedRights + $definedRights;
    
    //Ab jetzt sind alle Rechte definiert
    var_dump($rights);
    if($rights[1]) echo 'Recht_1 ist angekreuzt';
    
?>
</pre>
 
Okay, vielen Dank euch beiden nur muss ich noch folgendes beachten, einmal kommen die Rechte aus Tabelle A) und ein anderes mal aus Tabelle B)

ich muss nun also wissen aus welcher Tabelle das Recht kam, da ich bei A) eine Veränderung in selbiger Tabelle machen muss (justiertes Recht) und im Fall B) ein mit der Rolle XX erteiltes Recht negieren muss (also auch in die justierung - Tabelle schreiben muss)

Liese sich das auch noch einfließen lassen?

Als letztes wäre dann noch das Problem das die Rechte eigentlich nicht als lange Liste sondern eventuell in Spalten dargestellt werden sollten 2 Spalten nebeneinander, X Zeilen.

Kannst du den Part

PHP:
$rights = $selectedRights + $definedRights;

nochmal genauer erklären, ich nehme alle Rechte die existieren und schreibe sie mit false in ein Array und dann füge ich alle Benutzerrechte in ein zweites Array und am Ende füge ich beide zusammen, gehe ich richtig in der Annahme das dann recht[1] erst = false aber beim Benutzer recht[1]=true ist dann am Ende auch true ist?
 
Kannst du den Part

PHP:
$rights = $selectedRights + $definedRights;

nochmal genauer erklären, ich nehme alle Rechte die existieren und schreibe sie mit false in ein Array und dann füge ich alle Benutzerrechte in ein zweites Array und am Ende füge ich beide zusammen, gehe ich richtig in der Annahme das dann recht[1] erst = false aber beim Benutzer recht[1]=true ist dann am Ende auch true ist?

Genau: http://ch2.php.net/manual/de/language.operators.array.php
Der + Operator hängt das rechsstehende Array an das linksstehende Array an, wobei doppelte Schlüssel NICHT überschrieben werden.

Das mit mehreren Tabellen - lässt sich natürlich umsetzen
 
Zurück