Dynamische Anzahl an Formfeldern

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

  • Dynamische Anzahl an Formfeldern

    Hallo,

    ich war mal gut in MySQL, aber bin nun schon einige Jahre raus. Könnt ihr mir auf die Sprünge helfen?

    ich habe eine DB-Tabelle mit den Spalten Unternehmen, Land, Teilnehmer. Nun möchte ich per im URL-String übergebenen PHP-Parameter "Unternehmen" jeweils alle registrierten Teilnehmer/Länder anzeigen lassen. Mit dem Clou: Diese sollen in Input-Formfeldern dargestellt werden, die dann direkt geändert und per Submit-Button in der Datenbank geändert werden können.

    Wie gehe ich das am besten an?!

    Danke Euch und VG!

  • #2
    Nun ja, SELECT-Query mit WHERE Unternehmen = <Wert-aus-Parameter>.

    Aus der Rückgabe per Schleife die Eingabeelemente erzeugen. Als Name am besten ein Array aufbauen mit der ID des Datensatzes als Key. Schematisch so:

    Code:
    foreach Datensatz as D
        <input type="text" name="data[D->id][Land]" value="D->Land">
        <input type="text" name="data[D->id][Teilnehmer]" value="D->Teilnehmer">
    endforeach
    Nach dem Absenden hast du die Daten dann als Array in POST und kannst UPDATE-Queries ausführen.

    Fehlerbehandlung und Behandlung von Kontextwechseln (Escaping) nicht vergessen.

    - Programmiertechnik/Kontextwechsel ? SELFHTML-Wiki
    Zuletzt geändert von mermshaus; 23.03.2017, 17:34.

    Kommentar


    • #3
      Das sieht sehr vielversprechend aus, Dankeschön!

      Könntest Du mir auch ein Beispiel geben für den SQL-Teil?

      Ich habe SQL zum letzten Mal benutzt, als es mysqli noch nicht gab :-O Mit der (für mich) "neuen" Anwendungsweise von SQL-Arrays, -Fetches & Co. bin ich daher noch nicht so gut vertraut.

      Kommentar


      • #4
        Wie hast du denn vorher Daten abgerufen?

        Tutorials zu mysqli zum Beispiel hier:

        - PHP: MySQLi extension basic examples - Manual
        - https://www.sanwebe.com/2013/03/basic-php-mysqli-usage

        Im Handbuch/der Doku sind zu den Funktionen auch in der Regel Beispiele.

        - http://php.net/manual/en/book.mysqli.php


        Siehe auch Crossposting hier: → http://phpforum.de/forum/showthread.php?t=284392
        Zuletzt geändert von mermshaus; 23.03.2017, 17:50.

        Kommentar


        • #5
          Moin, vorher hab ich mysql (ohne i) benutzt.

          Danke für Deine Hilfe! Und sorry für das unerwünschte Doppelposting. Mir war nicht klar, dass das unerwünscht ist - verstehe es aber jetzt.

          Kommentar


          • #6
            Hi mermshaus & andere,

            Mit foreach hat es nicht geklappt. mysqli_fetch_assoc scheint damit nicht kompatibel zu sein. Ich habe es jetzt per while geschrieben, was gut funktioniert.

            Mit ist aber wirklich nicht klar, wie ich das Update vornehmen kann. Die Input-Felder haben ja alle einen anderen Namen (nummeriert anhand der Zeilen-ID) als die Tabellenspalten in der Datenbank... ?

            Ist es ganz einfach und ich stehe nur auf dem Schlauch?

            PHP-Code:
            <?php

            if(isset($_POST['update']))
              {
                echo 
            "Updated data successfully";

                        
            $dbhost '...';
                        
            $dbuser '...';
                        
            $dbpass '...';
                        
                        
            $conn mysql_connect($dbhost$dbuser$dbpass);
                        
            [
            UPDATEaber wie? :-/]

                        
            mysql_select_db('...');
                        
            $retval mysql_query$sql$conn );

              }
            else
              {

            $Company $_GET['company'];

            $link mysqli_connect ("...""...""...""...");

            echo (
            "<html><body><table>");

            $query "SELECT ID, Country, FullName, Conference, DietaryRequests FROM DinnerAttendees WHERE Company = '$Company'";

            if (
            $result mysqli_query($link$query)) {

            echo (
            "<form method='post' action='regstest.php'>");

                
            /* fetch associative array */
                
            while ($row mysqli_fetch_assoc($result)) {
                    
            printf ("<input type='text' name='%s_ID' value='%s'> <input type='text' name='%s_Land' value='%s'> <input type='text' name='%s_Name' value='%s'> <input type='text' name='%s_Conf' value='%s'> <input type='text' name='%s_Diet' value='%s'><br>"$row["ID"], $row["ID"], $row["ID"], $row["Country"], $row["ID"], $row["Country"], $row["ID"], $row["FullName"], $row["ID"], $row["Conference"], $row["ID"], $row["DietaryRequests"]);
                }

            echo (
            "<input name='update' type='submit' id='update' value='Update'></form>");

                
            /* free result set */
                
            mysqli_free_result($result);
            }

            /* close connection */
            mysqli_close($link);

            echo (
            "</table></body></html>");

              }

            ?>
            Danke!

            (Und dieses Mal nur hier gepostet

            Kommentar


            • #7
              Hier mal ein vollständiges Beispiel (allerdings ungetestet):

              (Die Klasse ist dann eigentlich so gedacht, dass sie in einer eigenen Datei liegt und inkludiert wird (bzw. Autoloader). Zudem ist sie universell nutzbar und steht in keinem Zusammenhang mit dem HTML-Code aus dem Beispiel. Trennung von Zuständigkeiten.)

              PHP-Code:
              <?php

              /**
               * Class AttendeeService
               */
              class AttendeeService
              {
                  
              /**
                   * @var mysqli
                   */
                  
              private $mysqli;

                  
              /**
                   * AttendeeService constructor.
                   * @param mysqli $mysqli
                   */
                  
              public function __construct(mysqli $mysqli)
                  {
                      
              $this->mysqli $mysqli;
                  }

                  
              /**
                   * @param string $query
                   * @return mysqli_result
                   * @throws Exception
                   */
                  
              private function query($query)
                  {
                      
              $result $this->mysqli->query($query);

                      if (
              $result === false) {
                          throw new 
              Exception('Abfrage konnte nicht ausgeführt werden');
                      }

                      return 
              $result;
                  }

                  
              /**
                   * @param $s
                   * @return string
                   */
                  
              private function escape($s)
                  {
                      return 
              $this->mysqli->real_escape_string($s);
                  }

                  
              /**
                   * @param string $company
                   * @return array
                   * @throws Exception
                   */
                  
              function getAttendeesByCompany($company)
                  {
                      
              $query sprintf(
                          
              "SELECT ID, Country, FullName, Conference, DietaryRequests FROM DinnerAttendees WHERE Company = '%s'",
                          
              $this->escape($company)
                      );

                      
              $result $this->query($query);

                      
              $attendees $result->fetch_all(MYSQLI_ASSOC);

                      return 
              $attendees;
                  }

                  
              /**
                   * @param $id
                   * @param array $data
                   * @throws Exception
                   */
                  
              private function updateAttendee($id, array $data)
                  {
                      
              $fields = array('Country''FullName''Conference''DietaryRequests');

                      
              $parts = array();

                      foreach (
              $fields as $field) {
                          if (!isset(
              $data[$field]) || !is_string($data[$field])) {
                              throw new 
              Exception(sprintf('Feld "%s" fehlerhaft in Datensatz mit ID %s'$field$id));
                          }

                          
              $tmp trim($data[$field]);

                          
              $parts[] = sprintf("%s = '%s'"$field$this->escape($tmp));
                      }

                      
              $query sprintf(
                          
              'UPDATE DinnerAttendees SET %s WHERE ID = %s',
                          
              implode(', '$parts),
                          
              $this->escape($id)
                      );

                      
              $this->query($query);
                  }

                  
              /**
                   * @param array $entries
                   */
                  
              public function updateAttendees(array $entries)
                  {
                      foreach (
              $entries as $id => $data) {
                          
              $this->updateAttendee($id$data);
                      }
                  }
              }

              /**
               * @param $s
               * @return string
               */
              function e($s)
              {
                  return 
              htmlspecialchars($sENT_QUOTES'UTF-8');
              }

              /**
               * @param string $url
               */
              function redirect($url)
              {
                  
              header('Location: ' $url);
                  exit;
              }



              // Verarbeitung

              $mysqli = new mysqli('...''...''...''...');
              $mysqli->set_charset('utf8');

              $service = new AttendeeService($mysqli);

              $tpl = array(
                  
              'company' => '',
                  
              'data'    => array()
              );

              if (isset(
              $_POST['update'])) {
                  
              $service->updateAttendees($_POST['data']);
                  
              redirect('regstest.php');
              } else {
                  
              $company = (isset($_GET['company']) && is_string($_GET['company'])) ? $_GET['company'] : '';

                  
              $data $service->getAttendeesByCompany($company);

                  
              $tpl['company'] = $company;
                  
              $tpl['data']    = $data;
              }



              // Ausgabe

              header('Content-Type: text/html; charset=UTF-8');

              ?><!DOCTYPE html>
              <html lang="de">

              <head>
                  <meta charset="UTF-8">
                  <title>Einträge für <?=e($tpl['company'])?></title>
              </head>

              <body>

                  <h1>Einträge für <?=e($tpl['company'])?></h1>

                  <?php if (count($tpl['data']) > 0): ?>

                  <form method="post" action="regstest.php">
                      <?php foreach ($tpl['data'] as $row): ?>
                          <?php $prefix sprintf('data[%s]'e($row['ID'])); ?>
                          <p>
                              <input type="text" name="<?=$prefix?>[Country]" value="<?=e($row['Country'])?>">
                              <input type="text" name="<?=$prefix?>[FullName]" value="<?=e($row['FullName'])?>">
                              <input type="text" name="<?=$prefix?>[Conference]" value="<?=e($row['Conference'])?>">
                              <input type="text" name="<?=$prefix?>[DietaryRequests]" value="<?=e($row['DietaryRequests'])?>">
                          </p>
                      <?php endforeach; ?>
                      <p><input name="update" type="submit" value="Update"></p>
                  </form>

                  <?php else: ?>

                  <p>Es liegen keine Daten vor.</p>

                  <?php endif; ?>

              </body>

              </html>
              Zuletzt geändert von mermshaus; 25.03.2017, 21:59.

              Kommentar


              • #8
                Vielen lieben Dank, mermshaus!

                Übers Wochenende habe ich anhand Deines Codes mich schon in einige mir "solala"-bekannte Funktionen wieder eingelesen und denke, jetzt bin ich auf einem guten Weg. Danke!

                Kommentar

                Lädt...
                X