Ankündigung

Einklappen
Keine Ankündigung bisher.

URL wird zu lang wegen checkbox-Werten

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • URL wird zu lang wegen checkbox-Werten

    Hallo!
    Den ganzen Tag recherchiert und nichts gefunden...

    Hintergrund:
    wir haben eine todo-Liste für einen Prof. in php/mysql geschrieben, in der erledigte Aufgaben mit einem Haken als erledigt gekennzeichnet werden.
    In der Übersicht wird jeder Eintrag angezeigt, u.a. mit der Spalte checkbox erledigt. Klappt auch alles wunderbar.

    Problem:
    Nun wurden seine Bestandsdaten übernommen (fast 2.000 Einträge). Das Problem bei der Anzeige aller Einträge ist nun, dass jeder checked Eintrag einen Wert in die URL übergibt, was die Länge der URL klarerweise übersteigt.

    Folge:
    Request-URI Too Long.

    Die URL sieht vor dem Crash ungefähr so aus:
    http://DOMAIN/todo/todo.php?todorepo...on&erledigt=on
    ..... etc.

    Im Quellcode wird der Eintrag aus der DB wie folgt geholt:

    PHP-Code:
    <!-- Spalte 8: Checkbox erledigt -->
    <?php
    if ($_SESSION['rechte'] == 1// nur Leserechte
    {
    ?>
    <td onclick="window.location ='details.php?ID_aufgabe=<?php echo($row[0]);?>';">
    <input type="checkbox" disabled="true" name="erledigt"<?php if (empty($row[6])) {
    else {echo(
    "checked");}
    ?>></td>

    <!-- bis hierhin gibts keine Probleme weil die checkbox für "nur Leserechte" disabled ist 
    Anm.: Wenn man nachfolgend die checkbox disabled ist ebenfalls alles OK mit der URL; man kann dann nur leider nicht die Einträge aus der Liste direkt abhaken.
    Ab hier folgt der Problem-Code: -->

    <?php
    }
    else if (
    $_SESSION['rechte'] == 2// mit Schreibrechten
    {
    ?>
    <td onclick= "window.location.href ='erledigt.php?ID_aufgabe=<?php echo($row[0]);?>&Datum=<?php echo($row[6]);?>'">
    <input type="checkbox" name="erledigt" disabled="true"
    <?php if (empty($row[6])) {echo("");} else {echo("checked");}
    ?>
    >
    </td>
    <?php
    }
    ?>
    Dabei wird bei Klick auf die angezeigte Checkbox ein anderes Skript abgearbeitet, dass einen Haken in der DB setzt oder den Haken wieder löscht und nach Abschluss der Prozedur gelangt man wieder auf die Aufgabenübersicht zurück, was alles wunderbar funktioniert:

    PHP-Code:
    <?php    //Update des erledigt Buttons auf der todo.php Seite
    include("head.php");
    include(
    "mysqlconst.php");

    $con mysql_connect($db_host$db_user$db_pass);

        if (isset(
    $_GET['Datum']) && $_GET['Datum'] != "")
        {
            
    $erledigt $_GET['Datum'];
            
    $erledigt 'NULL';
        }
        else
        {
            
    $timestamp time();
            
    $erledigt '"' date("Y-m-d",$timestamp) . '"';
        }

        
    $sql =  'UPDATE todo_aufgabe SET' .
            
    ' erledigtdatum = ' $erledigt .
            
    ' WHERE ID_aufgabe = ' $_GET ['ID_aufgabe'];
        
    $update mysql_query($sql$con);
        
    mysql_close($con);
    ?>

    <html>
    <head>
        <script type="text/javascript" >
            window.location.href = "todo.php";
        </script>
    </head></html>

    FRAGE:
    Was können wir tun, damit der URL nicht mit unnötigen Infos wie "....&erledigt=on&erledigt=on&erledigt=on&erledigt =on&erledigt=on&erledigt=on&erledigt=on&erledigt=o n&erledigt=on&erledigt=on&erledigt=on&erledigt=on. ......" zugemüllt wird?

    Anmerkung:
    Eine Umstellung des forms auf POST ist leider nicht möglich weil wir auch mehrere Sortierungsmöglichkeiten anbieten, die mittels GET übergeben werden.
    Angehängte Dateien


  • #2
    Wieso nochmal ist eine Kombi aus POST- und GET nicht möglich...?

    Aber mal davon ab, da ist was konzeptuell völlig falsch. Ich erkenne allerdings noch nicht wie genau eure Application aufgebaut ist. Klar ist aber, ihr müsst wohl kaum 2000 Checkbox-Zustände übergeben - warum auch immer ihr das macht, es ist mit Sicherheit nicht notwendig.

    In der Übersicht wird jeder Eintrag angezeigt, u.a. mit der Spalte checkbox erledigt. Klappt auch alles wunderbar.
    Also 2000 Einträge? Keine Pagination?!

    Kommentar


    • #3
      Datenbankwat?

      Was können wir tun, damit der URL nicht mit unnötigen Infos wie "....&erledigt=on&erledigt=on&erledigt=on&erle digt =on&erledigt=on&erledigt=on&erledigt=on&erledigt=o n&erledigt=on&erledigt=on&erledigt=on&erledigt=o n. ......" zugemüllt wird?
      Kommt da denn auch irgendwann mal ein "erledigt=off"? Ihr könntest die "on"s und "off"s mit irgendwelchen Zeichen abgrenzen, dadurch einen einzelnen String als Parameter übergeben und nach der Übergabe wieder trennen ums weiter zu verarbeiten.

      Anmerkung:
      Eine Umstellung des forms auf POST ist leider nicht möglich weil wir auch mehrere Sortierungsmöglichkeiten anbieten, die mittels GET übergeben werden.
      Wenn du das genauer beschreibst, könnte man vielleicht eine Alternative anbieten.


      So spontan, nicht wirklich nachvollziehend wie diese Situation entstand, sondern nur "todo-liste" lesend, schreit in mir alles nach Ajax.

      Standardtext für die Datenbankverbindung:
      Die mysql_* Erweiterung ist veraltet und wird in der nächsten PHP-Version entfernt. Zudem ist deine Query anfällig für SQL-Injections.
      Durch einen Wechsel auf mysqli_* oder PDO greifst du aufdie modernere API zu und hast die Möglichkeiten Prepared Statements zu benutzen die gegen Injections wirken.
      Ich persönlich bevorzuge PDO, schönes Tutorial: http://www.peterkropff.de/site/php/pdo.htm
      Relax, you're doing fine.
      RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

      Kommentar


      • #4
        Wir bieten Filter und Sortierungen für die Liste an, deren Parameter über den URL übergeben werden.
        Filter: "Offene Todo's", ""Alle Todo's" und "Erledigte Todo's"
        Sortierung: Jede Spalte kann desc und asc sortiert werden
        Übergabe in URL: http://DOMAIN/todo/todo.php?spalte=1...&todoreportx=1

        Ich kann hier leider keinen Screenshot posten, um es anschaulicher zu zeigen.

        Pagination haben wir uns auch schon überlegt. Aber dann hat man halt nicht 1.000 &erledigt=on sondern nur 50. Auch nicht schön.

        Die mysqli-Variante schauen wir uns nochmal an, danke!

        Wie geht ein "erledigt=off"? Ich weiss ja nicht mal, wo das erledigt=on genau herkommt.
        Wir sind leider nur Anfänger. Bitte um eure Erklärung "Für Dummies".
        JavaScript oder gar AJAX sagt mir leider nur vom hörensagen etwas.

        Kommentar


        • #5
          Pagination haben wir uns auch schon überlegt. Aber dann hat man halt nicht 1.000 &erledigt=on sondern nur 50. Auch nicht schön.
          Ist im Grunde Pflicht, keine "Überlegung".

          Mir ist dennoch nicht klar warum die URL die Status der Checkboxen als GET-Parameter mit sich tragen muss. Kannst du dafür ein minimalisiertes Beispiel geben?

          Kommentar


          • #6
            Ja, genau das ist mein Problem: wir brauchen diese checkbox-Parameter nicht in der URL. Ich weiss nur nicht, wie sie da rein kommen und wie wir sie raus bringen.

            Ich hab oben noch einen Screenshot gepostet zur Visualisierung.

            Kommentar


            • #7
              Im ersten von dir geposteten PHP-Code nutzt du ein Form-Element:
              PHP-Code:
              <input type="checkbox" disabled="true" name="erledigt"<?php if (empty($row[6])) {
              Kannst du das dazugehörige öffnende Form-Tag bitte posten? Also <form ... >

              Kommentar


              • #8
                Wie geht ein "erledigt=off"? Ich weiss ja nicht mal, wo das erledigt=on genau herkommt.
                Wir sind leider nur Anfänger. Bitte um eure Erklärung "Für Dummies".
                JavaScript oder gar AJAX sagt mir leider nur vom hörensagen etwas.
                Dann macht Euch schlau. Sich die Grundlagen draufschaffen vor dem Projekt ist erste Bürgerpflicht. Auch hier im Forum.

                Lerne Grundlagen | Quellensammlung

                [MOD: Thread geschlossen]
                --

                „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                --

                Kommentar

                Lädt...
                X