Dio: HTML Formular in SQL - Fehler

Hallo Leute

Mir fallen gleich die Haare aus ^^ Ich versuche Daten aus einem HTML Formular per PHP in eine DB zu schreiben, aber er schreibt von 4 Werten nur einen rein. Ich finde einfach den Fehler nicht.

Zunächst das HTML Formular in der startseite.html:

...
<form action="user_neu.php" method="POST">

<p>Vorname:<br><input vname="vname" type="text" size="30" maxlength="30"></p>
<p>Nachname:<br><input name="name" type="text" size="30" maxlength="40"></p>
<p>Mail Adresse:<br><input mail="mail" type="text" size="30" maxlength="40"></p>
<p>Passwort:<br><input pass="pass" type="text" size="30" maxlength="40"></p>
<input type="submit"> <input type="reset">
</form>
...

---------
Nun die user_neu.php:

<?php
// DB Variablen
include "db_variablen.php";

// Die Prüfroutine:
include "check.php";

if (check()) {
if (isset( $_POST['name'] ))
{
// Maskierende Slashes aus POST entfernen
    $_POST = get_magic_quotes_gpc() ? array_map( 'stripslashes', $_POST ) : $_POST;

// Inhalte der Felder aus dem Formular startseite.html POST holen
    $vname = $_POST['vname'];
    $name = $_POST['name'];
    $mail = $_POST['mail'];
    $pass = $_POST['pass'];

// Verbindung oeffnen und Datenbank ausweahlen
   $conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Die Datenbank konnte nicht erreicht werden!" );
    if ($conID)
    {
        mysql_select_db( $db_name, $conID );    }

// Kontrolle - kann danach wieder weg
echo $vname;
echo $name;
echo $mail;
echo $pass;
// ***********************************

mysql_query("INSERT INTO x_user(vname, name, mail, pass)VALUES('$vname','$name','$mail','$pass')");

// Pruefen ob der neue Datensatz tatsaechlich eingefuegt wurde
    if (mysql_affected_rows() == 1)
    {
        //echo "<h3>Deine Daten wurden erfolgreich hinzugefügt!</h3><br><br>";
    }
    else
    {
        echo "<h3>Der Datensatz konnte <strong>nicht</strong> hinzugefügt werden oder existiert schon!</h3>";
    }
}
// Check IF Schleife zu:
}
else {
echo " ";
}
?>
-------
Auch der Kontrollabschnitt (echo) gibt nur die Daten aus dem Feld name aus. In der Datenbank wird nur das Feld name ausgefüllt... Wo liegt der Fehler?

Grüße, Dio

  1. Hi,

    Auch der Kontrollabschnitt (echo) gibt nur die Daten aus dem Feld name aus. In der Datenbank wird nur das Feld name ausgefüllt... Wo liegt der Fehler?

    In den Phantasie-Attributen, die du dir ausgedacht hast:

    <p>Vorname:<br><input vname="vname" type="text" size="30" maxlength="30"></p>
    <p>Nachname:<br><input name="name" type="text" size="30" maxlength="40"></p>
    <p>Mail Adresse:<br><input mail="mail" type="text" size="30" maxlength="40"></p>
    <p>Passwort:<br><input pass="pass" type="text" size="30" maxlength="40"></p>

    Einzig das zweite von diesen Inputfeldern hat ein korrektes name-Attribut - bei den restlichen hast du dir Attribute ausgedacht, die es gar nicht gibt, statt auch dort das name-Attribut korrekt zu verwenden.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. OMG!

      Danke... manchmal ist man echt mit dem Hammer gepudert...

      Grüße, Dio

  2. Hi!

    Ich versuche Daten aus einem HTML Formular per PHP in eine DB zu schreiben, aber er schreibt von 4 Werten nur einen rein. Ich finde einfach den Fehler nicht.

    Wer ist "er"? Diese Frage solltest du zunächst mit einem grundlegenden Debugging zu klären versuchen. Es gibt nämlich viele einzelen Stellen, die dein "er" sein können. Erste Frage ist: Kommen denn überhaupt Daten im Script an? Dazu sollte man eine Kontrollausgabe des $_POST-Arrays machen, was mit print_r() oder var_dump() gut geht, davor ein <pre> erhöht die Übersichtlichkeit der Ausgabe.

    <p>Vorname:<br><input vname="vname" type="text" size="30" maxlength="30"></p>

    Wie ChrisB schon herausgefunden hat, hast du falsche Attributnamen verwendet. Zu den Feldern wirst du keinen Eintrag im $_POST-Array erhalten. Damit weißt du, dass dein Problem schon vor dem PHP-Script-Start liegen muss.

    Wenn dir die falschen Schreibweisen nicht auffallen, kannst du einen Validator über den HTML-Code laufen lassen, der sollte Fehler finden (wenn du nicht gerade einen anderweitig definierten Attributnamen verwendet hast).

    // Inhalte der Felder aus dem Formular startseite.html POST holen
        $vname = $_POST['vname'];
        $name = $_POST['name'];
        $mail = $_POST['mail'];
        $pass = $_POST['pass'];

    Warum das Umkopieren?

    // Verbindung oeffnen und Datenbank ausweahlen
       $conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Die Datenbank konnte nicht erreicht werden!" );

    die() ist üblicherweise keine angemessene Fehlerbehandlung. Die Information, dass die Datenbank defekt ist, interessiert zwar dich als Admin (dann aber auch mit einer genauen Fehlermeldung), aber nicht die Anwender. Überleg dir eine Alternative, wie der Anwender im Fehlerfall doch noch zum Ziel kommen kann, sonst hast du ihn möglicherweise an die Konkurrenz verloren.

    if ($conID)
        {
            mysql_select_db( $db_name, $conID );    }

    Wenn das Script wegen des Fehlers bereits gestorben ist, brauchst du auch nicht mehr zu prüfen, ob es einen Fehler gab oder nicht. Andererseits hast du hier schon eine Prüfung und rennst nicht blind weiter und kannst damit das "or die()" entfernen. Jedoch solltest du nicht nur das DB-Selektieren vom Erfolg der Verbindung abhängig machen, sondern auch den Rest der DB-Abfrage.

    // Kontrolle - kann danach wieder weg
    echo $vname;
    echo $name;
    echo $mail;
    echo $pass;
    Auch der Kontrollabschnitt (echo) gibt nur die Daten aus dem Feld name aus.

    Ach, da ist ja eine Kontrollausgabe. Warum schreibst du dann was von "schreibt nicht rein", wenn du doch offensichtlich schon eher ein Problem festgetellt hast und das Nicht-Reinschreiben damit nur noch ein Folgefehler ist?

    mysql_query("INSERT INTO x_user(vname, name, mail, pass)VALUES('$vname','$name','$mail','$pass')");

    Unbedingt den Kontextwechsel beachten. Das Nichtbeachten ist einer der am weitesten verbreiteten und damit mit hohem Erfolg ausnutzbare Sicherheitslücke. Bei der Kontrollausgabe ist er nicht weiter tragisch. Aber bei jedem Code, der bleiben soll, muss die Kontextbehandlung immer gleich mit eingebaut werden.

    // Pruefen ob der neue Datensatz tatsaechlich eingefuegt wurde
        if (mysql_affected_rows() == 1)
        {
            //echo "<h3>Deine Daten wurden erfolgreich hinzugefügt!</h3><br><br>";
        }

    Auch mysql_query() gibt über seinen Rückgabewert bekannt, ob die Aktion erfolgreich war oder nicht. Frag lieber den ab. Andere Funktionen kannst du dann immer noch bemühen, wenn du deren Information benötigst. Selbst wenn du sicher bist, dass du keinen Syntaxfehler in das SQL-Statement eingebaut hast und auch mit der Beachtung des Kontextwechsels dafür sorgst, dass keiner mit unerwarteten Werten einen einbaut, kann eine Abfrage schiefgehen (dem DBMS grad eben unpässlich geworden, Speicher reicht nicht, irgendwas ist immer). Auch hier ist ein Prüfen auf Fehler angebracht.

    // Check IF Schleife zu:

    Ein if ist eine Weggablung aber keine Schleife.

    Wo liegt der Fehler?

    Es ist immer wieder erstaunlich, wieviele Fehler man in wie wenig Code unterbringen kann.  :-)

    Lo!