Ankündigung

Einklappen
Keine Ankündigung bisher.

Formularproblem mit Checkboxen

Einklappen

Neue Werbung 2019

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

  • Formularproblem mit Checkboxen

    Hallo zusammen, da ich seit gestern an einem Problem knobele und damit nicht weiterkomme, hab ich mich hier angemeldet, in der Hoffnung, das mir hier jemand vielleicht das Brett vorm Kopf wegnimmt,

    Kurz, worum es mir geht. Ich hat eine MYSQL-Datenbank mit Bildinformationen, aus der ich gerne in zwei Schritten bestimmte Datensätze herausfiltern möchte...

    Schritt eins ist mittels eines HMTL-Formulars eine erste Vorauswahl zu treffen nach den Kriterien Aufnahmeort und Aufnahmezeitraum, das hab ich auch hinbekommen.

    Das ist das Ergebnis von Schritt eins, ausgegeben wird die bildnr und jeweils davor eine checkbox gesetzt, womit ich die weitere Auswahl treffen und die dann per Formular weitergeben möchte.

    <form action='tierbilder1.php' method ='post'>
    <?php
    $ergebnis=mysql_query($anfrage) or die ("Fehlermeldung=".mysql_error());
    echo "<p>Gefundene Tiere: ";
    echo mysql_num_rows($ergebnis)."</p>";

    echo "</p>";
    echo"<table border='1' width='90 %'>";
    echo "<th>Auswählen</th><th>Tiernr.</th>";
    for ($i=0;$i<mysql_num_fields($ergebnis);$i++) ;
    while ($row=mysql_fetch_assoc($ergebnis))
    { echo "<tr align='center'>";
    echo '<td><input type="checkbox" name="bildauswahl" value='.$row['bildnr'].'></input></td>';
    echo '<td><input type="text" name="bildnr" value='.$row['bildnr'].'></input></td><tr>';}
    echo '<tr><td><input type="submit" value="Abfrage"></input></td>';
    echo '<td><input type="reset"
    value="Zur&uuml;cksetzen"></input><td></tr>';
    </table>
    ?>
    </form>

    Bis hierher funktioniert das so wie gedacht.

    Das ist der Textauszug von tierbilder1.php.

    <?php

    $anfrage="SELECT DISTINCT b.bildnr FROM bilder b,
    where b.bildnr = ('$_POST[bildauswahl]')
    group by b.bildnr order by b.bildnr ";

    $ergebnis=mysql_query($anfrage) or die ("Fehlermeldung=".mysql_error());

    echo "<p>Gefundene Tiere: ";
    echo mysql_num_rows($ergebnis)."</p>";

    echo "</p>";
    echo"<table border='1' width='90 %'>";
    echo "<th>Auswählen</th><th>Tiernr.</th>";
    for ($i=0;$i<mysql_num_fields($ergebnis);$i++) ;
    while ($row=mysql_fetch_assoc($ergebnis))
    { echo "<tr align='center'>";
    echo '<td>'.$row['bildnr'].'</td></tr>';}

    echo "</tr>";
    echo "</table>";

    mysql_free_result($ergebnis); mysql_close();
    ?>

    Leider erfolgt die Auswertung hier nicht wie erwünscht. Das Problem ist, das immer nur der Datensatz mit der höchsten Nummer als Ausgabe angezeigt wird, auch wenn ich vorher mehrere Checkboxen angeklickt hab, irgendwas scheint also mit dem Namen oder dem Value der Checkbox nicht zu stimmen. Der Name der Checkbox ist ja immer der gleiche, ich vermute, das es daran liegt, weiß aber nicht, wie ich den z. B. über eine Variable im oberen Script vergeben und im unteren Script abfragen kann, vielleicht würde dieses mein Problem lösen.

    Ich würde mich freuen, wenn jemand eine Idee hätte, die das Problem löst...

  • #2
    Bitte packe Quelltext in die dafür vorgesehenen FORM-TAGS.
    Du musst die Übergabe der Checkbox als Array definineren, damit alle Felder berücksichtigt werden können.
    PHP-Code:
    echo '<td><input type="checkbox" name="bildauswahl[]" value='.$row['bildnr'].'></input></td>'
    Schau dir dann mal dein $_POST-Array beim Start des Skriptes "tierbilder1.php" an.

    Kommentar


    • #3
      wichtig wäre noch, Checkboxen, die nicht angekreuzt sind, werden GAR NICHT übermittelt, von daher würde ich Nullraffs Array-Lösung dadurch ergänzen, dass du die Array-Key explizit vorgibst - dann lassen sich Lücken leichter erkennen

      Wenn du keine Lücken haben willst, kannst du VOR jeder Checkbox ein hidden-Feld erstellen, dass das gleiche Name-Attribut hat, wie die Checkbox (jetzt MUSST du die Array-Schlüssel fest vorgeben). Aufgrund der Arbeitsweise von HTML.Formularen werden (in den Post-Daten) die Werte mit dem gleichen Namen immer überschrieben

      Also zuerst das Hidden-Feld, ist dann die Checkbox nicht angekreuzt, bleibt das Hidden-Feld (bzw dessen Value-Eintrag) drin stehen. Ist die Checkbox angekreuzt, wird der Post-Eintrag mit dem Value der Checkbox überschrieben

      Kommentar


      • #4
        Dein Query geht aber mal ganz böse in die hose, denn:
        Code:
        SELECT DISTINCT b.bildnr FROM bilder b, 
        where b.bildnr = ('$_POST[bildauswahl]') 
        group by b.bildnr order by b.bildnr
        Ist weit weg von dem wie es sein sollte.
        Code:
        SELECT bildnr FROM bilder
        WHERE bildnr IN ( ".join(",", $selections)." )
        GROUP BY bildnr ORDER BY bildnr
        denn DISTINCT regelt nur das selects automatisch limitert werden die auf das ganze selection-set bezogen werden ( alle Felder des SELECTs ). Du gehst dann nochmal hin und gruppierst dann nach dem selben feld, das ist SK(otze)L *hust*

        Überdenk dein Query, entweder du Gruppierst nach einem Feld, oder du DISTINCTest ein oder mehrere Felder die du SELECTen willst.

        Meine Überarbeitung setzt voraus das du ein array $selections erzeugst aus den reinkommenen POST-Daten. Was in etwa so (einfach) geht:
        PHP-Code:
        if ( isset($_POST['bildauswahl']) ) {
           
        $selections = array();
           if ( 
        is_array($_POST['bildauswahl']) )
              foreach ( 
        $_POST['bildauswahl'] as $bild $selections[] = (string)(int)$bild;

           
        /* query after here */

        Von SQL-Injection fang ich jetzt garnicht erst an

        Kommentar


        • #5
          Zitat von tr0y Beitrag anzeigen
          Von SQL-Injection fang ich jetzt garnicht erst an
          Jo, die C99 Tester wollen auch was zu tun haben.

          Kommentar


          • #6
            Ups, da bin ich ja direkt unangenehm aufgefallen durch die Nichtverwendung der Code-Tags, , und das meine "Programmierkünste" für Experten zum Davonlaufen sind, ist mir klar, für mich ist das alles ein notwendiges Übel bzw. Mittel zum Zweck und ich bin froh, wenn ich das halbwegs zum Laufen bekomme, denn eigentlich möchte ich mich ja mit Flußpferden befassen und nicht mit Programmierung.

            Vielen Dank für die Hilfe, einen Schritt bin ich damit schon mal weiter, aber leider noch nicht am Ziel

            Nach Tierbilder.php werden jetzt die ausgewählten Daten übertragen, lag an den fehlenden eckigen Klammern im vorherigen Formular beim Checkbox-Name.

            Jetzt komme ich aber bei der Abfrage nicht weiter
            PHP-Code:
            $anfrage "SELECT DISTINCT b.bildnr FROM bilder b
                       where  b.bildnr = ('
            $_POST[bildauswahl]'); 
            da müßte ich ja`in der where-Klausel die Werte des $_POST-Arrays angeben, aber so kommt gar nichts dabei heraus und was anderes fällt mir nicht ein bzw. hab einiges ausprobiert und im web gesucht, aber nichts klappte bzw gefunden...

            Wäre froh, wenn Ihr mir noch mal helfen könntet...

            Kommentar


            • #7
              Irgendwas an meinem Vor-Post nicht verstanden oder ganz ignoriert ... ?

              Kommentar


              • #8
                Zitat von tr0y Beitrag anzeigen
                Irgendwas an meinem Vor-Post nicht verstanden oder ganz ignoriert ... ?
                Natürlich nicht ignoriert, bin doch auf meine "Programmierkünste" eingegangen und für jede Hilfe dankbar...

                Hab Deine Hilfestellung gestern auch ausprobiert, aber hab erst mal die geschweifte Klammer hinter dem Kommentar ignoriert, daher kam da nix bei rum,

                Sicherheitshalber, damit wir nicht aneinander vorbei reden (ich weiß nicht, ob ich das sprachlich immer richtig darstelle), noch mal der Code

                PHP-Code:
                if ( isset($_POST['bildauswahl']) ) {
                   
                $selections = array();
                   if ( 
                is_array($_POST['bildauswahl']) )
                      foreach ( 
                $_POST['bildauswahl'] as $bild $selections[] = (string)(int)$bild;

                $anfrage "SELECT bildnr FROM bilder
                WHERE bildnr IN ( "
                .join(","$selections)." )
                GROUP BY bildnr ORDER BY bildnr "
                ;

                $ergebnis=mysql_query($anfrage) or die ("Fehlermeldung=".mysql_error());
                }; 
                Problem ist jetzt, das im $selections-Array nicht die richtigen Werte angezeigt werden sondern immer null.

                Das abgefragte Datenbankfeld ist allerdings auch nicht "int", sondern "varchar", weil sich die bildnr aus Buchstaben und Zahlen zusammensetzt. Hab ich oben in der foreach-Schleife einfach int durch varchar ersetzt, aber dann bekomme ich eine Fehlermeldung unexpected T_VARIABLE .

                Wie bekomme ich das jetzt hin, das ins $selections-Array die richtigen Werte geschrieben werden?

                Kommentar


                • #9
                  nee .. int durch varchar ersetzen bringt es nicht, denn PHP kennt zwar den Datentyp int, aber kein varchar - lass einfach sowohl (string) als auch (int) dort oben weg, foreach kommt von sich aus mit allem zurecht, der durchläuft einfach alle Elemente des Arrays - und in der gebauten Abfrage noch eine kleine Änderung

                  PHP-Code:
                  if ( isset($_POST['bildauswahl']) ) {
                     
                  $selections = array();
                     if ( 
                  is_array($_POST['bildauswahl']) )
                        foreach ( 
                  $_POST['bildauswahl'] as $bild $selections[] = $bild;

                  $anfrage "SELECT bildnr FROM bilder
                  WHERE bildnr IN ( '"
                  .join("' , '"$selections)."' )
                  GROUP BY bildnr ORDER BY bildnr "
                  ;

                  $ergebnis=mysql_query($anfrage) or die ("Fehlermeldung=".mysql_error());
                  }; 
                  - im Zweifel lass dir zwischen foreach und der $anfrage mal das Array $selections per var_dump ausgeben - und natürlich die erzeugte Abfrage

                  Kommentar


                  • #10
                    Perfekt, so funktioniert es,

                    Vielen Dank...

                    Kommentar


                    • #11
                      Überhaupt nicht perfekt. Validierung fehlt total. Sowohl SQL-Injection als auch das Verabeiten von nicht vorgesehenen Auswahlfeldern in der Abfrage sind durch Manipulation des Requests möglich.

                      ! mysql_real_escape_string oder (int) Casting
                      ! Validierung der Eingabemenge gegen eine serverseitige Auswahl-Vergleichsmenge

                      Kommentar


                      • #12
                        Na ja, wie gesagt, auf Schönheitspreise bin ich nicht scharf, für mich ist wichtig, das es seinen Zweck erfüllt und das tut es... Alleine wäre ich da erst mal nicht hinter gekommen, und daher freut es mich, mit Hilfe des Forums weitergekommen zu sein, das ist für mich so erst mal perfekt...

                        Aber wenn natürlich jemand die bisherige Lösung noch verbessern möchte, freue ich mich natürlich noch mehr, ich möchte nur nicht so unverschämt sein, andere meine Arbeit machen zu lassen und freue mich daher übers Minium (funktioniert), wenn ich mal irgendwann Zeit habe, werde ich sicher versuchen, noch Verbesserungen zu erzielen...

                        Kommentar


                        • #13
                          Sicherheit ist keine Schönheitsdiskussion. 3 Stichwörter habe ich genannt. Die darfst DU gerne auch mal selbst nachschlagen.

                          Kommentar

                          Lädt...
                          X