Ankündigung

Einklappen
Keine Ankündigung bisher.

Mit Checkboxen Datenbankausgaben auswählen

Einklappen

Neue Werbung 2019

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

  • Mit Checkboxen Datenbankausgaben auswählen

    Hallo,
    ich habe ein Problem bei dem ich mal wieder nicht weiter komme und die Hilfe von Experten benötige...
    Ich habe eine Datenbank in der Nahrungsmittel stehen, zusammen mit einem Kalorienwert und dem entsprechenden Gewicht dazu. Ich lese diese Werte nun aus und zeige sie auf einer Site an. Jetzt möchte ich einzelen Werte auswählen können (mit einer Checkbox) und evtl. die Kalorienwerte und/oder die Gewichtswerte verändern und diese ausgewählten Werte dann mit einem Button an eine Datenbank schicken.
    Das auslesen funktioniert soweit. Wenn ich jetzt aber den Senden-Button drücke, ohne dass ich was ausgewählt habe, werden natürlich die Werte die in meinen Textfeldern stehen gesendet, ohne dass ich eine Checkbox aktiviert habe.
    Ich denke mir das ich irgendeine Funktion (JavaScript?) benötig, um das Problem zu lösen. Ich weiß nur nicht wie...
    Vl kann mir von euch jemand einen Tipp geben oder unter die Arme greifen.
    Hier mal den Code den ich bis jetzt habe:

    PHP-Code:
    require '../inc/db6.inc.php';




    $sql = "SELECT * FROM vorgabe ORDER BY bezeichg ASC";

    $db_erg = mysqli_query( $db6, $sql );
    if ( ! $db_erg )
    {
      die('Ungültige Abfrage: ' . mysqli_error());
    }
    ?>

    <form action="test.html" method="get">
    <?php

    while ($zeile mysqli_fetch_array$db_ergMYSQL_ASSOC))
    {
    ?>
    <label for="check1">
    <input type="checkbox" name="abc[]" value="<?php echo $zeile['bezeichg'?>" id="check1"><?php echo $zeile['bezeichg']?></input>
    <input type="text" name="abc[]" value="<?php echo $zeile['gewicht'?>"></input>
    <input type="text" name="abc[]" value="<?php echo $zeile['kcal'?>"></input>
    <br>
    </label>
    <?php
    }
    mysqli_free_result$db_erg );
    ?>
    <br>
      <input type="submit" value="Ausf&uuml;hren" ></input>
    </form>
    VG Sascha

  • #2
    Hallo noch mal,

    scheinbar versteht niemand was ich genau will.... deshalb erkläre ich es nochmals, habe auch gesehen, dass wahrscheinlich wichtige Informationen oben fehlen.
    Ich würde gern aus einer Datenbank Nahrungsmittel auslesen. Die Tabelle heißt vorgabe und hat folgende Spalten: id, bezeichg, gewicht, kcal
    Ich lese die Daten aus und schreibe das gewicht und die kcal als Vorgabe/Vorbelegung in ein Eingabefeld (damit ich sie b.B. auch ändern kann). Soweit so gut.
    Jetzt möchte ich mit einer Checkbox bestimmte Nahrungsmittel auswählen und diese in einer Datenbank speichern. Das bekomme ich auch noch hin. Mein Problem ist aber, dass wenn ich den Ausführen-Button drücke, werden die Werte aller Input-Felder gesendet.
    Wie bekomme ich es hin, dass ich mit einer Checkbox mehrere Felder, sagen wir, verknüpfen kann? Oder anders gesagt, wie stelle ich es an, dass ich verschiedene Input-Felder EINER Checkbox zuordnen kann?

    Vielleicht ist es jetzt etwas klarer und ich bekomme jetzt einen Tipp oder eine Idee von jemandem.
    VG Sascha

    Kommentar


    • #3
      <input type="checkbox" name="abc[]" value="<?php echo $zeile['bezeichg'] ?>" id="check1"><?php echo $zeile['bezeichg']?></input>
      <input type="text" name="abc[]" value="<?php echo $zeile['gewicht'] ?>"></input>
      <input type="text" name="abc[]" value="<?php echo $zeile['kcal'] ?>"></input>
      Schon "fast" richtig...

      Gespeichert wird NUR, wenn eine Checkbox angehakt wurde.
      JEDES zusammengehörige Produkt bekommt DEN GLEICHEN Schlüssel (aber die Namen der Felder lauten unterschiedlich). So ungefähr:
      Code:
      <input type="checkbox" name="check[1]" value="1"></input>
      <input type="text" name="gewicht[1]" value="<?php echo $zeile['gewicht'] ?>"></input>
      <input type="text" name="kcal[1]" value="<?php echo $zeile['kcal'] ?>"></input>
      Dh. im POST stehen nachher DREI arrays "check", "gewicht" und "kcal". Jedes Produkt benutzt den gleichen Key (1 in diesem Fall). Das kann z.B. ein Primärschlüssel der Datenbank sein...

      Iteriere über POST['check'] (mit "key" und "value"). Anmerkung: Checkboxen werden nur übertragen, wenn sie angehakt wurden, du wirst also NIEMALS eine nicht angehakte Checkbox bekommen.
      Du findest also im "value" die 1 - nun nimm den "key" und schaue damit in den arrays POST['gewicht'] und POST['kcal'] nach, ob unter dem "key" auch ein braachbarer Text übertragen worden ist.
      Wenn alles stimmig ist, kann due diese Werte abspeichern.
      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

      Kommentar


      • #5
        Hallo lstegelitz,

        ich bräuche nochmals Hilfe

        Ich habe jetzt bei einer aktivierten Checkbox über folgendes

        Code:
        foreach($_POST['check'] as $var => $value) { echo $var . ' = ' . $value. "<br>"; }
        foreach($_POST['gewicht'] as $var => $value) { echo $var . ' = ' . $value. "<br>"; }
        foreach($_POST['kcal'] as $var => $value) { echo $var . ' = ' . $value. "<br>"; }
        folgende Ausgabe hin bekommen:

        Code:
        47 = 1   // 47 ist der Wert den ich mit name="<?php echo $zeile['id']?>]" übertragen habe und 1 habe ich mit  value="1" übertragen
        47 = 20  // 47 ist der Wert den ich mit name="<?php echo $zeile['id']?>]" übertragen habe und 20 habe ich mit  value="<?php echo $zeile['gewicht']?>]" übertragen
        47 = 124  // 47 ist der Wert den ich mit name="<?php echo $zeile['id']?>]" übertragen habe und 124 habe ich mit  value="<?php echo $zeile['kcal']?>]" übertragen
        Das ist ja schon mal schön, aber leider ja nur eine Anzeige.
        Doch wie kann ich jetzt diese Werte weiter verarbeiten?
        Wie bekomme ich es hin, dass wenn
        <?php echo $zeile['id']?>] den Wert "1" hat, ich die Werte aus dem Array gewicht und kcal speichern kann?
        Wie mache ich es, wenn ich mehrere Checkboxen aktiviert habe und die Werte trennen muss?
        Für weitere Anregungen wäre ich echt dankbar.

        VG Sascha

        Kommentar


        • #6
          Wie gesagt: Du iterierst über das "check" Array (dort stehen ohnehin nur die angehakten Checkboxen), dann schaust du unter dem Schlüssel nach, ob in "gewicht" und "kcal" ebenfalls Werte eingetragen sind
          PHP-Code:
          foreach($_POST['check'] as $var => $value) {       
              
          $gewicht '';     
              
          $kcal '';     
              if (isset(
          $_POST['gewicht'][$var]) && isset($_POST['kcal'][$var])) {         
                  
          $gewicht $_POST['gewicht'][$var];         
                  
          $kcal $_POST['gewicht'][$var];                  

                  
          // Daten sind schonmal vorhanden, jetzt musst du einen Sanity-Check machen, z.B.         
                  
          if (!is_numeric($gewicht) || intval($gewicht) <= 0) {              
                      
          // Gewicht war entweder keine Zahl, oder kleinergleich 0         
                  
          }     
              }  

          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

          Kommentar


          • #7
            Hallo lstegelitz,

            Ich gebe es zu... ich habe ein Problem mit Array's

            Aber, mittlerweile habe ich es dann doch hinbekommen:
            PHP-Code:
            if (isset($_POST['check']))
            {
            foreach(
            $_POST['check'] as $k=>$v)
                   {
                   
            $bezeichg htmlentities($_POST["bezeichg"][$k]);
                   
            $gewicht htmlentities($_POST["gewicht"][$k]);
                   
            $kcal htmlentities($_POST["kcal"][$k]);

                   
            $eintragen mysqli_query($db6"INSERT INTO verzehr (bezeichg,gewicht,kcal)
                                                               VALUES ( '"
            .$bezeichg."', '".$gewicht."', '".$kcal."' )");
                   }

            Weiß zwar nicht ob es so okay ist, aber es funktioniert schon mal
            Die Daten/Werte der angeklickten Checkboxen werden in die DB geschrieben.

            Jetzt habe ich "natürlich" ein neues Problem (auf eine Lösung scheint immer ein neues Problem zu kommen )

            Ich möchte gern vor dem Senden der Werte aus den Input-Feldern eine Berechnung durchführen und diese dann senden. Das scheint mir nur per JavaScript zu gehen, habe auch schon mal was probiert. Mit statischen Werten funktioniert es auch, aber mit dem Array bekomme ich's mal wieder nicht hin.
            Hier mal mein Code:
            PHP-Code:
            <script type="text/javascript">
                  <!--
                    function form_calculate()
                    {
                        var gewicht        = Number(document.getElementById('gewicht[<?php echo $zeile['id']?>]').value);
                        var kcal              = Number(document.getElementById('kcal[<?php echo $zeile['id']?>]').value);
                        var resultField   = document.getElementById('result');
                        var result        = gewicht*kcal;
                        resultField.value = result;
                    }
                -->
                </script>
              </head>
              <body>

            <form action="" method="POST">
            <?php
            while ($zeile mysqli_fetch_array$db_ergMYSQL_ASSOC))
            {
            ?>
                   <input type="number" name="gewicht[<?php echo $zeile['id']?>]" value="<?php echo $zeile['gewicht'?>" id="gewicht[<?php echo $zeile['id']?>]" onkeyup="form_calculate();"></Input>
                   <input type="number" name="kcal[<?php echo $zeile['id']?>]" value="<?php echo $zeile['kcal'?>" id="kcal[<?php echo $zeile['id']?>]" onkeyup="form_calculate();"></Input>
                <br>
                    <input type="text" name="result" id="result"><br>
            <?php
            }
            mysqli_free_result$db_erg );
            ?>
                 <input type="submit" value="Speichern" ></input>
                </form>
            Funktionieren tut's so, aber nur bei dem ersten Durchlauf der Schleife... Wie binde ich das JavaScript zusammen mit der Schleife ein?
            Kannst du mir hier vielleicht nochmal helfen?

            VG
            Sascha

            Kommentar


            • #8
              Zunächst einmal darf die id "result" Dokumentenweit nur einmal vorkommen. Du erzeugst das Feld in einer Schleife mehrfach.

              Javascript, HTML und PHP sollten nicht gemischt werden.

              Der Block mit dem Javascriptcode steht ausserhalb der Schleife, die PHP Variable $row ist dort unbekannt. Schau in den generierten HTML Quelltext, dann müsstes das direkt auffallen...
              Lösung: Du musst die JS-Funktion allgemeingültig umschreiben und die notwendingen Informationen per Parameter übergeben (also beim Aufruf der Funktion).
              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

              Kommentar


              • #9
                PHP-Code:
                if (isset($_POST['check']))
                {
                foreach(
                $_POST['check'] as $k=>$v)
                       {
                       
                $bezeichg htmlentities($_POST["bezeichg"][$k]);
                       
                $gewicht htmlentities($_POST["gewicht"][$k]);
                       
                $kcal htmlentities($_POST["kcal"][$k]);

                       
                $eintragen mysqli_query($db6"INSERT INTO verzehr (bezeichg,gewicht,kcal)
                                                                   VALUES ( '"
                .$bezeichg."', '".$gewicht."', '".$kcal."' )");
                       }

                htmlentities ist hier nicht richtig, schau dir an was die Funktion macht.

                Du musst bevor du Daten in die DB Tabelle einträgst prüfen ob die Werte dem Datentyp und Wertebereich entsprechen.
                Du kannst ja nicht in ein Datentyp tinyint beipielsweise die Zahl -345669868 eintragen, das geht nicht.
                Gewöhne dir das gleich von Anfang an, richtig zu machen, dann hast du hinterher weniger Probleme und Fehlerquellen.

                Das musst du machen bevor du die Daten durch mysqli_real_escape_string zum maskieren vorbereitest. Erst danach kannst du die Werte nehmen und in die DB eintragen.

                Du kannst dir das maskieren sparen, wenn du prepared statement verwendest.

                Du solltest bei mysql auch immer die Backtcks für die Spaltennamen verwenden. Also `verzehr` `gewicht` usw.

                Kommentar


                • #10
                  Hallo,

                  @istegelitz: das mit der id "result" bekomme ich wahrscheinlich in den Griff mit der Hinzufügung von "$zeile['id']" Muss der Block mit dem Javascriptcode in die Schleife oder kann ich aus der Schleife heraus auf den Code zugreifen und springe anschließend wieder zurück in die Schleife? Leider kann ich mir jetzt nicht vorstellen wie es weiter gehen soll. Ich bin totaler Anfänger in Bezug auf JavaScript und ein Anfänger in PHP. Hast du vielleicht ein Beispiel wie das aussehen könnte? Bei dir klingt das alles so einfach...

                  @protestix: prepared Statement habe ich in einem anderen Projekt schon mal realisiert und bin dabei es auch hier jetzt zu tun. Das mit den Backticks hattest du mir glaube ich schon mal gesagt Du hast recht, man sollte es von Anfang an richtig machen...
                  Sobald mein JavaScript läuft, werde ich es nacharbeiten.. oder besser ich mach's gleich.

                  Leider ist meine Zeit sehr beschränkt, deshalb kann es schon mal etwas dauern bis ich hier eine Antwort schreibe. Bitte nehmt es mir nicht übel, wenn es auch so aussehen kann, als hätte ich nicht wirklich Interesse an einer Lösung. Ich wäre echt froh es ginge bei mir weiter.
                  Vielen Dank schon mal für eure Hilfe!

                  VG
                  Sascha

                  Kommentar

                  Lädt...
                  X