Ankündigung

Einklappen
Keine Ankündigung bisher.

Input - Array

Einklappen

Neue Werbung 2019

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

  • Input - Array

    Ich möchte in einem Formular Daten erfassen. Die Anzahl der Eingabefelder ergibt sich jedoch aus vorherigen Eingaben, es könnten z.B. 10 oder auch 25 sein.

    Mein Versuch:

    PHP-Code:
    echo "<form action = 'db_auswertung.php' method = 'post'> ";

           for (
    $i=0$i<=$anzahl-1$i++)
           {
               echo 
    "Ort: " $ort[$i] . " - Antwort: " "<input name='antwort[$i]' >" "<br>";
           }

           echo 
    "<br><input type = 'submit'> </form>"
    In der Datei db_auswertung.php möchte ich dann die Variablen $ort[$i] und antwort[$i] weiter nutzen.

    Ich habe versucht, mittels einer Schleife mit $_POST['anwort[$i]'] die Variabel aufzurufen bzw. einer anderen Variablen zuzuweisen. Das habe ich nicht hinbekommen.



    Die Variabel $ort[$i] möchte ebenfalls weiterverwenden. Ich vermute, dass ich, wenn ich weiß, wie ich die Input-Funktion als array nutzen und mit einem Post-Befehl wieder aufrufen kann, die Variabel $ort[$i] mit der Funktion input type = hidden ebenfalls übertragen bekomme.

    Kann mir bitte jemand sagen, wie man input und post mit einem array nutzen kann?

  • #2
    $_POST['antwort'] ist doch so bereits ein Array, über dass du auf der Zielseite mit einer (foreach)-Schleife laufen kannst.
    Das mit dem $i im Input name kannst du dir jedoch sparen.

    Den Ort kannst du zwar, wie du schon selber schreibst, als String in einem Hidden Field übergeben:

    PHP-Code:
    <input type="hidden" name="ort" value="<?= implode(','$ort?>">
    und auf der Zielseite dann wieder mit explode() ein Array draus machen. Aber da gibt es bessere Wege, als das über das Formular mitzuschleifen.
    (z.B. über die Session oder aus der DB laden)

    Edit: Oder du verwendest den Ort gleich als Key im Input-Array:
    PHP-Code:
    echo "Ort: " $ort[$i] . " - Antwort: " "<input name='antwort[" $ort[$i] . "]' >" "<br>"
    Dann hast du auf der Zielseite direkt die Antwort zum jeweiligen Ort:
    Code:
    array(3) {
      ["DDF"]=>
      string(8) "antwort1"
      ["Neuss"]=>
      string(8) "antwort2"
      ["MG"]=>
      string(8) "antwort3"
    }
    sorry, shift-taste kaputt

    Kommentar


    • #3
      Danke! Ich habe mich für die Variante entschieden:

      PHP-Code:
      echo "Ort: " $ort[$i] . " - Antwort: " "<input name='antwort[" $ort[$i] . "]' >" "<br>"
      Ich bekomme das mit der foreach-Schleife nicht hin.

      Mittels:
      PHP-Code:
      echo '<pre>';
         
      print_r($_POST);
         echo 
      '</pre>'
      bekomme ich auf der Zielseite angezeigt, dass die Daten richtig übergeben werden und ankommen.

      Das Ergebnis sieht ungefähr so aus:

      Code:
      Array
      (
      [antwort] => Array
      (
      [Essen] => 43678
      [Gelsenkirchen] => 45899
      [Recklinghausen] => //hier wurde nichts eingegeben
      )
      )

      Ich bekomme es aber nicht hin, dass ich das Ergebnis von input('name') und $ort($i) wieder in einzelne Variablen übertrage, um sie dort weiterzuverarbeiten. Als Ergebnis möchte ich z.B. $name[$i] und $ort[$i] haben.

      Kannst du mir bitte noch einmal mit der Schleife weiterhelfen?

      Kommentar


      • #4
        Das könntest du theoretisch mit array_values() und array_keys() aus $_POST['antwort'] wieder extrahieren.
        Aber warum einzelne Variablen und nicht das Array direkt weiterverarbeiten?
        sorry, shift-taste kaputt

        Kommentar


        • #5
          Ich habe angenommen, dass ich mit einer einfachen Schleife (z.B for) die Eingaben nacheinander wieder abrufen und einzelnen Variablen zuordnen kann. Das habe ich mir einfach vorgestellt.


          Ich habe eine Datenbank erstellt (bin dabei) mit deutschen und englischen Vokabeln, Vokabelart, Häufigkeit des Aufrufs, Häufigkeit der fehlerhaften Eingabe beim Test, …

          Im ersten Formular wird angegeben, aus welcher Unit die Vokabeln aufgerufen werden sollen und wie viele.

          Im zweiten Formular werden alle Variablen, die die Vorgabe erfüllen, aus einer Datenbank ausgelesen und Variablen zugeordnet (z.B. $deutsch[$i], $englisch[$i], … Dann wird mit shuffle() das Ergebnis gemischt und die gewünschte Anzahl mittels random_int() einer neuen Variable, z.B. $deutschtest[$i], zugewiesen. Später soll die Auswahl noch durch die Anzahl der früheren Fehler beeinflusst werden; da weiß ich aber noch nicht wie.

          Im dritten Formular sollen jetzt die Eingaben aus dem zweiten Formular ausgewertet werden. Und hier komme ich nicht weiter, weil ich Einzelwerte nicht einzelnen Variablen zuweisen kann. Eventuell muss ich ja auch noch die Datenbank untersuchen, ob das Ergebnis nicht doch richtig ist, weil es mehrere Möglichkeiten als Antwort geben kann.

          Ich werde jetzt versuchen zu finden, wie die Syntax von "
          array_values() und array_keys() aus $_POST['antwort']
          aussieht.

          Kommentar


          • #6
            Im zweiten Formular werden alle Variablen, die die Vorgabe erfüllen, aus einer Datenbank ausgelesen und Variablen zugeordnet (z.B. $deutsch[$i], $englisch[$i], … Dann wird mit shuffle() das Ergebnis gemischt und die gewünschte Anzahl mittels random_int() einer neuen Variable, z.B. $deutschtest[$i], zugewiesen.
            Hol dir doch gleich Zufällige direkt aus der DB... Versuch mal sowas https://davidwalsh.name/mysql-random

            Und nachdem du die Übersetzung hoffentlich sauber normalisiert hast reicht ein Join und du hast EN, DE von den zufälligen Wörtern von der DB als Ergebnis.
            The string "()()" is not palindrom but the String "())(" is.

            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
            PHP.de Wissenssammlung | Kein Support per PN

            Kommentar


            • #7
              Vermutlich meinst du order by rnd()

              Das Auslesen habe ich ja schon hinbekommen. Ich bin Einsteiger und habe Probleme, in der Zieldatei ein Array auszulesen und Variablen zuzuordnen. Das Problem habe ich ja auch, wenn ich für die Auswahl eine andere Vorgehensweise wähle.

              Ich suche erst einmal eine Lösung für das Problem, das Array zu verarbeiten.

              Wenn ich das nicht hinbekomme, werde ich die Ergebnisse in einer neuen Datei speichern und mit der Zieldatei weiterverarbeiten.

              Wenn ich ich geschafft habe, schaue ich mir gerne die Alternative an, wie ich die Auswahl eleganter hinbekommen kann.

              Kommentar


              • #8
                Aber warum du jetzt das Array wieder einzelnen Variablen zuordnen willst ist nach wie vor nicht klar.
                Du kannst über das Array einfach mit einer foreach Schleife laufen und in dieser dann die Datenbankabfragen machen oder was auch immer.
                Innerhalb der Schleife hast du den jeweiligen Ort (Key) und die Antwort (Value):

                PHP-Code:
                foreach($_POST['antwort'] as $ort => $antwort ) {
                  
                // dein Code...

                sorry, shift-taste kaputt

                Kommentar


                • #9
                  Hallo Meister1900,

                  ich habe mit deiner Hilfe das Array mittels foreach auslesen können. Und ich habe verstanden, was du meinst. Ich kann direkt beim Aufruf des Arrays gleich prüfen, ob die Eingabe korrekt ist.

                  Ich habe dabei jedoch 2 Probleme:

                  1. Es kommen (meistens) weniger Variablen an, als abgesendet wurden. Wenn ich z.B. 5 Abfragen tätige, die Antwort von 1 bis 5 eingebe, kommt in der Zieldatei z.B. 3,4,1 an. Auch die Reihenfolge ist nicht die, wie die Eingabe/Abfrage erfolgte. Die fehlenden Elemente sind dabei willkürlich. Zu Zuordnung Frage - Antwort passt jedoch.

                  2. Warum möchte ich die Variablen aus dem Array einzelnen Variablen zuordnen?
                  Ich möchte die Variablen weiterverarbeiten. Ich glaube zu wissen, wie ich das mit dem Array auch ohne Einzelzuordnung hinbekomme. Im Moment ist mir das zu umständlich, zumal es (s.o.) nicht richtig funktioniert..
                  $ort und 'antwort' hatte ich als Testseite genutzt, zum Ausprobieren.
                  Ich möchte aber einen "Vokbeltest" programmieren. Ich habe aus einer Datenbank die Paarung Englisch - Deutsch ausgelesen, dazu kommt noch letzter Aufruf, Fehlerhäufigkeit, …
                  Ich habe mir das ja, wie oben geschrieben, so vorgestellt:
                  in einem Formular wird die gewünschte Anzahl an Vokabeln, die der Vorgabe entsprechen (z.B. unregelmäßige Verben) ausgewählt und angezeigt. Hinter der deutschen Vokabel kommt der Input-Befehl für die Eingabe der englischen Vokabel.

                  In der Zieldatei wird verglichen, ob die Englisch-Eingabe mit der ausgesuchten Englisch-Vorgabe übereinstimmt. Wenn das nicht der Fall ist, muss noch einmal die Datenbank durchsucht werden, ob es sich um ein Synonym handelt und mehrere Lösungen möglich sind.

                  Wenn die Eingabe richtig ist, wird für diese Vokabel der Fehlerzähler gesenkt (oder erhöht) und in der Datenbank abgespeichert.

                  Auf dem Bildschirm soll die deutsche Vokabel, die Eingabe, und die richtige Lösung angezeigt werden.


                  Ich habe mir vorgestellt, dass es für mich einfacher ist, wenn ich eins nach dem anderen mache. Da ich das Array nicht fehlerfrei übertragen bekomme und ich doch recht viele Daten von einem zum anderen Formular übertragen muss, werde ich wohl das Ergebnis in eine Datei schreiben und bei der Zieldatei diese Datei auslesen und weiterverarbeiten. Ich glaube, das ist für mich die einfachste Vorgehensweise.

                  Kommentar


                  • #10
                    Dann poste doch nochmal deinen aktuellen Code wo das Problem 1 auftritt. Ich bin sicher dass dir dann jemand helfen kann hier.
                    Statt den Umweg über die Datei könntest du doch einfach auf der Zielseite die richtigen Lösungen plus Synonyme aus der Datenbank abfragen. Diese Infos brauchst du doch auf der Startseite noch gar nicht.
                    Oder du speicherst die richtigen Lösungen in der Session. Dann brauchst du insgesamt nur eine Datenbank-Abfrage zu machen und vergleichst auf der Zielseite die Antworten mit den Lösungen in der Session.
                    sorry, shift-taste kaputt

                    Kommentar


                    • #11
                      Hier mal ein kleines Beispiel Script für dich mit Ablage der Vokabeln in der Session:

                      PHP-Code:
                      <?php
                      session_start
                      ();
                      $ergebnis '';

                      if (isset(
                      $_POST['absenden'])) {
                        
                      $i 0;
                        foreach(
                      $_POST['antwort'] as $deutsch => $antwort) {
                          
                      $ergebnis .= '<tr><td>' htmlspecialchars($deutsch) . '</td>';
                          
                      $ergebnis .= '<td>' htmlspecialchars($antwort) . '</td>';
                          
                      $loesung $_SESSION['vokabeln'][$i]['englisch'];
                          
                      $ergebnis .= '<td>' htmlspecialchars($loesung) . '</td>';
                          
                      $ergebnis .= '<td>' . (( strtolower($loesung) == strtolower($antwort)) ? 'RICHTIG :-)' 'FALSCH :-(') . '</td>';
                          
                      $ergebnis .= '</tr>';
                          
                      $i++;
                        }

                      } else {
                        
                      $sqlCreate "
                        CREATE TABLE vokabeln(
                            [deutsch] TEXT NOT NULL,
                            [englisch] TEXT NOT NULL);
                        INSERT INTO `vokabeln` VALUES ('Hallo', 'hello'); INSERT INTO `vokabeln` VALUES ('Welt', 'world');
                        INSERT INTO `vokabeln` VALUES ('Deutschland', 'germany'); INSERT INTO `vokabeln` VALUES ('Haus', 'house');
                        INSERT INTO `vokabeln` VALUES ('Fussball', 'soccer'); INSERT INTO `vokabeln` VALUES ('spazieren', 'walk');"
                      ;

                        
                      $memDB = new PDO('sqlite::memory:');
                        
                      $memDB->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
                        
                      $memDB->exec($sqlCreate);
                        
                      $myQuery $memDB->query('SELECT deutsch, englisch FROM vokabeln ORDER BY RANDOM() LIMIT 3;');

                        
                      $vokabeln $myQuery->fetchAll(PDO::FETCH_ASSOC);
                        
                      $_SESSION['vokabeln'] = $vokabeln;
                      }
                      ?>

                      <!doctype html>
                      <html lang="en">
                      <head>
                        <meta charset="UTF-8">
                        <title>Vokabel-Trainer</title>
                        <style>
                          input,label{display:block;font-family:Calibri;}table{border-collapse:collapse;font-family:Calibri}thead tr{background:#ddd}td,th{border:1px solid #bbb;width:120px;text-align:center;line-height:160%;vertical-align:top}input{margin-bottom:20px}
                        </style>
                      </head>
                      <body>

                      <?php if ($ergebnis == ''):?>
                        <form method="post">
                        <?php foreach($vokabeln as $vokabel)  :?>
                          <label><?=$vokabel['deutsch']?></label>
                          <input type="text" name="antwort[<?=$vokabel['deutsch']?>]" placeholder="Englisch" autocomplete="off" required>
                        <?php endforeach; ?>
                        <input type="submit" name="absenden" value="Prüfen!">
                        </form>
                      <?php else: ?>
                        <table>
                        <tr>
                        <th>Deutsch</th>
                        <th>Antwort</th>
                        <th>Englisch</th>
                        <th>Ergebnis</th>
                        </tr>
                        <?=$ergebnis?>
                        </table>
                      <?php endif; ?>
                      </body>
                      </html>
                      sorry, shift-taste kaputt

                      Kommentar


                      • #12
                        Danke!! Das muss ich erst einmal durcharbeiten.

                        Ich habe die Datei gespeichert und bei mir aufgerufen. Das Ergebnis sieht im Explorer so aus:

                        Code:
                        Fatal error    
                        : Uncaught PDOException: could not find driver in C:\Apache24\htdocs\test_meister.php:29 Stack trace: #0 C:\Apache24\htdocs\test_meister.php(29): PDO->__construct('sqlite::memory:') #1 {main} thrown in
                        C:\Apache24\htdocs\test_meister.php
                        on line
                        29
                        Kann es sein, dass das daran liegt, dass die Datenbankbefehle des alten mysql mit PDO aufgerufen werden? Ich konnte nichts dazu finden, ob PDO separat installiert werden muss. Ich mache die Datenbankzugriffe per mysqli_xxxxx.

                        Wofür nutzt du htmlspecialchars($xyz)? Ich habe darüber gefunden, dass dies mit einem html-Code zu tun hat. Ich weiß im Moment nicht, warum dies mit der Vokabel-Variablen in Verbindung gebracht wird.

                        Kommentar


                        • #13
                          Für das Beispiel musst du den PDO_SQLITE Treiber in der php.ini aktiviert haben. Du kannst aber auch mysqli und deine Datenbank verwenden, hierzu musst du aber die SQL Create-Statements rausnehmen und die Abfrage entsprechend anpassen.

                          Wegen htmlspecialchars() hier nachlesen Beitrag 9:
                          https://www.php.de/forum/webentwickl...while-schleife
                          sorry, shift-taste kaputt

                          Kommentar


                          • #14
                            Ich habe PDO gestern aktiviert. Der Code läuft - wie zu erwarten - gut.

                            Ich werde jetzt versuchen, deinen Code nachzuvollziehen und für mein Projekt umzusetzen.

                            Du hast das in einer Datei programmiert. Ich wollte die Abfrage und die Auswertung in zwei getrennten Formularen machen. Ich fand das übersichtlicher, weil ich bei einer falschen Antwort noch einmal die Datenbank aufrufen möchte - es könnte ja sein, dass das deutsche Wort mehrere englische Entsprechungen hat - und umgekehrt. Ich fand das auf 2 Dateien aufgeteilt für mich übersichtlicher.

                            Ich habe noch das Problem, dass in deinem Code der Umlaut (bei zurück) nicht richtig wiedergegeben wird. Egal, welchen Browser ich nutze. Ich habe gesucht und viele alte Hinweise dazu gefunden, wenige neue. Ich habe deinen Code so wie er war in Phase 5 oder dem win-editor einkopiert und gespeichert. Kein Erfolg. Ich habe verschiedene vorgeschlagene Lösungen ausprobiert ...

                            Kommentar


                            • #15
                              Als Beispiel fürs Forum fand ich es übersichtlicher in einer Datei. Denke bei einer Aufteilung in mehrere Dateien lieber darüber nach, PHP-Logik und HTML-Ausgabe voneinander zu trennen.
                              Oder wenn du mit OOP anfängst, jede Klasse in eine Datei zu packen.
                              Die Daten kannst du ja trotzdem nur einmal aus der Datenbank holen und in der Session speichern, auch wenn es mehrere englische Übersetzungen gibt.
                              Du musst die Datei als UTF-8 ohne BOM speichern, dann sollten auch die Umlaute passen.
                              sorry, shift-taste kaputt

                              Kommentar

                              Lädt...
                              X