Ankündigung

Einklappen
Keine Ankündigung bisher.

Formularauswertung in SQL Datenbank speichern

Einklappen

Neue Werbung 2019

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

  • Formularauswertung in SQL Datenbank speichern

    Hallo,

    ich bin leider blutiger PHP Anfänger und bin nun leider an einem Punkt angekommen, wo mein Latein am Ende ist. Ich habe ein Formular mit Textfeldern, Radiobuttons und Checkboxen erstellt. Wenn der User auf einen Button klickt sollen die Ergebnisse in einer SQL Datenbank gespeichert werden, nur leider kommen sie nie dort an. Ich bekomme keinerlei Fehlermeldungen mehr, die ich in ieiner Form bearbeiten könnte. Vielleicht habt ihr eine Idee, wo der Fehler liegen könnte.
    Ich hoffe die Struktur stimmt soweit und entschuldige mich schon jetzt falls ich nicht gut gecoded haben sollte. Für Verbesserungen bin ich immer offen.

    HTML Code:

    HTML-Code:
    <!DOCTYPE html>
    <html lang="de">
      <head>
        <meta charset="utf-8">
        <title>uec Berlin</title>
        <link rel="stylesheet" type="text/css" href="style.css">
    
      </head>
    
      <body>
    <form action="formmailer2.php" method="post">
    
              <h4>Angaben zur Anlage:</h4>
    
              <table>
                <tr>
                  <td width="200">Firmenname:</td>
                  <td width="250"><input name="Firmenname" type="text" size="70"></td>
                </tr>
                <tr>
                  <td>Straße, Hausnummer:</td>
                  <td><input name="StrHaus" type="text" size="70"></td>
                </tr>
                <tr>
                  <td>PLZ, Ort:</td>
                  <td><input name="PLZOrt" type="text" size="70"></td>
                </tr>
                <tr>
                  <td>Ansprechpartner:</td>
                  <td><input name="Ansprechpartner" type="text" size="70"></td>
                </tr>
                <tr>
                  <td>Tel:</td>
                  <td><input name="Tel" type="text" size="70"></td>
                </tr>
                <tr>
                  <td>E-Mail:</td>
                  <td><input name="EMail" type="text" size="70"></td>
                </tr>
              </table>
    
              <h4>Derzeitige Anzahl der Mitarbeiter (ohne Büropersonal):</h4>
    
              <table>
              <tr>
                <td width="200"><input type="radio" name="Mitarbeiter" value="bis 5 Mitarbeiter"> bis 5 Mitarbeiter<br></td>
                <td width="300"><input type="radio" name="Mitarbeiter" value="5-10 Mitarbeiter"> 5-10 Mitarbeiter<br></td>
                <td width="300"><input type="radio" name="Mitarbeiter" value="10-20 Mitarbeiter"> 10-20 Mitarbeiter<br></td>
              </tr>
              <tr>
                <td><input type="radio" name="Mitarbeiter" value="20-50 Mitarbeiter"> 20-50 Mitarbeiter<br></td>
                <td><input type="radio" name="Mitarbeiter" value="über 50 Mitarbeiter"> über 50 Mitarbeiter<br></td>
                <td></td>
              </tr>
              </table>
    
              <p><label>Mussten Sie konjunkturbedingt Personal in den letzten zwei Jahren abbauen?</label></p>
    
              <table>
                <tr>
                  <td width="200"><input type="radio" name="PersonalJN" value="Ja"> Ja</td>
                  <td width="300"><input type="radio" name="PersonalJN" value="Nein"> Nein</td>
                  <td width="300"></td>
                </tr>
              </table>
    
              <h4>Umsatz (netto) im Jahr 2007: </h4>
    
              <table>
                <tr>
                  <td width="200"><input type="radio" name="Umsatz" value="bis 250.000"> bis 250.000 &euro;/a</td>
                  <td width="300"><input type="radio" name="Umsatz" value="250.000-500.000"> 250.000-500.000 &euro;/a</td>
                  <td width="300"><input type="radio" name="Umsatz" value="500.000-1. Mio."> 500.000-1. Mio &euro;/a</td>
                </tr>
                <tr>
                  <td><input type="radio" name="Umsatz" value="1-5 Mio."> 1-5 Mio. &euro;/a</td>
                  <td><input type="radio" name="Umsatz" value="5-10 Mio."> 5-10 Mio. &euro;/a</td>
                  <td><input type="radio" name="Umsatz" value="über 10 Mio."> über 10 Mio. &euro;/a</td>
                </tr>
              </table>
    
              <h4>Kapazität der Anlage: </h4>
    
              <table>
                <tr>
                  <td width="200">genehmigte Kapazität:</td>
                  <td><input name="Kapa" type="text" size="50"> t/Jahr</td>
                </tr>
              </table>
    
              <h4>Anlagenkonfiguration: </h4>
              <p><label>Sortieranlage mit</label><br>
    
              <table>
                <tr>
                  <td width="200"><input type="checkbox" name="Sortieranlage[]" value="Zerkleinerung">Zerkleinerung</td>
                  <td width="300"><input type="checkbox" name="Sortieranlage[]" value="FE-Metall-Abschneider">FE-Metall-Abschneider</td>
                  <td width="300"><input type="checkbox" name="Sortieranlage[]" value="NE-Metall-Abschneider">NE-Metall-Abschneider</td>
                </tr>
                <tr>
                  <td><input type="checkbox" name="Sortieranlage[]" value="Siebung">Siebung</td>
                  <td><input type="checkbox" name="Sortieranlage[]" value="Sichtung">Sichtung</td>
                  <td><input type="checkbox" name="Sortieranlage[]" value="Sortierkabine">Sortierkabine</td>
                </tr>
                <tr>
                  <td><input type="checkbox" name="Sortieranlage[]" value="NIR-Trennung">NIR-Trennung</td>
                </tr>
              </table>
    
              <br>
              <br>
    
      <input type="submit" name="absenden" value="Absenden">
    
    
              </form>
    
    
      </body>
    </html>
    PHP Code

    PHP-Code:
    <?php

          
    if(isset($_POST['absenden']))
          {

            require (
    "inc/confiq.php");

            
    $id 1;
            
    $firmenname $_POST['Firmenname'];
            
    $straße $_POST['StrHaus'];
            
    $plz $_POST['PLZOrt'];
            
    $ansprechpartner $_POST['Ansprechpartner'];
            
    $tel $_POST['Tel'];
            
    $email $_POST['EMail'];
            
    $mitarbeiter $_POST['Mitarbeiter'];
            
    $personaljn $_POST['PersonalJN'];
            
    $umsatz $_POST['Umsatz'];
            
    $kapazität $_POST['Kapa'];
            
    $sortieranlage $_POST['Sortieranlage'];
            
    $datum date("Y-m-d H:i:s");


            
    $anzahl1 count ($_POST['Sortieranlage']); //aus einem Forum übernommen, kann man die Checkboxen anders abfragen?

            
    if ($anzahl1 == 1)
            {
              
    $sortieranlage htmlspecialchars ($_POST['Sortieranlage'][0]);
            }

            elseif (
    $anzahl1 1)
            {
              
    $sa = array();

              foreach (
    $_POST['Sortieranlage'] as $sortieran)
              {
                
    $sa[] = htmlspecialchars ($sortieran);
              }
              
    $sortieranlage implode (','$sa);
            }

              
    $ergebnis = ("INSERT INTO testtabelle2 (ID,Firmenname,Straße Hausnummer,PLZ Ort,Ansprechpartner,Telefonnummer,EMail,Mitarbeiter,Personal,Umsatz,genehmigte Kapazität,Sortieranlage,Datum)" .
              
    " VALUES($id$firmenname$straße$plz$ansprechpartner$tel$email$mitarbeiter$personaljn$umsatz$kapazität$sortieranlage$datum)");

              
    $final $db->prepare($ergebnis);
              
    mysqli_close($db);

            }
      
    ?>
    und hier die dazugehörige confiq Datei

    PHP-Code:
    <?php

    $server 
    "localhost";
    $user"root";
    $password="";
    $database "testdatenbank";
    $charset ='utf8';

    $db = new mysqli($server$user$password$database);

    if (
    $db->connect_errno)
    {
      
    printf ("Error: %s\n"mysqli_error($db));
      
    printf ("Statement: %s\n"$ergebnis);
    }

    if (!
    $db->set_charset($charset))
    {
      
    printf ($db);
    }

    ?>


  • #2
    Hallo,

    Fehlerbehandlung aktivieren, https://php-de.github.io/jumpto/sql/...ehler-ausgeben

    Dann sagt die die DB: SQL-Syntaxfehler, Strings müsssen ich Hochkommas.

    Achtung: Du hast eine SQL-Injection Lücke! Nutze besser Prepared Statments, dann erschlägst du beides. https://www.php.net/manual/de/mysqli...statements.php

    Wenn du willst/kannst du auch PDO mit Prep. Statments verwenden. Da gäbe es auch Named Parameter und ein irgendwie logischeres Interface (imho). https://php-de.github.io/jumpto/pdo/
    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


    • #3
      Okay vielen Dank für deine schnelle Antwort. Ich versuche mal die Fehlerbehandlung einzubauen und schaue dann mal was fürn Quatsch ich gecoded habe.

      Was ist eine SQL-Injection Lücke? Um diese zu schließen muss ich mit PDO arbeiten?

      Kommentar


      • #4
        Zitat von yanikimo Beitrag anzeigen
        Was ist eine SQL-Injection Lücke?
        https://www.php.net/manual/de/mysqli...statements.php

        https://websitebeaver.com/prepared-s...tatements-work

        Um diese zu schließen muss ich mit PDO arbeiten?
        und nein.
        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


        • #5
          Okay super vielen Dank. Ich lese mir die Seiten durch.

          Ich bekomme nun diese Fehlermeldung:
          You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''id','firmenname','straßehausnummer','plzort','an sprechpartner','telefonnummer'' at line 1

          heißt ja, ich habe irgendetwas in der Datenbank falsch geschrieben. Ich habe einfach mit MYSQL eine Datenbank und eine Tabelle erstellt zum einfügen der Daten. Dann habe ich die Spalten benannt und ein Auto Increment auf "id" gelegt. Wie muss ich diese Fehlermeldung aufnehmen bzw. was muss ich verändern, damit die Fehlermeldung nicht mehr auftritt?

          Kommentar


          • #6
            Zitat von hausl Beitrag anzeigen
            Dann sagt die die DB: SQL-Syntaxfehler, Strings müsssen ich Hochkommas.
            Achtung: Du hast eine SQL-Injection Lücke! Nutze besser Prepared Statments, dann erschlägst du beides.
            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
              Guten Morgen hausl,
              ich bin die Seiten nun durchgegangen und habe meinen Code teilweise verändert.

              PHP-Code:
              <?php

                    
              if(isset($_POST['absenden']))
                    {

                      require (
              "inc/confiq.php");

                      
              $id 1;
                      
              $firmenname $db->real_escape_string($_POST['Firmenname']);   //$db->real_escape_string dient zur Vermeidung der SQL Injection (Hacker haben es somit nicht so leicht)
                      
              $straße $db->real_escape_string($_POST['StrHaus']);
                      
              $plz $db->real_escape_string($_POST['PLZOrt']);
                      
              $ansprechpartner $db->real_escape_string($_POST['Ansprechpartner']);
                      
              $tel $db->real_escape_string($_POST['Tel']);
                      
              $email $db->real_escape_string($_POST['EMail']);
                      
              $mitarbeiter $db->real_escape_string($_POST['Mitarbeiter']);
                      
              $personaljn $db->real_escape_string($_POST['PersonalJN']);
                      
              $umsatz $db->real_escape_string($_POST['Umsatz']);
                      
              $kapazität $db->real_escape_string($_POST['Kapa']);
                      
              //$sortieranlage = ($_POST['Sortieranlage']);
                      
              $datum date("Y-m-d H:i:s");


                      
              $anzahl1 count ($_POST['Sortieranlage']); //aus einem Forum übernommen, kann man die Checkboxen anders abfragen?

                      
              if ($anzahl1 == 1)
                      {
                        
              $sortieranlage htmlspecialchars ($_POST['Sortieranlage'][0]);
                      }

                      elseif (
              $anzahl1 1)
                      {
                        
              $sa = array();

                        foreach (
              $_POST['Sortieranlage'] as $sortieran)
                        {
                          
              $sa[] = htmlspecialchars ($sortieran);
                        }
                        
              $sortieranlage implode (','$sa);
                      }


                      
              $stmt $db->prepare("INSERT INTO testtabelle2 (firmenname, straßehausnummer, plzort, ansprechpartner, telefonnummer, email, mitarbeiter, personal, umsatz, genehmigtekapazität, sortieranlage, datum) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
                      
              $stmt->bind_param("ssssssssssss"$firmenname$straße$plz$ansprechpartner$tel$email$mitarbeiter$personaljn$umsatz$kapazität$sortieranlage$datum);
                      
              $stmt->execute();
                      
              $stmt->close();

                        
              /*$ergebnis = ("INSERT INTO testtabelle2 ('id','firmenname','straßehausnummer','plzort','ansprechpartner','telefonnummer','email','mitarbeiter','personal','umsatz','genehmigtekapazität','sortieranlage','datum')" .
                        " VALUES($id, $firmenname, $straße, $plz, $ansprechpartner, $tel, $email, $mitarbeiter, $personaljn, $umsatz, $kapazität, $sortieranlage, $datum)");
              */
                        
              if (false === mysqli_query($db$stmt))
                        {
                          die(
              mysqli_error($db));
                        }




                      
              /*  $final = $db->prepare($ergebnis);
                        mysqli_close($db);
              */
                      
              }
                
              ?>
              PHP-Code:
              <?php

              $server 
              "localhost";
              $user"root";
              $password="";
              $database "testdatenbank";
              $charset ='utf8';





              mysqli_report(MYSQLI_REPORT_ERROR MYSQLI_REPORT_STRICT);
              try
              {
                
              $db = new mysqli($server$user$password$database);
                
              $db->set_charset("utf8mb4");
              } catch(
              Exception $e)
              {
                
              error_log($e->getMessage());
                exit(
              'Error connecting to database');
              }






              ?>
              Jedoch habe ich drei weitere Fragen.

              1. Wie verhält sich der $db->real_escape_string beim Datum und bei meinem Array Sortieranlage? Benötige ich den Code dort überhaupt?
              2. Benötige ich bei $stmt = $db->prepare und $stmt->bind_param die id von meiner Tabelle oder wird diese automatisch hinzugefügt?
              3. Vermutlich in Verbindung mit Frage 2 bekomme ich leider diese Fehlermeldung und kann leider 0 damit anfangen, evtl. hast du einen Tipp bzw. kannst mir helfen.

              Fatal error: Uncaught mysqli_sql_exception: Failed to read auto-increment value from storage engine in C:\xampp\htdocs\formmailer2.php:44 Stack trace: #0 C:\xampp\htdocs\formmailer2.php(44): mysqli_stmt->execute() #1 {main} thrown in C:\xampp\htdocs\formmailer2.php on line 44

              Schonmal danke für die Links, die haben sehr geholfen.

              Kommentar


              • #8
                Also vorweg:

                - Du brauchst die Vars oben nicht umkopieren,
                - real escape bitte entfernen. Das brauchst du generell nur für die DB, aber nicht wenn du unten dann eh Prep. Statments verwendest.
                - htmlspecialchars() ist an der Stelle auch falsch, das ist "nur" für den Ausgabekontext zu HTML hin, sonst nicht.


                Zu Deinen Fragen - oberflächlich:

                zu 1. Ein Datum musst für die DB (DATETIME) im "ISO Format" kommen 2019-11-15 bzw. 2019-11-15 10:38:00
                zu 2. Verstehe ich nicht ganz. Aber wenn du einen Datensatz erzeugst (INSERT), und die ID AUTOINCREMENT ist, brauchst du für dieses Feld keinen Wert, das macht die DB alleine.

                Mit mysqli_ kenne ich mich nicht so aus, bei PDO könntest du auch direkt ein Array im execute übergeben. Diese Notation von mysqli_ schaut immer wieder seltsam aus.
                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


                • #9
                  Vielen Dank. Habe die Korrekturen vorgenommen.
                  zu 1. reicht es, wenn ich der Datenbank sage, dass das "datum" vom Typ "date" sein soll?
                  2. hat sich durch deinen oberen Teil erledigt, komisch ist nur, dass er das Auto-Increment nicht erkennt ...

                  Wenn ich PDO jetzt verwenden würde, müsste ich viel Code ändern? Ich weiß leider mit der Fehlermeldung nichts anzufangen ... und wenn du Profi in PDO bist, hast du vllt ein paar Tipps mehr

                  Kommentar


                  • #10
                    "Reicht" für was? Wenn du ein Datum speichern willst: Spalte in der DB als DATE oder DATETIME anlegen und beim SQL INSERT/UPDATE im Format yyyy-mm-dd, z.B. 2019-11-15, mitgeben.
                    You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.

                    Kommentar


                    • #11
                      Okay, habs jetzt endlich!!
                      Das Datum in der Datenbank hatte den Typ "date" und nicht "datetime".

                      Ich danke dir trotzdem für die zahlreichen Tipps und Links.

                      Einen schönen Tag dir noch.

                      Kommentar


                      • #12
                        Zitat von yanikimo Beitrag anzeigen
                        Das Datum in der Datenbank hatte den Typ "date" und nicht "datetime".
                        Und was hast du übergeben? Genau, einen String im Format DATETIME

                        PHP-Code:
                         $datum date("Y-m-d H:i:s"); 
                        Das zwickt dann halt etwas, aber nun bist du ja auch selbst draufgekommen.
                        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


                        • #13
                          PHP-Code:
                          htmlspecialchars ($_POST['Sortieranlage'][0]); 
                          ist in dieser Verwendungsform(vor Input in DB) auch falsch.
                          Bitte selber mal schlau machen, wofür es gedacht ist.

                          $kapazität
                          auch wenn es möglich ist Sonderzeichen, wie Umlaute, in Variablennamen zu verwenden, sollte man besser davon absehen um unerwartete Probleme zu vermeiden.
                          Zudem mischt du Englisch und Deutsch.
                          Solche Bezeichner auf Englisch zu schreiben gehört zum guten Stil.


                          Kommentar


                          • #14
                            Zitat von yanikimo Beitrag anzeigen
                            Das Datum in der Datenbank hatte den Typ "date" und nicht "datetime".
                            Um in einer Spalte das aktuelle Datum zu speichern brauchst du die Verrenkungen mit date() nicht - verwende für die Spalte als Wert NOW() (ohne Anführungszeichen drumrum!), dann setzt MySQL das aktuelle in die Spalte.

                            Kommentar


                            • #15
                              Danke für die hilfreichen Tipps.

                              Jetzt hätte ich leider doch noch eine Frage. Ich habe ein mehrseitiges Formular und mit einem Button kann ich die Seite wechseln. Am Ende steht ein "Abschicken" Button, der alle Formularfelder auswerten soll. Wie stelle ich es am vernünftigsten an die Werte zwischenzuspeichern. Beim Googlen bin ich auf folgendes gestoßen.


                              Für Seite 1 im oberen Teil des HTML Dokuments
                              PHP-Code:
                              session_start ([ array $options = array() ] ) 
                              So nun möchte ich alle Werte aus Seite1 der Seite2 mit übergeben. Kann ich das so lösen?
                              PHP-Code:
                              foreach ($_POST as $key->$value)
                              $_SESSION[$key] = $value
                              Wie geht es dann weiter mit Seite 3-5?

                              Kommentar

                              Lädt...
                              X