HTML-Formular PHP-Post an sich selbst, um zu validieren oder an eine neue Seite zu senden
Lesezeit: 7 Minuten
Entschuldigung im Voraus. Heute ist mein erster Tag mit PHP und ich habe endlich herausgefunden, wie ich meine Seite dazu bringen kann, wieder auf sich selbst zu posten (ich hatte die Seite als .html statt als .php), aber jetzt habe ich Probleme herauszufinden, wie um die Daten auf eine neue Seite zu bringen, nachdem das Formular validiert wurde. Ich arbeite schon eine ganze Weile daran und bin frittiert. Hier ist ein einfaches Beispiel:
<!DOCTYPE HTML>
<html>
<head>
<style>
.error {color: #FF0000;}
</style>
</head>
<body>
<?php
// Initialize variables and set to empty strings
$firstName=$lastName="";
$firstNameErr=$lastNameErr="";
// Validate input and sanitize
if ($_SERVER['REQUEST_METHOD']== "POST") {
if (empty($_POST["firstName"])) {
$firstNameErr = "First name is required";
}
else {
$firstName = test_input($_POST["firstName"]);
}
if (empty($_POST["lastName"])) {
$lastNameErr = "Last name is required";
}
else {
$lastName = test_input($_POST["lastName"]);
}
}
// Sanitize data
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
<h2>Find Customer</h2>
<p><span class="error">* required</span></p>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>" method="post">
First Name: <input type="text" name="firstName" value="<?php echo $firstName; ?>"><span class="error">* <?php echo $firstNameErr; ?></span><br><br>
Last Name: <input type="text" name="lastName" value="<?php echo $lastName; ?>"><span class="error">* <?php echo $lastNameErr; ?><br><br>
<input type="submit">
</form>
</body>
</html>
OK. Oben sehen Sie, dass das Formular an sich selbst zurückschreibt, damit es validiert werden kann. Gut. Wenn man bedenkt, dass alle Dinge gültig sind, wie poste ich nun in ein anderes Skript (action=”otherAction.php”, vielleicht?), damit die Daten tatsächlich verarbeitet werden können?
Auch Sicherheitsvorschläge sind willkommen. Ich habe mein Bestes getan, um die Sicherheit zu berücksichtigen. Danke.
Drixson Oseña
Wenn alle Ihre Bedingungen erfüllt sind, können Sie verwenden header('Location: http:mywebsite.com/otherAction.php')
// Validate input and sanitize
if ($_SERVER['REQUEST_METHOD']== "POST") {
$valid = true; //Your indicator for your condition, actually it depends on what you need. I am just used to this method.
if (empty($_POST["firstName"])) {
$firstNameErr = "First name is required";
$valid = false; //false
}
else {
$firstName = test_input($_POST["firstName"]);
}
if (empty($_POST["lastName"])) {
$lastNameErr = "Last name is required";
$valid = false;
}
else {
$lastName = test_input($_POST["lastName"]);
}
//if valid then redirect
if($valid){
header('Location: http://mywebsite.com/otherAction.php');
exit();
}
}
In einigen meiner Arbeiten ist mein Setup so, aber ich habe hier etwas nicht Gutes gelernt. Das heißt, wenn Sie die Seite nach dem Absenden des Formulars aktualisieren, bleiben die POST-Werte erhalten und können für duplizierte Einträge verwendet werden. Was IMO nicht gut ist.
Beachten Sie, dass Sie verwenden sollten exit() direkt nach der Weiterleitung aus Sicherheitsgründen.
– invisal
16. September ’13 um 3:43
Hallo @invisal, würde es Ihnen etwas ausmachen, einige Links zu teilen. So kann ich es besser verstehen. Danke!
– Drixson Oseña
16. September ’13 um 3:50
stackoverflow.com/questions/2747791/…
– invisal
16. September ’13 um 3:57
@DrixsonOseña Das header('Location: http:mywebsite.com/otherAction.php') sollte sein header('Location: http://mywebsite.com/otherAction.php'); – du hast verpasst // und abschließendes Semikolon. Es ist immer am besten, es dort einzutragen.
– Funk Forty Niner
16. Sep. ’13 um 13:17
@Jaikrat Sie haben $_POST verloren, wenn Sie umleiten. Es gibt zwei Möglichkeiten, dies zu lösen mywebsite.com/page/page?userid=12
– Drixson Oseña
28. Januar ’16 um 0:22
Lazik
Verwenden Sie Javascript zur Validierung und senden Sie dann das Postformular an sich selbst oder an eine andere Seite, auf der es mit den Daten arbeiten kann.
<!DOCTYPE html>
<html>
<head>
<script>
function validateForm()
{
var x=document.forms["myForm"]["fname"].value;
if (x==null || x=="")
{
alert("First name must be filled out");
return false;
}
}
</script>
</head>
<body>
<form name="myForm" action="demo_form.php" onsubmit="return validateForm()" method="post">
First name: <input type="text" name="fname">
<input type="submit" value="Submit">
</form>
</body>
</html>
<!DOCTYPE HTML>
<html>
<head>
<style>
.error {color: #FF0000;}
</style>
</head>
<body>
<?php
// Initialize variables and set to empty strings
$firstName=$lastName="";
$firstNameErr=$lastNameErr="";
// Control variables
$app_state = "empty"; //empty, processed, logged in
$valid = 0;
// Validate input and sanitize
if ($_SERVER['REQUEST_METHOD']== "POST") {
if (empty($_POST["firstName"])) {
$firstNameErr = "First name is required";
}
else {
$firstName = test_input($_POST["firstName"]);
$valid++;
}
if (empty($_POST["lastName"])) {
$lastNameErr = "Last name is required";
}
else {
$lastName = test_input($_POST["lastName"]);
$valid++;
}
if ($valid >= 2) {
$app_state = "processed";
}
}
// Sanitize data
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
if ($app_state == "empty") {
?>
<h2>Find Customer</h2>
<p><span class="error">* required</span></p>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>" method="post">
First Name: <input type="text" name="firstName" value="<?php echo $firstName; ?>"><span class="error">* <?php echo $firstNameErr; ?></span><br><br>
Last Name: <input type="text" name="lastName" value="<?php echo $lastName; ?>"><span class="error">* <?php echo $lastNameErr; ?><br><br>
<input type="submit">
</form>
</body>
</html>
<?php
}
elseif ($app_state == "processed") {
if ($firstName == "Vincent") {
$app_state = "Logged in";
}
}
if ($app_state == "Logged in") {
echo("Logged in<br> Hello Vincent</body></html>");
}
?>
Also sollte ich nur Javascript anstelle von PHP verwenden, um Formulardaten zu validieren?
– vincent
16. September ’13 um 3:35
So ist es besser, der Benutzer muss keine Seiten neu laden, wenn etwas mit seiner Eingabe nicht stimmt. Sie können auf der Landingpage des Formulars weiterhin eine zusätzliche PHP-Validierung/-Bereinigung durchführen.
– Lazik
16. September ’13 um 3:36
OK. Ich habe die meisten dieser Inhalte von w3 Verknüpfung, vielleicht bin ich bei der Verwendung verwirrt? Wenn ein Formular vor dem Absenden validiert werden muss – beispielsweise an eine Datenbank zum Abfragen oder Einfügen – sollte Javascript verwendet werden, weil eine zusätzliche PHP-Aktion/-Anweisung ineffizient/falsch/überflüssig ist? Will nur verstehen.
– vincent
16. September ’13 um 3:44
@vincent, Javascript ist ein nettes Feature, aber es ist nur optional. PHP ist ein MUSS, weil es Ihre letzte Verteidigung gegen schreckliche Daten ist. Normalerweise kann Javascript deaktiviert werden. Die Leute können die Javascript-Validierung leicht umgehen.
– invisal
16. September ’13 um 3:45
Es ist keine Umleitung erforderlich, die gesamte Logik kann auf der PHP-Landing-Seite stattfinden.
– Lazik
16. September ’13 um 3:59
Sie können überprüfen, ob ungültige Daten vorhanden sind, wenn keine ungültigen Daten vorhanden sind, verarbeiten und dann umleiten. Beispielsweise
if (empty($firstNameErr) && empty($lastNameErr)) {
// process the data
// redirect to other page.
header('LOCATION: index.php');
exit();
}
Beachten Sie, dass Sie diesen Code ausführen müssen, bevor Sie HTML ausgeben, sonst können Sie die Umleitung nicht durchführen. Beispielsweise:
<?php
// validate the data
// no error, proccess, then, redirect
?>
html code here.
Dies sollte direkt unter den Rest meiner Wenn/Sonst-Verarbeitung gehen, oder? Ist dies eine effizientere Vorgehensweise, da eine neue Variable nicht instanziiert werden muss? (Zugegeben, der Leistungsgewinn wird vernachlässigbar sein) Gibt es andere Vorteile gegenüber der Antwort von @Drixson?
– vincent
16. September ’13 um 4:05
@vincent, Drixsons Antwort und meine Antwort verwenden im Grunde das gleiche Konzept mit einem etwas anderen Ansatz. Normalerweise wäre die Antwort von Drixson schneller, wenn viele Felder validiert werden müssen. Da es nur zwei Felder gibt, ist der Leistungsunterschied zu klein, um keinen Unterschied zu machen. (auch bei viel Feld ist der Leistungsunterschied noch zu gering)
– invisal
16. September ’13 um 4:19
@vincent, du solltest jedoch hinzufügen exit(); direkt nach der Header-Umleitung, weil die Header-Umleitung einfach den Header an den Browser des Benutzers sendet, um die Umleitung anzufordern. Benutzer mit falscher Absicht können die Umleitungsanfrage ignorieren.
– invisal
16. September ’13 um 4:21
danke für die erklärung – das macht Sinn. Außerdem habe ich “exit;” pro der von Ihnen verlinkten Seite hinzugefügt. Vielen Dank für Ihren Hinweis auf die offene Sicherheitslücke.
– vincent
16. September ’13 um 5:12
Sich auf eine solche Weiterleitung zu verlassen, ist schlecht für SEO, wenn Sie sich mit diesem Zeug beschäftigen. Für SEO wäre es besser, wenn Ihr Formular auf natürliche Weise auf einer anderen Seite veröffentlicht würde.
.
4359600cookie-checkHTML-Formular PHP-Post an sich selbst, um zu validieren oder an eine neue Seite zu sendenyes