login.php input leeren nach zweitem submit (error)
derjakobofficial
- html
- php
Ich habe n Problem. Ich arbeite gerade an einem Login. Ich habe einen error eingebaut wenn man ein Feld leer lässt. Desweiteren habe ich php benutzt um nach action="login.php" und bzw nach einem error die inhalte drin bleiben. Jetzt möchte ich aber gern das bei einem erfolg also bei
else {
echo "<p class='php'>Danke ".(htmlspecialchars(stripslashes(trim($_POST["vorname"]))))."<br> für deine Registrierung!</p>";
soll alles gelöscht werden also iwie alle php sachen vorher stoppen oder bei der letzten ifelse ein input clear all sowas in der art. bei Fragen im Code eifach schreiben ....
<div class="site">
<div class="box" style="height:760px;">
<div class="background" style="height:760px;"></div>
<div class="content" style="height:760px;">
<center><p>Mach mit bei <b>Homeworker.de</b></p>
<p>Jetzt kostenlos registrieren!</p><br>
<form action="login.php" method="post">
<input type="text" placeholder="Vorname" value="<?php echo htmlspecialchars(stripslashes(trim($_POST["vorname"]))); ?>" name="vorname">
<input type="text" placeholder="Nachname" value="<?php echo htmlspecialchars(stripslashes(trim($_POST["nachname"]))); ?>" name="nachname">
<div class="date"><br><br>
<select name="date_day">
<option value="DD"><?php echo htmlspecialchars(stripslashes(trim($_POST["date_day"]))); ?></option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
</select>
<select name="date_month">
<option value="MM"><?php echo htmlspecialchars(stripslashes(trim($_POST["date_month"]))); ?></option>
<option value="Januar">Januar</option>
<option value="Februar">Februar</option>
<option value="März">März</option>
<option value="April">April</option>
<option value="Mai">Mai</option>
<option value="Juni">Juni</option>
<option value="Juli">Juli</option>
<option value="August">August</option>
<option value="September">September</option>
<option value="Oktober">Oktober</option>
<option value="November">November</option>
<option value="Dezember">Dezember</option>
</select>
<select name="date_year" >
<option value="YYYY"><?php echo htmlspecialchars(stripslashes(trim($_POST["date_year"]))); ?></option>
<option value="2006">2006</option>
<option value="2005">2005</option>
<option value="2004">2004</option>
<option value="2003">2003</option>
<option value="2002">2002</option>
<option value="2001">2001</option>
<option value="2000">2000</option>
<option value="1999">1999</option>
<option value="1998">1998</option>
<option value="1997">1997</option>
<option value="1996">1996</option>
<option value="1995">1995</option>
<option value="1994">1994</option>
<option value="1993">1993</option>
<option value="1992">1992</option>
<option value="1991">1991</option>
<option value="1990">1990</option>
<option value="1989">1989</option>
<option value="1988">1988</option>
<option value="1987">1987</option>
<option value="1986">1986</option>
<option value="1985">1985</option>
<option value="1984">1984</option>
<option value="1983">1983</option>
<option value="1982">1982</option>
<option value="1981">1981</option>
<option value="1980">1980</option>
<option value="1979">1979</option>
<option value="1978">1978</option>
<option value="1977">1977</option>
<option value="1976">1976</option>
<option value="1975">1975</option>
</select>
</div>
<input type="text" placeholder="Benutzername" value="<?php echo htmlspecialchars(stripslashes(trim($_POST["username"]))); ?>" name="username">
<input type="email" placeholder="Email" value="<?php echo htmlspecialchars(stripslashes(trim($_POST["email"]))); ?>" name="email">
<input type="password" placeholder="Passwort" name="pw">
<input type="password" placeholder="Passwort wiederholen" name="pw2">
<div class="php"><?php
$error = "";
if ($_SERVER["REQUEST_METHOD"] == "POST"){
if(empty(htmlspecialchars(stripslashes(trim($_POST["vorname"]))))) {
echo $error = "<p>*Bitte gib deinen Vornamen ein!*</p>";
}
elseif(empty(htmlspecialchars(stripslashes(trim($_POST["nachname"]))))) {
echo $error = "<p>*Bitte gib deinen Nachnamen ein!*</p>";
}
elseif((htmlspecialchars(stripslashes(trim($_POST["date_day"])))) == "DD") {
echo $error = "<p>*Bitte gib deinen <br> Geburtsdatum ein!*</p>";
}
elseif((htmlspecialchars(stripslashes(trim($_POST["date_month"])))) == "MM") {
echo $error = "<p>*Bitte gib deinen <br> Geburtsdatum ein!*</p>";
}
elseif((htmlspecialchars(stripslashes(trim($_POST["date_year"])))) == "YYYY"){
echo $error = "<p>*Bitte gib deinen <br> Geburtsdatum ein!*</p>";
}
elseif(empty(htmlspecialchars(stripslashes(trim($_POST["username"]))))) {
echo $error = "<p>*Bitte gib deinen <br> Benutzernamen ein!*</p>";
}
elseif(empty(htmlspecialchars(stripslashes(trim($_POST["email"]))))) {
echo $error = "<p>*Bitte gib deine Emailadresse ein!*</p>";
}
elseif(empty(htmlspecialchars(stripslashes(trim($_POST["pw"]))))) {
echo $error = "<p>*Bitte gib dein Passwort ein!*</p>";
}
elseif(empty(htmlspecialchars(stripslashes(trim($_POST["pw2"]))))) {
echo $error = "<p>*Bitte wiederhole dein Passwort!*</p>";
}
elseif(htmlspecialchars(stripslashes(trim($_POST["pw"])))!=htmlspecialchars(stripslashes(trim($_POST["pw2"])))) {
echo $error = "<p>*Bitte wiederhole dein Passwort!*</p>";
}
else {
echo "<p class='php'>Danke ".(htmlspecialchars(stripslashes(trim($_POST["vorname"]))))."<br> für deine Registrierung!</p>";
exit;
}}?></div>
<input type="submit" class="Anmelden" value="Anmelden"><br>
<a href="login.html">Schon registriert? Klick hier</a>
</form>
</center>
</div>
</div>
</div>
</section>
@@derjakobofficial
Ich habe n Problem.
Und außer diesem noch ganz andere:
echo "<p class='php'>Danke ".(htmlspecialchars(stripslashes(trim($_POST["vorname"]))))."<br> für deine Registrierung!</p>";
Außer bei Gedichten/Liedtexten, Postanschriften, Programmcode o.ä. sollte <br>
nicht im HTML vorkommen. Gestaltung per CSS – ggfs. display: block
.
<center><p>Mach mit bei <b>Homeworker.de</b></p>
Präsentationabezogenes Markup wie <center>
und <b>
sollte nicht im HTML vorkommen. Gestaltung per CSS.
<input type="text" placeholder="Vorname" value="<?php echo htmlspecialchars(stripslashes(trim($_POST["vorname"]))); ?>" name="vorname">
Placeholder sind kein Ersatz für Beschriftungen von Eingabefeldern. Verwende label
!
<select name="date_day"> <option value="DD"><?php echo htmlspecialchars(stripslashes(trim($_POST["date_day"]))); ?></option> <option value="1">1</option> <option value="31">31</option> </select> <select name="date_month"> <select name="date_year" >
Es gibt wohl kaum eine weniger nutzerfreundliche Datumseingabe als 3 getrennte Auswahllisten.
<input type="date">
existiert. Datepicker auch.
if(empty(htmlspecialchars(stripslashes(trim($_POST["vorname"]))))) {
Bei Ausgaben ist es wichtig, Daten entsprechend zu behandeln. Nicht vorher. htmlspecialchars()
etc. hat in der Bedingung nichts zu suchen.
LLAP 🖖
io;
if(empty(htmlspecialchars(stripslashes(trim($_POST["vorname"]))))) {
Bei Ausgaben ist es wichtig, Daten entsprechend zu behandeln. Nicht vorher.
htmlspecialchars()
etc. hat in der Bedingung nichts zu suchen.
Und wahrscheinlich ist auch genau das die Ursache dafür dass der Code nicht erwartungsgemäß fungiziert. ph
Hast mit null weiter geholfen danke ... -.- das hat schon alles ein grund warum ich bestimmte ding tue. Wenn du mir nicht helfen kannst dann antworte hier auch nicht.
[Vollzitat gelöscht]
@@derjakobofficial
Hast mit null weiter geholfen danke ... -.-
Dazu gehören ja auch zwei: einer, der hilft, und einer, der sich helfen lässt.
das hat schon alles ein grund warum ich bestimmte ding tue.
Zwei Gründe: Unwissenheit und Arroganz. Beides keine guten Gründe, wie ich finde.
Wenn du mir nicht helfen kannst dann antworte hier auch nicht.
Ob angebotene Hilfe auf offene oder auf taube Ohren stößt, kann ich ja erst im Nachhinein wissen. Also versuche ich es erst einmal. Das klappt nicht immer.
LLAP 🖖
Edit: Eben verlinktes Posting hab ich zuerst gefunden; eigentlich hatte ich nach diesem gesucht.
Ich empfehle immer, Code und Markup zu trennen. Ob Du nun den Code in register.php hast und dir per include ein register_form.php hineinziehst, oder das Markup in register.php steht und du ein register_code.php hereinholst, ist eigentlich wurscht. Persönlich finde ich die Lösung mit Code in register.php charmanter und auch verständlicher.
Da kannst Du dann nämlich alles, was für die Darstellung relevant ist, im Speicher aufbereiten und greifst im register_form.php darauf zu. Als Ablage für diese Aufbereitung nimmt man gerne ein assoziatives Array oder ein Objekt, unter Kennern ist der der Name für diese Ablage "ViewModel" - also das Datenmodell, dass der gewünschte View (die HTML-Seite) benötigt.
Wenn Du verhindern willst, dass jemand von außen dein Ausgabemodul direkt aufruft, kannst Du das mit .htaccess lösen - oder du fragst im Ausgabemodul zu Beginn ab ob die Variable mit dem ViewModel existiert, und wenn nicht, gibst Du einfach nur "Hallo Hacker!" aus und beendest das Script.
Auf diese Weise wird deine Logik viel übersichtlicher. Vor allem - und dies ist die Antwort auf deine Frage - steht es Dir frei, im Falle einer erfolgreichen Registrierung die ViewModel-Felder für Vorname, Nachname und Datum einfach zu leeren. Es werden vielleicht ein paar Zeilen Code mehr. Aber du kannst sie wenigstens lesen und tust deinem 3 Monate älteren Selbst den Gefallen, das Ganze auch noch zu verstehen.
Muster für das Logikmodul ist, seit John von Neumann selig (und vermutlich auch Konrad Zuse und Charles Babbage), die gute alte EVA:
E - Eingabe
Auslesen der Daten aus dem POST-Array, ggf. säubern (stripslashes/trim), und speichern in Variablen. Rufe nicht ständig - beispielsweise - stripslashes(trim($_POST['pw']))
auf. Gönn Dir eine Variable für das Ergebnis, striptrimme 1x und arbeite ab dann mit dem Variablenwert.
V - Verarbeitung
Plausibilitätsprüfungen
Entscheiden ob registriert wird
Ggf. Registrierung durchführen
Fehlermeldungen aufbereiten -> Ins ViewModel stellen
Neue anzuzeigende Feldinhalte aufbereiten -> Ins ViewModel stellen
A - Ausgabe
Laden des Ausgabe-Moduls (mit include). Die PHP Doku sagt dazu, dass ein includetes PHP die gleichen Variablen sieht wie die Codezeile, an der das Include steht. Wenn Du Dir also eine selbstdisziplinierende Maßnahme gönnen willst, schreibst Du in dein Codemodul ein Funktion
function ausgeben($template, $VM)
{
include $template;
}
Die rufst Du zum Durchführen der Ausgabe auf (Parameter sind wohl offensichtlich) und dein Ausgabemodul sieht nichts außer den Variablen $template und $VM.
Das Ausgabemodul ist letztlich deine HTML-Seite mit möglichst wenig PHP-Code darin. Statt <?php echo ... ?> würde ich übrigens <?= ... ?> empfehlen (Short Echo Tag), das ist kompakter.
Rolf
hey danke für dein umfangreiche antwort. ich stehe am anfang von php und sehe immer wieder das ich noch viel lernen kann/muss. ich habe das jetzt so und es funkt .habe es auch so von der logik her in meinem kopf so sortiert also denke ich lass ich das so. ich würde trozdem gerne eifach am ende alles auflösen können. ich habe extra mit php es so gemacht das wenn du von index.html auf login.php kommst durch den submit und durch einen error die daten nicht abgeschickt sind sonder nochmal überarbeitet werden müssen ... das die dann bleiben will ich aber dass die beim zweiten oder dritten submit der dann aber auch der letzte is also (erfolg) das dann die felder leer sind wie beim unterhindertem erstem submit > Ich empfehle immer, Code und Markup zu trennen. Ob Du nun den Code in register.php hast und dir per include ein register_form.php hineinziehst, oder das Markup in register.php steht und du ein register_code.php hereinholst, ist eigentlich wurscht. Persönlich finde ich die Lösung mit Code in register.php charmanter und auch verständlicher.
[Vollzitat gelöscht]
Hm.
Zunächst mal: Du kannst auch "Antwort ohne Zitat" drücken, oder den zitierten Text löschen wenn er irrelevant ist. Full Quotes sind eher nervig...
Sodann - was soll dein Beitrag jetzt sagen: Danke dass Du mir das geschrieben hast, ist mir aber jetzt wurscht? Bzw. zu hoch? Könnte ich verstehen, bedeutet etwas Arbeit, vielleicht kannst Du beim nächsten Mal Nutzen draus ziehen. Glaub mir, Struktur lohnt sich. Spaghetti gehören auf den Teller, nicht ins Programm.
Und irgendwie macht dieser Satz:
ich würde trozdem gerne eifach am ende alles auflösen können.
den Eindruck, dass Du einen offenen Faden im Thema hast den Du gerne verknotet hättest, aber ich finde ihn im Textgewusel nicht so recht. Bist Du jetzt weitergekommen und brauchst einen weiteren Tipp, oder bist Du noch nicht weiter, willst meinen Redesignvorschlag (der Dir die Lösung einfacher machen könnte) aber nicht angehen und suchst eine Lösung basierend auf deinem eingangs geposteten Stand?
Am Prinzip "Erst denken, dann handeln" kommst Du nicht vorbei. Das meine ich nicht persönlich gegen dich, sondern als Prinzip zum Programmablauf. In PHP gesprochen: was Du im Speicher hast, kannst Du ändern. Und es gibt auch genug Speicher auf dem Server, du darfst gerne mehr Variablen anlegen außer $error. Die kannst Du dann nach Bedarf setzen. Zur Not auch mehrfach. Was PHP zum Browser geschickt hat, ist in HTML gemeißelt und für den Server unveränderlich. Du musst jede Logik, die Werte von Eingabefeldern bestimmt, vor der Ausgabe dieser Felder platzieren. Dann kannst Du sie füllen wie Du willst.
Rolf
@@Rolf b
Zunächst mal: Du kannst auch "Antwort ohne Zitat" drücken, oder den zitierten Text löschen wenn er irrelevant ist. Full Quotes sind eher nervig...
Das Vollzitat hab ich mal gelöscht.
Sodann - was soll dein Beitrag jetzt sagen: Danke dass Du mir das geschrieben hast, ist mir aber jetzt wurscht?
LLAP 🖖
Tach!
Jetzt möchte ich aber gern das bei einem erfolg [...] soll alles gelöscht werden also iwie alle php sachen vorher stoppen oder bei der letzten ifelse ein input clear all sowas in der art.
Ja, dann mach das doch. Schreib das Formular nur im anderen Zweig. Damit das nicht so riesig wird, kannst du das ja in eine Include-Datei auslagern oder eine Funktion schreiben.
echo "<p class='php'>Danke ".(htmlspecialchars(stripslashes(trim($_POST["vorname"]))))."<br> für deine Registrierung!</p>";
stripslashes()? Wie uralt ist denn deine PHP-Version? Magic Quotes, wogegen man stripslashes() verwendete, ist doch schon seit sehr langer Zeit nicht mehr in PHP enthalten.
<option value="1">1</option> <option value="2">2</option> <option value="3">3</option> [...] <option value="31">31</option>
Für solche hat man die for-Schleife erfunden.
<option value="Januar">Januar</option> <option value="Februar">Februar</option> <option value="März">März</option> [...]
Ein Array mit den Monatsnamen und eine foreach-Schleife reduziert auch hier wieder den Wiederholungsaufwand und die Codegröße.
<option value="2006">2006</option> <option value="2005">2005</option> <option value="2004">2004</option> [...]
Mit for-Schleifen kann man auch rückwärts zählen.
if(empty(htmlspecialchars(stripslashes(trim($_POST["vorname"]))))) {
Die Verwendung von htmlspecialchars() ergibt hier an der Stelle (und den anderen Wiederholungen) keinen Sinn. Das ist für die HTML-geechte Behandlung der Ausgabe da, und hier prüfst du nur einen Wert.
dedlfix.
@@dedlfix
<option value="1">1</option> <option value="2">2</option> <option value="3">3</option> [...] <option value="31">31</option>
Für solche hat man die for-Schleife erfunden.
Nein.
<option value="Januar">Januar</option> <option value="Februar">Februar</option> <option value="März">März</option> [...]
Ein Array mit den Monatsnamen und eine foreach-Schleife reduziert auch hier wieder den Wiederholungsaufwand und die Codegröße.
Ja, und? Das macht den Code nicht besser.
<option value="2006">2006</option> <option value="2005">2005</option> <option value="2004">2004</option> [...]
Mit for-Schleifen kann man auch rückwärts zählen.
Ja, und? Das macht den Code nicht besser.
BTW, wenn der Elementinhalt gleich dem zu übertragendem Wert ist, muss dieser nicht nochmal als value
-Attribut angegeben werden: <option>2006</option>
. Aber auch das macht den Code hier nicht besser.
LLAP 🖖
Tach!
<option value="1">1</option> <option value="2">2</option> <option value="3">3</option> [...] <option value="31">31</option>
Für solche hat man die for-Schleife erfunden.
Nein.
Nun gut, für den speziellen Fall eines Datums kann man auch ein Datums-Eingabefeld nehmen. Aber ansonsten nimmt man für gleichförmige Wiederholungen lieber Schleifen. Das war doch das, was du mit deinem kurnen Nein ausgedrückt haben wolltest? Ansonsten, ausführlichere Antworten lassen weniger (Miss)Interpretationsspielraum.
Ein Array mit den Monatsnamen und eine foreach-Schleife reduziert auch hier wieder den Wiederholungsaufwand und die Codegröße.
Ja, und? Das macht den Code nicht besser.
Besser schon, vielleicht nicht best.
dedlfix.
@@dedlfix
Nun gut, für den speziellen Fall eines Datums kann man auch ein Datums-Eingabefeld nehmen. Aber ansonsten nimmt man für gleichförmige Wiederholungen lieber Schleifen.
Es ist irrelevant, ob man schlechtes HTML mit gutem oder mit schlechtem PHP generiert.
Das war doch das, was du mit deinem kurnen Nein ausgedrückt haben wolltest?
Die Langsfassung stand ja schon in diesem Thread.
LLAP 🖖
Tach!
Es ist irrelevant, ob man schlechtes HTML mit gutem oder mit schlechtem PHP generiert.
Für das Ergebnis, ja. Aber ich finde, wenn man als Zwischenschritt besseres PHP kennenlernt, kann das nicht ganz verkehrt sein.
dedlfix.
@@dedlfix
Es ist irrelevant, ob man schlechtes HTML mit gutem oder mit schlechtem PHP generiert.
Für das Ergebnis, ja. Aber ich finde, wenn man als Zwischenschritt besseres PHP kennenlernt, kann das nicht ganz verkehrt sein.
Der erste Schritt sollte aber sein, besseres HTML zu lernen.
LLAP 🖖
Das ist, finde ich, Ansichtssache. Wenn man mehrdimensionales Entwicklungspotential[1] hat, kann man sich durchaus eigene Prioritäten setzen, wo man die ersten Entwicklungsschritte setzt. Alles auf einmal zu lernen gelingt nur wenigen. Zu sagen "Ich produziere HTML/CSS gemäß meiner Sockelkenntnisse und arbeite erstmal an meinem PHP" ist eine legitime Strategie. Man sollte mit dem Sockelkunstwerk dann nur nicht an die breite Öffentlichkeit, bzw. die Sockelkenntnisse mit Know How verwechseln. Das der GUI Experte G15N das anders priorisiert, ist klar. Macht aber doch nichts. Die Welt ist bunt. Und deine Evangelien sorgen zuverlässig dafür, dass jeder dieser Verwechslungsversuche markiert wird :)
Rolf
Anders gesagt: Bunte Vielfalt an Wissenslücken :) ↩︎
@@Rolf b
… kann man sich durchaus eigene Prioritäten setzen, wo man die ersten Entwicklungsschritte setzt. Alles auf einmal zu lernen gelingt nur wenigen. Zu sagen "Ich produziere HTML/CSS gemäß meiner Sockelkenntnisse und arbeite erstmal an meinem PHP" ist eine legitime Strategie.
Ich finde es angemessen, mit dem Lernen bei den Grundlagen anzufangen. Und die Grundlage einer Webseite ist HTML.
Und die Grundlage einer funktionierenden Webseite ist ein brauchbares UI.
Man sollte mit dem Sockelkunstwerk dann nur nicht an die breite Öffentlichkeit
Schauen wir mal ins OP: „Ich arbeite gerade an einem Login.“ Die Seite ist also für die Öffentlichkeit.
So nebenbei™ gefragt: Beim einem Login eine Datumsangabe? Beschränkt auf die Jahre 1975–2006? Geburtstag? Die Seite soll nur für ein beschränktes Zielpublikum sein? Warum nicht für mich? Oder soll ich bei der Angabe lügen? Und wozu braucht man bei einem Login den Geburtstag?
der GUI Experte G15N
Du hast dich verzählt.
LLAP 🖖
der GUI Experte G15N
Du hast dich verzählt.
Stimmt. Auch Leerstellen haben ihre Existenzberechtigung. Sorry.
Ansonsten: Er "arbeitet" dran. Das ist von öffentlich noch weit weg. Und dass da Begrifflichkeiten nicht stimmen (Register vs Login) ja, da stimme ich Dir gern zu.
Rolf aka r19n ;-)
@@Rolf b
der GUI Experte G15N
Du hast dich verzählt.
Stimmt. Auch Leerstellen haben ihre Existenzberechtigung. Sorry.
Funfact: Ich hatte mich zuerst bei Twitter als @g15n registriert. Dann hab ich bei Richard Ishida (@r12a) und Jens Meiert (@j9t) noch mal nachgezählt – und mich in @g16n umbenannt.
Ansonsten: Er "arbeitet" dran. Das ist von öffentlich noch weit weg.
Er ist aber offenbar nicht gewillt, vor der Veröffentlichung am UI zu arbeiten.
Und dass da Begrifflichkeiten nicht stimmen (Register vs Login) ja, da stimme ich Dir gern zu.
Ich wüsste auch nicht, warum man seinen Geburtstag bei der Registrierung angeben müssen sollte.
LLAP 🖖
Hallo Gunnar Bittersmann,
Ich wüsste auch nicht, warum man seinen Geburtstag bei der Registrierung angeben müssen sollte.
FSK-18-Inhalte?
Bis demnächst
Matthias
@@Matthias Apsel
Ich wüsste auch nicht, warum man seinen Geburtstag bei der Registrierung angeben müssen sollte.
FSK-18-Inhalte?
Dann sollte es eine Checkbox „Ich bestätige, volljährig zu sein“ auch tun, um sich rechtlich abzusichern. Bescheißen werden die Kinder so oder so.
LLAP 🖖