Logisches Problem bei Datenbankänderung

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Logisches Problem bei Datenbankänderung

    Hallo zusammen,

    diesmal hab ich ein Problem, an dem ich wohl eher an meiner fehlenden Logik scheitere. Das hält mich schon seit Wochen auf.

    Also folgendes:

    Mein Rechtesystem läuft über Datenbanken (Gruppen eine Tabelle, sowie auch die Rechte und deren Zuweisung und die User-Gruppen Zuweisung).
    Ich hab ein Forum bereits halbwegs fertig und jetzt haperts an der Rechtezuweisung.
    Wenn ich auf Rechte klicke, muss ich das Forum aufwählen und dann erscheint einer Liste aller Gruppen (wird aus der Datenbank aufgelesen, ebenso die Foren).
    Ob jetzt bereits eine Gruppe schon ein Recht hat, wird dann über die Tabelle der gruppen/Rechtezuweisung ausgelesen.

    Wenn ich jetzt auf Speichern kling, hängts.. (ab hier bin ich noch nicht weiter).
    Ich hab bereits eine neue Schleife angelegt, dass alle Gruppen abgerufen werden. Aber wie vergleich ich jetzt, ob das schon vorhanden ist, und notfalls eintrag/rauslösch und wenns einen Fehler gibt abbreche?

    Ich weiß nicht, ob ihr damit jetzt viel anfangen könnt, wenn nicht, liefer ich noch Codes dazu.

    Vielen Dank schonmal

    Fipsi
  • Ja, soweit bin ich auch schon.. aber mir happerts jez, wie ich des umsetz.

    Bring wohl besser Code-Teile mit rein:

    Quellcode

    1. $sql1 = "SELECT grup_id, grup_name FROM gruppen";
    2. $ergebnis1 = $mysqli->query($sql1);
    3. $sql2 = "SELECT rechte_id FROM forum_kate WHERE id = $kate_id";
    4. $ergebnis2 = $mysqli->query($sql2);
    5. $row2 = $ergebnis2->fetch_object();
    6. if ($_SERVER['REQUEST_METHOD'] == "POST")
    7. {
    8. while ($row1 = $ergebnis1->fetch_object())
    9. {
    10. }
    11. }
    12. $seiten_inhalt .= "<form action=\"\" method=\"POST\">\r\n";
    13. $seiten_inhalt .= "<table width=\"100%\">\r\n";
    14. while ($row1 = $ergebnis1->fetch_object())
    15. {
    16. $sql3 = "SELECT re_id FROM f_rechte WHERE re_name = '".$row2->rechte_id."_see'";
    17. $ergebnis3 = $mysqli->query($sql3);
    18. while ($row3 = $ergebnis3->fetch_object())
    19. {
    20. $sql4 = "SELECT f_grupid FROM f_admin_rechte WHERE f_reid = $row3->re_id";
    21. $ergebnis4 = $mysqli->query($sql4);
    22. while ($row4 = $ergebnis4->fetch_object())
    23. {
    24. if ($row4->f_grupid == $row1->grup_id)
    25. {
    26. $get_right = TRUE;
    27. }
    28. }
    29. }
    30. $seiten_inhalt .= "<tr><td onclick=\"spoil('grup_".$row1->grup_id."')\"><u>".$row1->grup_name."</u></td>\r\n";
    31. $seiten_inhalt .= "<td>&nbsp;</td></tr>\r\n";
    32. $seiten_inhalt .= "<tr id=\"grup_".$row1->grup_id."\" style=\"display:none; background:#ffffff;\"><td>Darf die Kategorie sehen</td>\r\n";
    33. $seiten_inhalt .= "<td>Ja <input type=\"radio\" name=\"".$row1->grup_id."_".$row2->rechte_id."_see\" value=\"1\" ";
    34. if ($get_right == TRUE) {
    35. $seiten_inhalt .= "checked=\"checked\" "; }
    36. $seiten_inhalt .= "/> <input type=\"radio\" name=\"".$row1->grup_id."_".$row2->rechte_id."_see\" value=\"0\" ";
    37. if ($get_right != TRUE) {
    38. $seiten_inhalt .= "checked=\"checked\" "; }
    39. $seiten_inhalt .= "/> Nein</td></tr>\r\n";
    40. }
    41. $seiten_inhalt .= "<tr><td>&nbsp;</td>\r\n";
    42. $seiten_inhalt .= "<td><input type=\"submit\" value=\"Speichern\" /></td></tr>\r\n";
    43. $seiten_inhalt .= "</table>\r\n";
    44. $seiten_inhalt .= "</form>\r\n";
    Alles anzeigen


    Und da hängt's jetzt dran, an dem Teil (if ($_SERVER['REQUEST_METHOD'] == "POST")), wie ich das am besten mach, da ich die Rechte gegliedert hab in $zahl_$wort, $zahl steht hierfür für das Forum/die Kategorie und $wort dann, ob er lesen, schreiben, editieren u. w. machen darf.
  • soo..
    also der Teil im if ($_SERVER['REQUEST_METHOD'] == "POST") sieht jetzt folgendermaßen aus:

    Quellcode

    1. while ($row1 = $ergebnis1->fetch_object())
    2. {
    3. $recht_name = $row2->rechte_id."_see";
    4. $formular_data = $_POST[$row1->grup_id."_".$recht_name];
    5. $sql3 = "SELECT re_id FROM f_rechte WHERE re_name = '".$recht_name."'";
    6. $ergebnis3 = $mysqli->query($sql3);
    7. $row3 = $ergebnis3->fetch_object();
    8. $sql4 = "SELECT f_grupid FROM f_admin_rechte WHERE f_reid = $row3->re_id";
    9. $ergebnis4 = $mysqli->query($sql4);
    10. $row4 = $ergebnis4->fetch_object();
    11. if ($row4->f_grupid == $row1->grup_id)
    12. {
    13. if ($formular_data == "0")
    14. {
    15. $sql5 = "DELETE FROM ".$db_data['datenbank'].".`f_admin_rechte` WHERE `f_admin_rechte`.`f_reid` = ".$row3->re_id." AND `f_admin_rechte`.`f_grupid` = ".$row4->f_grupid." LIMIT 1";
    16. $delete = $mysqli->query($sql5);
    17. if ($delete != TRUE)
    18. {
    19. $error = TRUE;
    20. break;
    21. }
    22. }
    23. }
    24. else if ($ergebnis4->num_rows == NULL)
    25. {
    26. if ($formular_data == "1")
    27. {
    28. $sql5 = "INSERT INTO `f_admin_rechte`
    29. (`f_reid` , `f_grupid`)
    30. VALUES
    31. ('$row3->re_id' , '$row1->grup_id')";
    32. $eintragen = $mysqli->query($sql5)or die($mysqli->error);
    33. //echo $mysqli->error;
    34. if ($eintragen != TRUE)
    35. {
    36. $error = TRUE;
    37. break;
    38. }
    39. }
    40. }
    41. }
    42. if ($error == TRUE)
    43. {
    44. header("location:forum.php?do=kategorie&take=rechte&id=".$kate_id."&done=false");
    45. }
    46. else
    47. {
    48. header("location:forum.php?do=kategorie&take=rechte&id=".$kate_id."&done=true");
    49. }
    Alles anzeigen


    Das funktioniert (überraschenderweise^^) sogar fast so ganz, wie ichs will. Aber eben leider nur fast:
    Nach aktuellem System durchläuft er immer nur solange bis eine Gruppe ein Recht eingeschrieben bekommt und dann bricht die Schleife hab.. kann mir jemand sagen, wieso?
  • Außer dass in dem SQL-Befehl dann des (left) join und on steht, hab ich sowas ähnliches im Code schon an anderer stelle verarbeitet.. da ich aber bis zu dem Teil noch nicht wusste, warums nicht funktioniert, hab ich den hier geposteten Teil noch nicht überarbeitet. Steht aber auf der to-do-Liste. Danke noch für den Tipp ;)
  • Fipsi schrieb:

    Außer dass in dem SQL-Befehl dann des (left) join und on steht, hab ich sowas ähnliches im Code schon an anderer stelle verarbeitet..


    Es geht ja nicht nur ums Aussehen. Es geht ja auch darum wie die Abfrage funktioniert. Im aktuellen Stand holst du dir Datensätze um einen Teil der Datensätze wieder an die DB zurückzuschicken (für die where Bedingung). Dieses kostet nicht nur Zeit sondern auch Last. Mit einem join würdest du gleich das Gesamtergebnis bekommen.

    Bei einem kleinen Script wie deinem Sicherlich kein Problem, doch bei Anwendungen mit vielen Benutzern sind solche Fehler in Summe fatal.