Peter Simpel: PHP-Formular für Datenbank funktioniert nicht

Hallo,

ich habe mir etwas Webspace mit Mysql Datenbank zugelegt. Jetzt wollte ich mir ein Formular erstellen um Daten in die DB zu schreiben. Um mich da ranzutasten habe von dieser Seite http://www.phpbox.de ein paar Beispieldateien angelegt. Das anlegen einer neuen Tabelle per php-Datei hat geklappt, nur nicht das Schreiben in diese neue Tabelle?!

Hier mal der Code der Dateien:

db.php

<?

$dbname="Datenbankname";

$dbhost="localhost";

$dbuser="Username";

$dbpass="Passwort";

mysql_connect($dbhost,$dbuser,$dbpass);

mysql_select_db($dbname);

?>

insert.php

<!-insert.php->

<html>

<body>

<?PHP

if ($button==" OK ") {

 include("db.php");

 mysql_query("INSERT INTO

 cds(titel,interpret)VALUES('$titel','$interpret')");

 mysql_close();

 ?>

 Die Daten wurden eingetragen<br>

 <a href="insert.php">neuer Eintrag</a><br>

 <a href="fetcharr.php">zur Übersicht</a>

 <?PHP

} else { ?>

 <form method="post" action="insert.php">

 <input type="text" name="interpret" value="interpret"><br>

 <input type="text" name="titel" value="titel"><br>

 <input type="submit" name="button" value=" OK ">

 </form>

 <?PHP

} ?>

</body>

</html>

Kann mir jemand sagen woran das liegt? Gruß

akzeptierte Antworten

  1. Tach!

    Das anlegen einer neuen Tabelle per php-Datei hat geklappt, nur nicht das Schreiben in diese neue Tabelle?! Kann mir jemand sagen woran das liegt?

    An den vielen Fehlern, die teilweise zustandekommen, weil der Code auf uralte Art und Weise geschrieben wurde. Sicherheitsanforderungen entspricht er auch nicht.

    mysql_connect($dbhost,$dbuser,$dbpass);

    Das Funktionsergebnis wird nicht ausgewertet und eventuelle Fehler werden einfach übergangen.

    Die Funktionen der mysql-Extension sind auch längst abgekündigt. Verwende PDO oder mysqli.

    if ($button==" OK ") {

    Die hier abgefragte Variable existiert nicht. Das error_reporting wird auch nicht auf E_ALL stehen nebst eingeschaltetem display_errors, so dass nicht mal eine Notice-Meldung angezeigt wird.

    mysql_query("INSERT INTO

    cds(titel,interpret)VALUES('$titel','$interpret')");

    Keine Fehlerbehandlung und außerdem wurden wieder nicht existierende Variablen angesprochen. Zudem fehlt die kontextgerechte Behandlung der Werte.

    dedlfix.

    1. weil der Code auf uralte Art und Weise geschrieben wurde. Sicherheitsanforderungen entspricht er auch nicht.

      Naja, die Hilfeseite woher ich die Beispiele hab ist wahrscheinlich schon uralt, das sieht man leider nicht. Hast du einen Tipp wo man aktuellere Beispiele findet?

      1. Tach!

        Hast du einen Tipp wo man aktuellere Beispiele findet?

        Im PHP-Handbuch gibt es üblicherweise zu jeder Funktion ein Beispiel. Aktuelle und gute Anfängertutorials kenne ich aber keine.

        dedlfix.

        1. Mit den Beispielen hieraus http://www.selfphp.info/praxisbuch hab ich jetzt schon mal ín die Datenbank schreiben und abrufen können. Denke mal darauf kann ich aufbauen. ;)

          Danke für das Interesse.

          1. Wieder eine Schwierigkeit... Mein Formular ruft zwar die PHP-Datei auf und es wird eine neue Zeile in der Tabelle angelegt, aber ohne Werte. :(

            Formular:

            <form method="post" action="test1.php">
            <p><label><br><input type="hidden" name="$id"></label</p>
            <p><label>Nick:<br><input type="text" name="$nick"></label</p>
            <p><label>Vorname:<br><input type="text" name="$vname"></label</p>
            <p><label>Nachname:<br><br><input type="text" name="$nname"></label</p>
            <input type="submit" value="OK">
            </form>
            

            test1.php

            <?php
            
             // Verbindungs-Objekt samt Zugangsdaten festlegen
             @$db = new mysqli('localhost', 'Benutzer', 'Passwort', 'Datenbankname');
            
             // Verbindung überprüfen
             if (mysqli_connect_errno()) {
               printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
               exit();
             }
            
             // SQL-Befehl
             $sql_befehl = "
             INSERT INTO t_name
             (id_name, nick, vname, nname)
             VALUES 
             ('$id', '$nick', '$vname','$nname')";
            
             if ($db->query($sql_befehl)) {
               // Meldung bei erfolgreicher Erstellung der Datensätze
               echo "Datensätze erfolgreich angelegt.";  
             } else {
               // Meldung bei Fehlschlag
               echo "Datensätze konnte nicht angelegt werden!";
             }
            
             // Verbindung zum Datenbankserver beenden
             $db->close();
            
             ?>
            
            1. Hallo,

              Wieder eine Schwierigkeit... Mein Formular ruft zwar die PHP-Datei auf und es wird eine neue Zeile in der Tabelle angelegt, aber ohne Werte. :(

              ja, wegen der nicht existierenden Variablen $id, $nick, $vname und $nname. Darauf hat dedlfix heute mittag schon hingewiesen. Lässt du Fehlermeldungen und Notices nicht anzeigen?

              Und ein kontextgerechtes Escaping fehlt auch noch. Da ist es nur eine Frage der Zeit, bis dir jemand durch ungeeignete oder absichtlich gemeine Eingaben deine Datenbank plattmacht.

              So long,
               Martin

            2. Hi,

              Wieder eine Schwierigkeit... Mein Formular ruft zwar die PHP-Datei auf und es wird eine neue Zeile in der Tabelle angelegt, aber ohne Werte. :(

              Und das wundert Dich?

              <?php
              
               // Verbindungs-Objekt samt Zugangsdaten festlegen
               @$db = new mysqli('localhost', 'Benutzer', 'Passwort', 'Datenbankname');
              
               // Verbindung überprüfen
               if (mysqli_connect_errno()) {
                 printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
                 exit();
               }
              
               // SQL-Befehl
               $sql_befehl = "
               INSERT INTO t_name
               (id_name, nick, vname, nname)
               VALUES 
               ('$id', '$nick', '$vname','$nname')";
              

              Hier kommen die Variablen $id, $nick usw. das erste Mal vor - es wurde ihnen also vorher kein Wert zugewiesen.

              Nur weil zufällig im Formular input-Elemente mit den Name "id", "nick" usw. vorhanden sind, entstehen damit schon länger keine PHP-Variablen mehr - in früheren PHP-Versionen war dieser Unsinn noch implementiert, jetzt ist das weg.

              Die Formular-Eingaben sind in $_POST oder $_GET (je nach Methode des Formulars) enthalten.

              cu,
              Andreas a/k/a MudGuard

            3. Wieder eine Schwierigkeit... Mein Formular ruft zwar die PHP-Datei auf und es wird eine neue Zeile in der Tabelle angelegt, aber ohne Werte. :(

              Schau mal ob es so funktioniert

              <form method="post" action="test1.php">
              <p><label><br><input type="hidden" name="id"></label</p>
              <p><label>Nick:<br><input type="text" name="nick"></label</p>
              <p><label>Vorname:<br><input type="text" name="vname"></label</p>
              <p><label>Nachname:<br><br><input type="text" name="nname"></label</p>
              <input type="submit" value="OK">
              </form>
              

              Und das dazugehörige PHP

              <?php
              
               // Verbindungs-Objekt samt Zugangsdaten festlegen
               @$db = new mysqli('localhost', 'Benutzer', 'Passwort', 'Datenbankname');
              
               // Verbindung überprüfen
               if (mysqli_connect_errno()) {
                 printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
                 exit();
               }
              
               // Formulardate aus deinem Formular abrufen
               $id     = $_POST["id"];
               $nick   = $_POST["nick"];
               $vname  = $_POST["vname"];
               $nname  = $_POST["nname"];
              
               // SQL-Befehl
               $sql_befehl = " INSERT INTO t_name (id_name, nick, vname, nname) 
                               VALUES ('$id', '$nick', '$vname','$nname')";
              
               if ($db->query($sql_befehl)) {
                 // Meldung bei erfolgreicher Erstellung der Datensätze
                 echo "Datensätze erfolgreich angelegt.";  
               } else {
                 // Meldung bei Fehlschlag
                 echo "Datensätze konnte nicht angelegt werden!";
               }
              
               // Verbindung zum Datenbankserver beenden
               $db->close();
              
               ?>
              
              1. Tach!

                Schau mal ob es so funktioniert

                Nein, das funktioniert so nicht. Gib einen Namen mit ' ein, und du wirst sehen, dass es kaputt ist. PDO und Prepared Statements verhindern solche Fehler. (Prepared Statements gehen auch mit mysqli, aber PDO ist freundlicher zu bedienen.)

                dedlfix.

                1. Nein, das funktioniert so nicht. Gib einen Namen mit ' ein, und du wirst sehen, dass es kaputt ist. PDO und Prepared Statements verhindern solche Fehler. (Prepared Statements gehen auch mit mysqli, aber PDO ist freundlicher zu bedienen.)

                  Hallo,

                  dann eben so?

                  <?php
                  
                   // Verbindungs-Objekt samt Zugangsdaten festlegen
                   @$db = new mysqli('localhost', 'Benutzer', 'Passwort', 'Datenbankname');
                  
                   // Verbindung überprüfen
                   if (mysqli_connect_errno()) {
                     printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
                     exit();
                   }
                  
                   // Formulardate aus deinem Formular abrufen
                   $id     = mysql_real_escape_string($_POST["id"]);
                   $nick   = mysql_real_escape_string($_POST["nick"]);
                   $vname  = mysql_real_escape_string($_POST["vname"]);
                   $nname  = mysql_real_escape_string($_POST["nname"]);
                  
                   // SQL-Befehl
                   $sql_befehl = " INSERT INTO t_name (id_name, nick, vname, nname) 
                                   VALUES ('$id', '$nick', '$vname','$nname')";
                  
                   if ($db->query($sql_befehl)) {
                     // Meldung bei erfolgreicher Erstellung der Datensätze
                     echo "Datensätze erfolgreich angelegt.";  
                   } else {
                     // Meldung bei Fehlschlag
                     echo "Datensätze konnte nicht angelegt werden!";
                   }
                  
                   // Verbindung zum Datenbankserver beenden
                   $db->close();
                  
                   ?>
                  

                  Den Hinweis mit mysql_real_escape_string hast du oben schon gegeben, deshalb habe ich diesen überhaupt nicht berücksichtigt.

                  1. Hallo, ich habe es gestern schon hinbekommen. Aber eure Verbesserungen werde ich gerne übernehmen. Vielen Dank für die Unterstützung.

                    <?php
                    
                    // Report all errors
                    error_reporting(E_ALL);
                    
                    $id=$_POST["id_n"];
                    $nick=$_POST["nick"];
                    $vname=$_POST["vname"];
                    $nname=$_POST["nname"];
                    
                    // Verbindungs-Objekt samt Zugangsdaten festlegen
                    @$db = new mysqli('localhost', 'Benutzer', 'Passwort', 'Datenbank');
                    
                    // Verbindung überprüfen
                    if (mysqli_connect_errno()) {
                    printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
                    exit();
                    }
                    
                    // SQL-Befehl
                    $sql_befehl = "
                    INSERT INTO t_name
                    (id_name, nick, vname, nname)
                    VALUES
                    ('$id', '$nick', '$vname','$nname')";
                    
                    if ($db->query($sql_befehl)) {
                    // Meldung bei erfolgreicher Erstellung der Datensätze echo "Datensätze erfolgreich angelegt.";
                    } else {
                    // Meldung bei Fehlschlag
                    echo "Datensätze konnte nicht angelegt werden!";
                    }
                    
                    // Verbindung zum Datenbankserver beenden
                    $db->close();
                    ?>
                    
                    1. Hallo, ich habe es gestern schon hinbekommen. Aber eure Verbesserungen werde ich gerne übernehmen. Vielen Dank für die Unterstützung.

                      Hallo,

                      in deinem Code hast du die mysql_real_escape_string vergessen oder mit Absicht weggelassen, was nicht sehr schlau ist ;)

                      1. in deinem Code hast du die mysql_real_escape_string vergessen oder mit Absicht weggelassen, was nicht sehr schlau ist ;)

                        Nein das war nur die Version die ich mir schon zusammengebastelt hatte. ;) In der endgültigen Version habe ich die Verbesserungen übernommen.

                      2. Hallo,

                        in deinem Code hast du die mysql_real_escape_string vergessen oder mit Absicht weggelassen, was nicht sehr schlau ist ;)

                        Oder er wollte es sich einfach machen...

                        Gruß
                        Kalk

      2. Hast du einen Tipp wo man aktuellere Beispiele findet?

        Hallo Peter,

        ich habe zum Teil hier gelernt: http://tutcube.de/tutorials/ ab dem Punkt -> HTML / CSS / PHP