• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Kleines Problem mit einem Formular zu MySQL

anisomorpha

Neues Mitglied
Hallo zusammen,

erstmal die Vorwarnung, dass ich Laie in Bezug auf PHP/MySQL bin und deswegen nicht so bewandert bin wie manch anderer hier.

Mein Problem besteht bei einem Formular welches die Daten in eine MySQL Datenbank übergeben soll. Irgendwo muss ich im PHP einen Fehler haben aber ich bin im Moment wohl zu blind.

MySQL Tabelle wurde wie folgt gebildet:

PHP:
CREATE TABLE `user` (
`id` INT(10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `vorname` VARCHAR(100 ) NOT NULL ,
    `name` VARCHAR(100 ) NOT NULL ,
    `street` VARCHAR(100 ) NOT NULL ,
    `zip` VARCHAR(100 ) NOT NULL ,
    `city` VARCHAR(100 ) NOT NULL ,
    `country` VARCHAR(100 ) NOT NULL ,
    `phone` VARCHAR(100 ) NOT NULL ,
    `email` VARCHAR(100 ) NOT NULL ,
    `tables` VARCHAR(100 ) NOT NULL ,
    `comment` VARCHAR(100 ) NOT NULL
) ENGINE = MYISAM ;

Script sieht wie folgt aus:

PHP:
<?php
    $datenbank_host = 'localhost';
    $datenbank_user = 'xxx';
    $datenbank_passwort = 'xxx';
    $datenbank_name = 'xxx';

    if (!isset($_POST['senden'])) $_POST['senden'] = '';
    if (!isset($_POST['vorname'])) $_POST['vorname'] = '';
    if (!isset($_POST['name'])) $_POST['name'] = '';
    if (!isset($_POST['street'])) $_POST['street'] = '';
    if (!isset($_POST['zip'])) $_POST['zip'] = '';
    if (!isset($_POST['city'])) $_POST['city'] = '';
    if (!isset($_POST['country'])) $_POST['country'] = '';
    if (!isset($_POST['phone'])) $_POST['phone'] = '';
    if (!isset($_POST['email'])) $_POST['email'] = '';
    if (!isset($_POST['tables'])) $_POST['tables'] = '';
    if (!isset($_POST['comment'])) $_POST['comment'] = '';
    
    if ($_POST['senden'] 
    != '' AND $_POST['vorname'] 
    != '' AND $_POST['name'] 
    != '' AND $_POST['street'] 
    != '' AND $_POST['zip'] 
    != '' AND $_POST['city'] 
    != '' AND $_POST['country'] 
    != '' AND $_POST['phone'] 
    != '' AND $_POST['email'] 
    != '' AND $_POST['tables'] 
    != '' AND $_POST['comment'] 
    != '') {

        $link = @mysql_connect($datenbank_host, $datenbank_user, $datenbank_passwort);

        if (!$link) { die('keine Verbindung möglich: ' .
                mysql_error());
        }
        
        $db_selected =
            @mysql_select_db($datenbank_name, $link);

        if (!$db_selected) {
            die ('Kann '.$datenbank_name.' nicht benutzen : ' . mysql_error());
        }

        $sql_insert = "INSERT INTO `user`
            (`vorname`,`name`,`street`,`zip`,`city`,`country`,`phone`,`email`,`tables`,`comment`)
            VALUES
            ('".mysql_escape_string($_POST['vorname'])."','".mysql_escape_string($_POST['name'])."','".mysql_escape_string($_POST['street'])."','".mysql_escape_string($_POST['zip'])."',
            '".mysql_escape_string($_POST['city'])."','".mysql_escape_string($_POST['country'])."','".mysql_escape_string($_POST['phone'])."','".mysql_escape_string($_POST['email'])."',
            '".mysql_escape_string($_POST['tables'])."''".mysql_escape_string($_POST['comment'])."');";

        if (@mysql_query($sql_insert, $link) != false) {

            echo 'Der Eintrag wurde gespeichert!';
            $_POST['vorname'] = '';
            $_POST['name'] = '';
            $_POST['street'] = '';
            $_POST['zip'] = '';
            $_POST['city'] = '';
            $_POST['country'] = '';
            $_POST['phone'] = '';
            $_POST['email'] = '';
            $_POST['tables'] = '';
            $_POST['comment'] = '';
        } else {

            echo 'Der Eintrag wurde nicht gespeichert!';
        }

        @mysql_close($link);
    }

    echo '<form action="'.htmlspecialchars($_SERVER['PHP_SELF']).'" method="post">';
    echo ' Vorname: <input type="text" name="vorname" value="'.htmlspecialchars($_POST['vorname']).'"/><br/>';
    echo ' Name: <input type="text" name="name" value="'.htmlspecialchars($_POST['name']).'"/><br/><br/>';
    echo ' Strasse: <input type="text" name="street" value="'.htmlspecialchars($_POST['street']).'"/><br/><br/>';
    echo ' PLZ: <input type="text" name="zip" value="'.htmlspecialchars($_POST['zip']).'"/><br/><br/>';
    echo ' Stadt: <input type="text" name="city" value="'.htmlspecialchars($_POST['city']).'"/><br/><br/>';
    echo ' Land: <input type="text" name="country" value="'.htmlspecialchars($_POST['country']).'"/><br/><br/>';
    echo ' Phone: <input type="text" name="phone" value="'.htmlspecialchars($_POST['phone']).'"/><br/><br/>';
    echo ' Email: <input type="text" name="email" value="'.htmlspecialchars($_POST['email']).'"/><br/><br/>';
    echo ' Anzahl Tische: <input type="text" name="tables" value="'.htmlspecialchars($_POST['tables']).'"/><br/><br/>';
    echo ' Anmerkung: <input type="text" name="comment" value="'.htmlspecialchars($_POST['comment']).'"/><br/><br/>';
    echo ' <input type="submit" name="senden" value="absenden"/>';
    echo '</form>';
?>

Das Formular soll die Anmeldedaten wie Name, Adresse etc. in die Datenbank speichern. Mir ist bewusst, dass die Formulare z.T. noch als "test" gekennzeichnet sind aber ich versuche im Moment erstmal nur Text zu speichern und gebe auch keine Zahlen beim Test ein.

Trotzdem bekomme ich die Fehlermeldung "Der Eintrag wurde nicht gespeichert" und es landet nichts in der Datenbank.

Kann mir vielleicht jemand helfen bzw. einen Anschubser geben?

Danke im Voraus.

LG, Robert
 
Hallo mermshaus,

er meldet:

Column count doesn't match value count at row 1

Wenn ich das richtig verstehe deutet das auf ein Problem mit dem INSERT INTO aber was genau?

Danke - LG, Robert
 
Ja. Das heißt, dass du eine unterschiedliche Anzahl VALUES hast als Spalten, in die die Werte eingetragen werden.

Lass dir im Zweifel zusätzlich noch die Query ausgeben und kontrolliere diese von Hand. Kann sein, dass da irgendwo ein Anführungszeichen fehlt oder so.
 
Hallo mermshaus,

ehrlich gesagt bin ich nicht sicher ob ich verstanden habe was ich machen soll. Sorry.

PHP:
            echo $_POST['vorname'];
            echo $_POST['name'];
            echo $_POST['street'];
            echo $_POST['zip'];
            echo $_POST['city'];
            echo $_POST['country'];
            echo $_POST['phone'];
            echo $_POST['email'];
            echo $_POST['tables'];
            echo $_POST['comment'];

Die übernommenen Daten werden korrekt und vollständig angezeigt.

Aber ich glaube Du meintest was anderes. Leider bin ich vom PHP Verständnis noch nicht so weit.

DANKE - LG, Robert
 
PHP:
$sql_insert = "
    INSERT INTO
            `user`
        (
            `vorname`,
            `name`,
            `street`,
            `zip`,
            `city`,
            `country`,
            `phone`,
            `email`,
            `tables`,
            `comment`
        )
    VALUES
        (
            '" . mysql_escape_string($_POST['vorname']) . "',
            '" . mysql_escape_string($_POST['name']) . "',
            '" . mysql_escape_string($_POST['street']) . "',
            '" . mysql_escape_string($_POST['zip']) . "',
            '" . mysql_escape_string($_POST['city']) . "',
            '" . mysql_escape_string($_POST['country']) . "',
            '" . mysql_escape_string($_POST['phone']) . "',
            '" . mysql_escape_string($_POST['email']) . "',
            '" . mysql_escape_string($_POST['tables']) . "',
            '" . mysql_escape_string($_POST['comment']) . "'
        )
    ";

Code:
mysql_escape_string($_POST['tables'])."''".mysql_escape_string($_POST['comment'])

Da fehlte in der Mitte ein Komma. (In meinem Ausschnitt hinzugefügt.)

Ich meinte, dass du dir $sql_insert ausgeben lässt, um die Query von Hand zu kontrollieren.
 
Hallo mermshaus,

vielen, vielen Dank und für die Geduld. Komme aus dem Agrar-Bereich und die Programmierwelt ist doch noch recht ungewohnt.

Eine letzte Frage - gibt es eine einfache Möglichkeit die Daten aus dem Formular auch gleichzeitig noch per Email zu versenden?

Danke - LG, Robert
 
Hallo,

habe mal eine schnelle Version gebastelt. Ist das einigermaßen praktikabel oder eher Murks?

PHP:
    $receivers = array("[email protected]");

        $content = "Anmeldung:\n\r".
             "Vorname: "        . $_POST["vorname"]    ."\n\r".
             "Name: "            . $_POST["name"]    ."\n\r".
             "Straße: "            . $_POST["street"]    ."\n\r".
             "PLZ: "            . $_POST["zip"]        ."\n\r".
             "Ort: "            . $_POST["city"]    ."\n\r".
             "Land: "             . $_POST["country"]    ."\n\r".   
             "Telefon: "        . $_POST["phone"]    ."\n\r".             
             "E-Mail-Adresse: " . $_POST["email"]    ."\n\r".                       
             "Tische: "            . $_POST["tables"]    ."\n\r".
             "Anmerkung: "        . $_POST["comment"]    ."\n\r";

  foreach($receivers as $receiver)
  {
    mail($receiver,"Anmeldung Spinnenbörse",$content,"From: Homepage Anmeldeformular");
  }
        @mysql_close($link);
    }

Danke im Voraus.

LG, Robert
 
\r\n, nicht \n\r.

Das kann hinhauen. Wir empfehlen immer den Einsatz von Mailerklassen. robo47 hat mal gut zusammengefasst, wieso und weshalb:

- Mail() ist tot, es lebe mail()

Der PHPMailer ist okay. (Die anderen auch, aber ich greife mal den heraus.)

Die Klasse wird neuerdings hier entwickelt:

- phpmailer - PHPMailer is a Full Featured Email Transfer Class for PHP - Google Project Hosting

Anleitungen gibt es hier:

- Worx International Inc.



PS: Dein Datenbankcode oben ist wesentlich besser als das, was man hier sonst so im Schnitt sieht.
 
Hi mermshaus,

der Code ist auch nicht von mir sondern aus verschiedenen Quellen zusammengeschraubt und etwas modifiziert. ;)

Soo, meine Lösung mit phpmailer sieht jetzt vorerst so aus:

PHP:
<?php
    require('class.phpmailer.php');
    $mail = new PHPMailer();

    $datenbank_host = 'localhost';
    $datenbank_user = 'xxx';
    $datenbank_passwort = 'xxx';
    $datenbank_name = xxx';

    if (!isset($_POST['senden'])) $_POST['senden'] = '';
    if (!isset($_POST['vorname'])) $_POST['vorname'] = '';
    if (!isset($_POST['name'])) $_POST['name'] = '';
    if (!isset($_POST['street'])) $_POST['street'] = '';
    if (!isset($_POST['zip'])) $_POST['zip'] = '';
    if (!isset($_POST['city'])) $_POST['city'] = '';
    if (!isset($_POST['country'])) $_POST['country'] = '';
    if (!isset($_POST['phone'])) $_POST['phone'] = '';
    if (!isset($_POST['email'])) $_POST['email'] = '';
    if (!isset($_POST['tables'])) $_POST['tables'] = '';
    if (!isset($_POST['offer'])) $_POST['offer'] = '';
    if (!isset($_POST['comment'])) $_POST['comment'] = '';
    
    if ($_POST['senden'] 
    != '' AND $_POST['vorname'] 
    != '' AND $_POST['name'] 
    != '' AND $_POST['street'] 
    != '' AND $_POST['zip'] 
    != '' AND $_POST['city'] 
    != '' AND $_POST['country'] 
    != '' AND $_POST['phone'] 
    != '' AND $_POST['email'] 
    != '' AND $_POST['tables'] 
    != '' AND $_POST['offer'] 
    != '' AND $_POST['comment'] 
    != '') {

        $link = @mysql_connect($datenbank_host, $datenbank_user, $datenbank_passwort);

        if (!$link) { die('keine Verbindung möglich: ' .
                mysql_error());
        }
        
        $db_selected =
            @mysql_select_db($datenbank_name, $link);

        if (!$db_selected) {
            die ('Kann '.$datenbank_name.' nicht benutzen : ' . mysql_error());
        }

        $sql_insert = "INSERT INTO `user`
            (`vorname`,`name`,`street`,`zip`,`city`,`country`,`phone`,`email`,`tables`,`offer`,`comment`)
            VALUES
            ('".mysql_escape_string($_POST['vorname'])."','".mysql_escape_string($_POST['name'])."','".mysql_escape_string($_POST['street'])."','".mysql_escape_string($_POST['zip'])."',
            '".mysql_escape_string($_POST['city'])."','".mysql_escape_string($_POST['country'])."','".mysql_escape_string($_POST['phone'])."','".mysql_escape_string($_POST['email'])."',
            '".mysql_escape_string($_POST['tables'])."','".mysql_escape_string($_POST['offer'])."','".mysql_escape_string($_POST['comment'])."');";
            
        $content = "Anmeldung:\n\r".
             "Vorname: "        . $_POST["vorname"]    ."\r\n".
             "Name: "            . $_POST["name"]    ."\r\n".
             "Straße: "            . $_POST["street"]    ."\r\n".
             "PLZ: "            . $_POST["zip"]        ."\r\n".
             "Ort: "            . $_POST["city"]    ."\r\n".
             "Land: "             . $_POST["country"]    ."\r\n". 
             "Telefon: "        . $_POST["phone"]    ."\r\n".             
             "E-Mail-Adresse: " . $_POST["email"]    ."\r\n".                       
             "Tische: "            . $_POST["tables"]    ."\r\n".
             "Ich biete an: "    . $_POST["offer"]    ."\r\n".
             "Anmerkung: "        . $_POST["comment"]    ."\r\n";

        if (@mysql_query($sql_insert, $link) != false) {

            //$mail->CharSet  =  "utf-8";
            $mail->From = "xxx@xxx";
            $mail->FromName = "xxx";
            $mail->AddAddress("[email protected]");
            $mail->AddBCC("[email protected]");
            $mail->Subject = "Anmeldung";
            $mail->Body = "$content";
                if(!$mail->Send())
            {
                    echo "Die Email konnte nicht gesendet werden";
                    echo "Fehler: " . $mail->ErrorInfo;
            }
                else
            {
                    echo "Die Email wurde versandt.";
            }
        
        } else {

            echo 'Leider gab es ein Problem mit dem Absenden der Registrierung - bitte erneut versuchen!';

        }

        @mysql_close($link);
    }

    echo '<form action="'.htmlspecialchars($_SERVER['PHP_SELF']).'" method="post">';
    echo ' Vorname: <input type="text" name="vorname" value="'.htmlspecialchars($_POST['vorname']).'"/><br/>';
    echo ' Name: <input type="text" name="name" value="'.htmlspecialchars($_POST['name']).'"/><br/><br/>';
    echo ' Strasse: <input type="text" name="street" value="'.htmlspecialchars($_POST['street']).'"/><br/><br/>';
    echo ' PLZ: <input type="text" name="zip" value="'.htmlspecialchars($_POST['zip']).'"/><br/><br/>';
    echo ' Stadt: <input type="text" name="city" value="'.htmlspecialchars($_POST['city']).'"/><br/><br/>';
    echo ' Land: <input type="text" name="country" value="'.htmlspecialchars($_POST['country']).'"/><br/><br/>';
    echo ' Phone: <input type="text" name="phone" value="'.htmlspecialchars($_POST['phone']).'"/><br/><br/>';
    echo ' Email: <input type="text" name="email" value="'.htmlspecialchars($_POST['email']).'"/><br/><br/>';
    echo ' Anzahl Tische: <input type="text" name="tables" value="'.htmlspecialchars($_POST['tables']).'"/><br/><br/>';
    echo ' Ich biete an: <input type="text" name="offer" value="'.htmlspecialchars($_POST['offer']).'"/><br/><br/>';
    echo ' Anmerkung: <input type="text" name="comment" value="'.htmlspecialchars($_POST['comment']).'"/><br/><br/>';
    echo ' <input type="submit" name="senden" value="absenden"/>';
    echo '</form>';
?>

Ist das soweit praktikabel oder nicht so gut gelöst?

Im Moment ist es so, dass es das Formular nicht abschickt wenn ich ein Feld nicht ausfülle. Mit welchem Befehl kann ich festlegen welches Feld Pflicht und welches nur optional ist?

Danke im Voraus.

LG, Robert
 
Bei $datenbank_name fehlt ein Anführungszeichen. Ansonsten sieht es auf den ersten Blick okay aus. Schöner schreiben kann man Dinge immer.

- EVA Prinzip - PHP Forum: phpforum.de

Die Fehlerausgaben etwa nicht an Ort und Stelle vornehmen, sondern erst in Variablen zwischenspeichern und ausgeben, wenn die „Verarbeitung“ insgesamt abgeschlossen ist.
 
Hallo mermshaus,

das Anführungszeichen ist dem Löschen der realen Logindaten zum Opfer gefallen ;) Danke.

Das mit dem EVA Prinzip muss ich mal anschauen ob ich das hinbekomme.


Was ich gerne noch umsetzen würde ist, dass ein Feld als optional gekennzeichnet ist. Mit

check_input

wäre das wohl lösbar. Gibt es noch eine gute Lösung die ich in meinem bestehenden Code realisieren kann?

Danke im Voraus.

LG, Robert
 
Was ist denn check_input?

Theoretisch müsstest du ein Feld nur aus der langen if-Bedingung rausnehmen, um es für optional zu erklären.

Wie gesagt, schöner machen kann man Dinge praktisch immer. Ich sehe an dieser Stelle aber nicht so den großen Zweck, Funktionalität in einer Art Framework zu abstrahieren. Wenn du jetzt ständig neue Formulare auf diese Weise erstellen möchtest, wäre das eine Überlegung wert, aber wenn es eine mehr oder weniger einmalige Sache ist… Höhere Schönheit gegen Praktikabilität.

Um mal anzudeuten, wie man es auch machen kann:

- http://framework.zend.com/manual/en/zend.form.quickstart.html
 
Hi mermshaus,

check_input hatte ich über google gefunden als ich nach optionalen Feldern gesucht habe. Ist wohl eine spezielle Funktion von einem Script gewesen und kein offizieller Befehl.

Ich denke auch, dass es damit erledigt ist. Framework ist nicht notwendig, wird bei diesem Anmeldeformular bleiben. Vielleicht werde ich es bei Zeiten "schöner" machen. Hauptsache es funktioniert und ist einigermaßen sicher.

Meine wirklich letzte Frage wäre bezüglich einer Möglichkeit wie aus der Tabelle 'user' in der DB eine Spalte summieren könnte (das habe ich soweit in einer php schon geschafft) und das Ergebnis speichert. D.h. in der DB soll die Summe einer Spalte aktuell gehalten und als Wert ausgelesen werden um beim Anmeldeformular eine Ausgabe zu machen: echo Anmeldung nur noch auf die Warteliste möglich!.

Hast Du mir da vielleicht einen Tipp bzw. ein Link der sowas in die Richtung beschreibt?

Vielen, vielen Dank!

LG, Robert
 
Hi,

super! Vielen, vielen Dank nochmals für Alles!

Klappt alles und läuft - ohne dich wäre ich wohl verloren gewesen!

Falls Du Chilis magst könnte ich Dir was zukommen lassen ;)

Danke - LG, Robert
 
Zurück
Oben