[MYSQL] Order System

  • PHP

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von GimpTutWorks.

    [MYSQL] Order System

    Hallo zusammen,
    ich bin momentan dabei eine art FAQ Liste zu erstellen.
    Hierbei hat man die Möglichkeit Texte(FAQs) zu verfassen und ihnen einen Titel zu verleihen.
    Das ganze hab ich soweit fertig bekommen.

    Nun möchte ich noch eine Möglichkeit für den Administrator einbauen die Anordnung der einzelnen Items zu verändern.
    Dies will ich über zwei einfach "Move Up" und "Move Down" Button bei jedem Item realisieren.

    Die Tabellen Struktur sieht so aus:
    id | title | text | order

    Der Code, der das hinzufügen von Items realisiert, sieht wie folgt aus:

    PHP-Quellcode

    1. public function addArticle($title,$text){
    2. if($rresult = $this->mysqli->query("SELECT * FROM `th_faq`")){
    3. $numRows = $rresult->num_rows;
    4. if($numRows == 0){
    5. $order = 1;
    6. }else{
    7. if($lresult = $this->mysqli->query("SELECT * FROM `th_faq` ORDER BY id DESC LIMIT 1")){
    8. while ($row = $lresult->fetch_assoc()) {
    9. $order = intval($row["order"])+1;
    10. }
    11. }
    12. }
    13. $query = "INSERT INTO `th_faq` (`title`,`text`,`order`) VALUES ('".$title."', '".$text."', '".$order."')";
    14. $result = $this->mysqli->query($query);
    15. if($result)
    16. {
    17. return true;
    18. }
    19. }
    20. return false;
    21. }


    Ich hol mir also den order Wert vom letzten Eintrag und füge einen neuen Eintrag mit der order+1 hinzu.

    Das sortieren schien mir zuerst auch relativ simpel.

    Man klickt auf den "Move Up" Button von einem Artikel und im Hintergrund soll folgendes geschehen:

    Der "order" Wert dieses Artikels wird ausgelesen. Dann wird von diesem "order" Wert 1 subtrahiert und überprüft, ob ein Eintrag in der Tabelle mit dem "order" -1 vorhanden ist.
    Wenn dies der Fall ist, nimmt der Eintrag("order" -1) den Wert von dem Eintrag mit dem normalen "order" Wert an und der Eintrag mit dem normalen "order" Wert bekommt den vom "order" -1.
    Der Aktuelle Artikel sollte nun eins nach oben verschoben worden sein.

    Schaut wie folgt aus:

    PHP-Quellcode

    1. public function moveUp($id){
    2. if($lresult = $this->mysqli->query("SELECT * FROM `th_faq` WHERE id = '".$id."'")){
    3. while ($row = $lresult->fetch_assoc()) {
    4. $Current_Order = $row["order"];
    5. $Current_Id = $row["id"];
    6. $Prev_Order = $Current_Order - 1;
    7. }
    8. if($rresult = $this->mysqli->query("SELECT * FROM `th_faq` WHERE order = '".$Prev_Order."'")){
    9. $numRows = $rresult->num_rows;
    10. if($numRows !=0){
    11. while ($row = $rresult->fetch_assoc()) {
    12. $Prev_Id = $row["id"];
    13. }
    14. $query1 = "UPDATE `th_faq` SET `order` = '".$Prev_Order."' WHERE `id` = '".$Current_Id."'";
    15. $query2 = "UPDATE `th_faq` SET `order` = '".$Current_Order."' WHERE `id` = '".$Prev_Id."'";
    16. if($result1 = $this->mysqli->query($query1)){
    17. if($result2 = $this->mysqli->query($query2)){
    18. return true;
    19. }
    20. }
    21. }
    22. }
    23. }
    24. return false;
    25. }


    Ich habs bis jetzt nicht getestet, da mir jetzt noch was herzzerreißendes in den Sinn gekommen ist:
    Was ist, wenn ein Eintrag gelöscht wurde und es eine Lücke zwischen den "order" Werten gibt [...]
    Also statt:
    1
    2
    3
    Nur:
    1
    3
    [...] und ich versuchen würde den Artikel mit dem "order" Wert "3" nach oben zu bringen?
    Das ganze bringt meine Planung wieder durcheinander...

    So viel Vorgeschichte für eine einfache, schwer formulierbare Frage:
    Wie bekomme ich die Primary Id vom Eintrag vor dem ausgewählten Artikel und nach dem ausgewählen Artikel?
    Ich bin leider noch nicht all zu bewandert in mysql und google.. meine Formulierung der Suche wäre zu skurril um gescheite Ergebnisse zu liefern.

    Mit freundlichen Füßen, Re3ker.


    Edit:
    Mit ein paar Anläufen und Logik Fehlern hab ich es nun dann doch hinbekommen.Schaut nun insgesamt so aus:

    Spoiler anzeigen

    PHP-Quellcode

    1. public function addArticle($title,$text){
    2. if($rresult = $this->mysqli->query("SELECT * FROM `th_faq`")){
    3. $numRows = $rresult->num_rows;
    4. if($numRows == 0){
    5. $order = 1;
    6. }else{
    7. if($lresult = $this->mysqli->query("SELECT * FROM `th_faq` ORDER BY `order` DESC LIMIT 1")){
    8. while ($row = $lresult->fetch_assoc()) {
    9. $order = intval($row["order"])+1;
    10. }
    11. }
    12. }
    13. $query = "INSERT INTO `th_faq` (`title`,`text`,`order`) VALUES ('".$title."', '".$text."', '".$order."')";
    14. $result = $this->mysqli->query($query);
    15. if($result)
    16. {
    17. return true;
    18. }
    19. }
    20. return false;
    21. }
    22. public function moveUp($id){
    23. if($lresult = $this->mysqli->query("SELECT * FROM `th_faq` WHERE id = '".$id."'")){
    24. while ($row = $lresult->fetch_assoc()) {
    25. $Current_ID = $row["id"];
    26. $Current_ID_Order = $row["order"];
    27. }
    28. $pquery = "SELECT * FROM `th_faq` WHERE `order` < '".$Current_ID_Order."' ORDER BY `order` DESC LIMIT 1";
    29. if($myresult = $this->mysqli->query($pquery)){
    30. $numRows = $myresult->num_rows;
    31. if($numRows != 0){
    32. while ($row = $myresult->fetch_assoc()) {
    33. $Preview_ID = $row["id"];
    34. $Preview_ID_Order = $row["order"];
    35. }
    36. $query1 = "UPDATE `th_faq` SET `order` = '".$Preview_ID_Order."' WHERE `id` = '".$Current_ID."'";
    37. $query2 = "UPDATE `th_faq` SET `order` = '".$Current_ID_Order."' WHERE `id` = '".$Preview_ID."'";
    38. if($result1 = $this->mysqli->query($query1)){
    39. if($result2 = $this->mysqli->query($query2)){
    40. return true;
    41. }
    42. }
    43. }
    44. }
    45. }
    46. return false;
    47. }
    48. public function moveDown($id){
    49. if($lresult = $this->mysqli->query("SELECT * FROM `th_faq` WHERE id = '".$id."'")){
    50. while ($row = $lresult->fetch_assoc()) {
    51. $Current_ID = $row["id"];
    52. $Current_ID_Order = $row["order"];
    53. }
    54. $pquery = "SELECT * FROM `th_faq` WHERE `order` > '".$Current_ID_Order."' ORDER BY `order` ASC LIMIT 1";
    55. if($myresult = $this->mysqli->query($pquery)){
    56. $numRows = $myresult->num_rows;
    57. if($numRows != 0){
    58. while ($row = $myresult->fetch_assoc()) {
    59. $Next_ID = $row["id"];
    60. $Next_ID_Order = $row["order"];
    61. }
    62. $query1 = "UPDATE `th_faq` SET `order` = '".$Next_ID_Order."' WHERE `id` = '".$Current_ID."'";
    63. $query2 = "UPDATE `th_faq` SET `order` = '".$Current_ID_Order."' WHERE `id` = '".$Next_ID."'";
    64. if($result1 = $this->mysqli->query($query1)){
    65. if($result2 = $this->mysqli->query($query2)){
    66. return true;
    67. }
    68. }
    69. }
    70. }
    71. }
    72. return false;
    73. }


    Ist somit erledigt.MfG, Re3ker

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „GimpTutWorks“ ()