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

HTML/php Formular wird doppelt gesendet

schlonzo

Neues Mitglied
Hallo miteinander,

ich hab hier ein kleines Problem aus dem ich nicht schlau werden. Ich erzeuge in einer php Datei mittels echo ein HTML-Formluar.

PHP:
echo "
  <form name=\"formNewUser\" id=\"formNewUser\" method=\"post\" action=\"newuser.php\">
    <table>
      <tr name=\"trNewUser\" id=\"trNewUser\" style=\"visibility:collapse;\">
        <td>
          <input type=\"text\" name=\"textBoxNewUserNickname\" id=\"textBoxNewUserNickname\" style=\"width:100px;\" />
        </td>
        <td>
          <input type=\"text\" name=\"textBoxNewUserFirstName\" id=\"textBoxNewUserFirstName\" style=\"width:100px;\" />
        </td>
        <td>
          <input type=\"text\" name=\"textBoxNewUserLastName\" id=\"textBoxNewUserLastName\" style=\"width:100px;\" />
        </td>
        <td>
          <input type=\"text\" name=\"textBoxNewUserPassword\" id=\"textBoxNewUserPassword\" style=\"width:100px;\" />
        </td>
        <td colspan=\"2\" align=\"center\">
          <input type=\"submit\" id=\"buttonNewUserSave\" value=\"Speichern\" style=\"align:center;\" />
        </td>
      </tr>
    </table>
  </form>
";
Das erzeugte HTML im Browser sieht dann so aus:

HTML:
<form name="formNewUser" id="formNewUser" method="post" action="newuser.php">
  <table>
    <tr name="trNewUser" id="trNewUser" style="visibility:collapse;">
      <td>
        <input type="text" name="textBoxNewUserNickname" id="textBoxNewUserNickname" style="width:100px;" />
      </td>
      <td>
        <input type="text" name="textBoxNewUserFirstName" id="textBoxNewUserFirstName" style="width:100px;" />
      </td>
      <td>
        <input type="text" name="textBoxNewUserLastName" id="textBoxNewUserLastName" style="width:100px;" />
      </td>
      <td>
        <input type="text" name="textBoxNewUserPassword" id="textBoxNewUserPassword" style="width:100px;" />
      </td>
      <td colspan="2" align="center">
        <input type="submit" id="buttonNewUserSave" value="Speichern" style="align:center;" />
      </td>
    </tr>
  </table>
</form>
In der Datei newuser.php wird dann der neue Benutzer in der Datenbank eingetragen. Allerdings passiert hier was komisches. Die Seite newuser.php wird scheinbar zweimal aufgerufen, denn bei jedem Abschicken des Formulars habe ich zwei neue Einträge in der Datenbank. Der erste der beiden Einträge beinhaltet nur Leerstrings und der zweite der beiden Einträge enthält dann die korrekten, von mir ins Formular, eingegebenen Daten.

Hab ihr eine Idee, woran das liegen könnte?

newuser.php:
PHP:
<?php
session_start ();
include("dbconnect.php");

if(isset($_SESSION["USER_ISADMIN"])){
        header ("Location: admin.php");

        $USER_NICKNAME = $_POST["textBoxNewUserNickname"];
        $USER_FIRSTNAME = $_POST["textBoxNewUserFirstName"];
        $USER_LASTNAME = $_POST["textBoxNewUserLastName"];
        $USER_PASSWORD = $_POST["textBoxNewUserPassword"];

        $sql = "
        INSERT INTO T_USER
        (USER_NICKNAME, USER_FIRSTNAME, USER_LASTNAME, USER_PASSWORD)
        VALUES
        ('".$USER_NICKNAME."', '".$USER_FIRSTNAME."', '".$USER_LASTNAME."', '".md5($USER_PASSWORD)."') ";

        $result = $db->query($sql);
        if (!$result) {
                die ($db->error);
        }
        unset($result);

}
?>
Grüße Schlonzo
 
Hey,

wow danke für die schnellen Antworten. Also SQL-Injektionen sind ein offenes Thema, das ist richtig. Allerdings wollte ich es erstmal überhaupt schaffen, dass es richtig läuft bevor ich mich mit den Injektionen auseinander setze. Aber danke auf jeden Fall für den Hinweis.
Macht es denn eigentlich einen Unterschied, ob ich einfache oder doppelte Anführungszeichen verwende? Abgesehen davon, dass ich die dann nicht escapen muss?

Die Datenbank-Klasse ist eigentlich relativ unspektakulär, aber hier ist sie mal:
PHP:
<?php
   $db = @new mysqli('localhost', 'Benutzer', 'Passwort', 'Datenbank');
   $db->set_charset("utf8");
   if (mysqli_connect_errno()) {
      die ('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');
   }
?>
 
Ja macht einen unterschied, weil wenn du doppelte nimmst musst du alle HTML-Attribute escapen musst.
naja dann zeig mal deine query()-Funktion
 
Ja genau das war ja auch der einzige Unterschied der mir bekannt war, dass ich die escapen muss. Was meinst du denn mit zeig mal deine query()-Funktion? Das INSERT Query ist in newuser.php enthalten (s.o.).

Grüße Schlonzo
 
Es ist Unsinn, sich ganze Formulare mit PHP ausgeben zu lassen.
PHP:
<?php
// php
?>

<!-- Dein Formular -->

<?php
// php

Fertig.
 
Es ist Unsinn, sich ganze Formulare mit PHP ausgeben zu lassen.
PHP:
<?php
// php
?>

<!-- Dein Formular -->

<?php
// php

Fertig.

Richtig, aber da das fertige HTML, das beim Client ankommt, richtig ist (zumindest meiner Meinung nach - korrigiert mich, wenn ich falsch liege), dient das nicht der Problemlösung.
 
Das war auch nicht meine Absicht.

Code:
header ("Location: admin.php");

// weiterer Code
Du sendest den header, bevor du überhaupt einen Eintrag vornimmst. Die Weiterleitung solltest du am Ende der Bedingung einbauen und danach noch ein exit; einfügen.

Wird dein Script vielleicht noch irgendwo eingebunden (include)? Ist die admin.php relevant?

[Ergänzung]
http://de2.php.net/manual/de/function.header.php
Hinweis: HTTP/1.1 verlangt einen absoluten URI inklusive dem Schema, Hostnamen und absoluten Pfad als Argument von » Location:, [...]
 
Also hab jetzt den Teil mit dem Header komplett auskommentiert, um sicher zu gehen, dass der net für den Ärger verantwortlich ist. Und ich habe immernoch das gleiche Fehlverhalten. Echt komisch :-(
 
' ist viel schneller als ", innerhalb von ' wird nicht nach variabeln gesucht

beispiel

$foo = 'test';
echo "$foo"; // -> test
echo '$foo'; -> $foo

" benutzt man einfach gar nicht....
 
Also ich habe jetzt die Ursache ausgemacht - zwar etwas unbefriedigend, aber zumindest weiß ich jetzt woran es liegt.

Die Idee im Header den gesamten Pfad anzugeben hat mich auf den richtigen Weg geführt. Ich habe auch bei den Formularen im action Attribut den gesamten Pfad eingegeben und plötzlich hatte ich nur den leeren Eintragin der Datenbank. Sehr seltsam dachte ich mir. Es hat erst funktioniert, als ich den dyndns Pfad vollständig eingegeben habe.

Hintergrund:
Ich habe eine Domain Domain.de - Domains registrieren und verwalten - Ihre Online-Plattform f . Diese leite ich weiter an domain.dyndns.org. Verwende ich in der action der form Domain.de - Domains registrieren und verwalten - Ihre Online-Plattform f so werden die Leerstrings in die Datenbank eingetragen. Verwende ich allerdings domain.dyndns.org/newuser.php, so klappt es und ich habe den gewünschten Eintrag in der Datenbank. Ist erstmal OK so, gefällt mir aber nicht wirklich gut, weil ich jetzt in der Adressleiste des Browsers immer die dyndns.org Adresse drin habe statt der Domain.de - Domains registrieren und verwalten - Ihre Online-Plattform f . Naja...

@freak131: Danke für den Tipp mit den Anführungszeichen. Das mit den Variablen wusste ich nicht. Bin eher sehr selten mit php zu Gange und kenne die Kniffe (noch) nicht.
 
Zurück
Oben