Neue Seite laden, nachdem das Formular bearbeitet wurde...

blumikus

Erfahrenes Mitglied
Hallo,

ich habe ein Formular, das seine Daten in einer Datenbank speichert. Nun möchte ich gerne, das nachdem es erfolgreich abgearbeitet wurde, eine 'Danke' Seite öffnet.
Mein Problem ist aber, das das Formluar per 'include' eingebunden wird und wenn jetzt die 'Danke' Seite kommt, eine neue Seite öffnet. Kann man das nicht so machen, das dann die 'Danke Botschaft' steht und das Formular weg ist, aber an der gleichen Stelle wo vorher das Formular stand?!
Ist etwas unverständlich oder?

Andreas
 
Hi

include() auf PHP-Seite hat keinen Einfluss darauf, was am Client passiert.
Zeig am besten deinen Code (Formular und PHP), dann werden wir das Problen schon sehen
 
PHP:
<form id="kommentare" action="" method="post">
<div class="row">
     <div class="col-md-6">
         <h5>Bitte geben Sie hier Ihre Daten vollständig ein.</h5>
                <input type="hidden" name="kom_nr" value="Seitenname">
          
                <div class="form-group" id="frmGrpName">
                  <label for="name" class="control-label">Name</label>
                  <input type="text" class="form-control" name="name" placeholder="Max Mustermann" required>
                </div>
              
                <div class="form-group" id="frmGrpEmail">
                  <label for="email" class="control-label">E-Mail Adresse</label>
                  <input type="text" class="form-control" name="email" placeholder="max@mustermann.de" required>
                </div>
              
                <div class="form-group" id="frmGrpNachricht">
                  <label for="nachricht">Kommentar</label>
                  <textarea class="form-control" name="nachricht" rows="5" required></textarea>
                </div>
              
                <div class="form-group text-right" >
                   <button type="reset" class="btn btn-danger">Löschen</button>
                   <button type="submit" class="btn btn-success">Kommentar absenden</button>
                   <input type="hidden" name="insertsent" value="1">
                </div>
     </div>
</div>
</form>

<?php
// Formulardaten überprüfen
$insertsent = isset($_POST['insertsent']) ? $_POST['insertsent'] : '';

$name = isset($_POST['name']) ? $_POST['name']:'';
$email = isset($_POST['email']) ? $_POST['email']:'';
$nachricht = isset($_POST['nachricht']) ? $_POST['nachricht']:'';

           $nachricht = str_replace("ä", "&auml;", $nachricht);
          $nachricht = str_replace("Ä", "&Auml;", $nachricht);
          $nachricht = str_replace("ö", "&ouml;", $nachricht);
          $nachricht = str_replace("Ö", "&Ouml;", $nachricht);
          $nachricht = str_replace("ü", "&uuml;", $nachricht);
          $nachricht = str_replace("Ü", "&Uuml;", $nachricht);
          $nachricht = str_replace("ß", "&szlig;", $nachricht);
          $nachricht = str_replace("<", "<&nbsp;;", $nachricht);
          $nachricht = str_replace(">", ">&nbsp;", $nachricht);
          $nachricht = str_replace("\r\n", "<br />", $nachricht);
        
          $name = str_replace("ä", "&auml;", $name);
          $name = str_replace("Ä", "&Auml;", $name);
          $name = str_replace("ö", "&ouml;", $name);
          $name = str_replace("Ö", "&Ouml;", $name);
          $name = str_replace("ü", "&uuml;", $name);
          $name = str_replace("Ü", "&Uuml;", $name);
          $name = str_replace("ß", "&szlig;", $name);
          $name = str_replace("<", "<&nbsp;;", $name);
          $name = str_replace(">", ">&nbsp;", $name);
        
// Formular vollständig ausgefüllt?
if ($insertsent and $name and $email and $nachricht)
{
include('connect_xyz.inc.php');

// Daten aus dem Formular holen
$name = isset($_POST['name']) ? $_POST['name'] : '';
$email = isset($_POST['email']) ? $_POST['email'] : '';
$nachricht = isset($_POST['nachricht']) ? $_POST['nachricht'] : '';
$kom_nr = isset($_POST['kom_nr']) ? $_POST['kom_nr'] : '';
// $seiten_id = $_POST['kom_nr'];

// Bestelldatum ermitteln
$datum = date("d.m.Y");
$uhrzeit = date("H:i");

// echo $_POST["kom_nr"];

// Daten in die DB Eintragen
$sqlin = 'INSERT INTO tabelle (id, seiten_id, name , nachricht ,email, datum)
VALUES (NULL , \''.$kom_nr.'\',\''.$name.'\', \''.$nachricht.'\',\''.$email.'\', \''.$datum.'\' )';

$ergin = mysql_query ($sqlin, $db) or die ("Fehlermeldung:".mysql_error());

// e-Mail für Mich
$empfaenger = "meine@adresse.de";
$absendername = "Kommentarformular";
$absendermail = "server@adresse.de";
$betreff = "ein neuer Kommentar für - $kom_nr";
$text = "Am $datum um $uhrzeit Uhr wurde folgendes an Modell-Art gepostet.\n
##########################################
# Vor der Freischaltung bitte Überprüfen #
##########################################\n
Seite: $kom_nr \n
Verfasser: $name \n
email: $email\n
Kommentar:
$nachricht\n

";
mail($empfaenger, $betreff, $text, "From: $absendername <$absendermail>");

// Danke Seite öffnen
echo "<div class='alert alert-danger' role='alert'><h4>Vielen Dank.</h4>Wir haben Ihren Kommentar erhalten und werden ihn nach einer Prüfung frei schalten.<br /><br /><small>Webmaster</small></div>";

}

?>

So wie es jetzt hier steht, erscheint die 'Danke Seite' unterhalb vom Formular.
 
(Das Formular wird da aber nicht included)

Die Lösung für das gefragte Problem:
Formular und PHP in zwei getrennte Dateien tun und beim Formular bei action="" auch den Namen der PHP-Datei eintragen.

ABER, dieses ganze Script gehört zu 100% geändert.
Es so zu betreiben wird erstens oft nicht oder nicht richtig funktionieren, und zweitens hast du mehrere Sicherheitsprobleme (die zB. dabei helfen, anderen Leuten von deinem Server aus Viren unterzuschieben, deine DB kaputtzumachen, usw.usw.)

Die Punkte, die mir auffallen, in keiner bestimmten Reihenfolge, als Startpunkt zum weiterinformieren:

Wofür ist die Sache mit insertsent gut? Wenn es ein Captcha sein soll ist es ziemlich nutzlos. Besser eines der bewährten Captchasysteme verwenden.

Folgender Block ist zweimal vorhanden, wieso? Außerdem gibts beim zweiten Mal eine Variable mehr.
PHP:
$name = isset($_POST['name']) ? $_POST['name']:'';
$email = isset($_POST['email']) ? $_POST['email']:'';
$nachricht = isset($_POST['nachricht']) ? $_POST['nachricht']:'';

Folgender Block ist a) komplett sinnlos, weil die Variablen später wieder überschrieben werden, und b) ein Zeichen dass du dich mit der richtigen Setzung von Zeichensätzen beschäftigen solltest, c) ein Zeichen, dass du dich mit htmlspecialchars und striptags beschäftigen musst, d) ein Zeichen, dass du dich mit Contenttypen in Mails beschäftigen sollztest (angefangen mit Text vs Html), e) für alle drei Zwecke, die du da vielleicht im Sinn hattest, ist dieser Code jedenfalls nicht genug.
PHP:
$nachricht = str_replace("ä", "&auml;", $nachricht);
          $nachricht = str_replace("Ä", "&Auml;", $nachricht);
          $nachricht = str_replace("ö", "&ouml;", $nachricht);
          $nachricht = str_replace("Ö", "&Ouml;", $nachricht);
          $nachricht = str_replace("ü", "&uuml;", $nachricht);
          $nachricht = str_replace("Ü", "&Uuml;", $nachricht);
          $nachricht = str_replace("ß", "&szlig;", $nachricht);
          $nachricht = str_replace("<", "<&nbsp;;", $nachricht);
          $nachricht = str_replace(">", ">&nbsp;", $nachricht);
          $nachricht = str_replace("\r\n", "<br />", $nachricht);
       
          $name = str_replace("ä", "&auml;", $name);
          $name = str_replace("Ä", "&Auml;", $name);
          $name = str_replace("ö", "&ouml;", $name);
          $name = str_replace("Ö", "&Ouml;", $name);
          $name = str_replace("ü", "&uuml;", $name);
          $name = str_replace("Ü", "&Uuml;", $name);
          $name = str_replace("ß", "&szlig;", $name);
          $name = str_replace("<", "<&nbsp;;", $name);
          $name = str_replace(">", ">&nbsp;", $name);

Diese Zeile:
PHP:
if ($insertsent and $name and $email and $nachricht)
soll was genau prüfen? Ob Variablen existieren und/oder nicht null sind etc. prüft man nicht so, und außerdem existieren sie dank dem Code weiter oben ja immer und sind auch nie null. Eine Prüfung, ob sie getrimmt nicht leer sind, ob die Mailadresse gültig ist usw. wäre sinnvoller. (Speziell auch, da bei Nicht-Vorhandensein oben ein leerer Inhalt gesetzt wird, und das "nie" geprüft wird. Ein leeres Email an Leer.)

PHP:
$sqlin = 'INSERT INTO tabelle (id, seiten_id, name , nachricht ,email, datum)
VALUES (NULL , \''.$kom_nr.'\',\''.$name.'\', \''.$nachricht.'\',\''.$email.'\', \''.$datum.'\' )';
Sql-Injection, Sicherheit, siehe Prepared Statements mit MysqlI (das ist der Buchstabe i am Schluss).

PHP:
$ergin = mysql_query ($sqlin, $db) or die ("Fehlermeldung:".mysql_error());
Die "mysql_" - Funktionen gibts eigentlich nicht mehr. Seit mehr als 10 Jahren gibts was Besseres, in den letzten paar Jahren hat man bei jeder Verwendung dieser Funktionen eine Fehlermeldung bekommen (vorausgesetzt, man hat sie auch gelesen) (aber funktioniert hats trotzdem noch), und seit PHP7 gibts die Funktionen gar nicht mehr und damit funktionieren sie auch nicht mehr. Wenn sie bei dir noch funktionieren ist das a) ein Zeichen, dass du PHP updaten solltest, der Support für die letzte PHP-Version mit den Funktionen wird dieses Monat nämlich beendet, b) sowieso kein Grund, noch immer Code zu schreiben, der mit neuer SOftware nicht mehr funktioniert.

PHP:
$betreff = "ein neuer Kommentar für - $kom_nr";
$text = "Am $datum um $uhrzeit Uhr wurde folgendes an Modell-Art gepostet.\n
##########################################
# Vor der Freischaltung bitte Überprüfen #
##########################################\n
Seite: $kom_nr \n
Verfasser: $name \n
email: $email\n
Kommentar:
$nachricht\n
 
";
mail($empfaenger, $betreff, $text, "From: $absendername <$absendermail>");
Ich nenn das einmal "EMail-Injection", siehe "SQL-Injection" oben.
Hier gibts eine Menge Möglichkeiten, mit absichtlich falschen Eingaben ungewollte Effekte zu erreichen, zB. Senden von beliebigen Dateien (Viren...), beliebigen eingebundenen Webseiten (Werbung...), und so ziemlich allem anderen an dich oder auch beliebige andere Leute (= dein Server wird für Spam missbraucht).

Und zum echo am Schluss: Falls man "nicht" erfolgreich zu dieser Stelle kommt, sollte der Benutzer auch eine Meldung bekommen, warum (statt nur einer weißen Seite). => Fehlerbehandlung nach jedem if, jeder Funktion usw.
 
Zurück