Php submit bottum funktioniert nicht
Ich wollte ne Seite schreiben wo mann sich ragestrieren kann, Irgendwie klappt der submit bottum nicht.
Hier ist die php:
Was ist da falsch??
Hier ist die php:
<?php
// Verbindung herstellen
$host = "localhost";
$user = "root";
$pass = "";
$db = "login";
mysql_connect($host, $user, $pass);
mysql_select_db($db);
unset($host,$user,$pass,$db);
?>
<html>
<head>
<title>Registrieren</title>
</head>
<body>
<table align='center'>
<form action='<?php $_SERVER['PHP_SELF']; ?>' method='post'>
<h1>Formular ausfüllen um sich zu regestrieren!!</h1>
Benutzername:<input type='text' name='user' size'12' maxlength='24'><br/>
Passwort: <input type='password' name='pass'><br/>
E-mail:<input type='text' name='mail'><br/>
<input type='submit' name='submit' value='Abschicken'>
</form>
</table>
<?php
$name = $_POST["user"];
$pass = $_POST["pass"];
$mail = $_POST["mail"];
if(isset($_POST["Login"])){
if($name == '' and $pass =='' and $mail =='')
{echo 'Sie haben nicht alle Daten angegeben!!';
}
else
{
$sql = "
INSERT INTO `users`
(
`id` , `username` , `password` , `mail`
)
VALUES
(
NULL , '$name', '$pass', '$mail'
);
";
$db_erg = mysql_query($sql)
or die("Anfrage fehlgeschlagen: " . mysql_error());
echo "Benutzer erfolgreich angelegt!!!";
}};
?>
Was ist da falsch??
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 156367
Url: https://administrator.de/contentid/156367
Ausgedruckt am: 25.11.2024 um 02:11 Uhr
9 Kommentare
Neuester Kommentar
Moin,
also da ist meiner Ansicht nach einiges Schief
Das hier ist gar nicht notwendig.
Das:
reicht vollkommen aus.
Das hier:
trifft nur zu, wenn alle Eingaben fehlen.
Wenn ich aber nur die Mail oder was anderes weglasse wirds nicht abgefangen.
Die Zeile sollte eher
lauten.
Und zu guter Letzt muss dein
unter die mysqlanweisung.
Und noch ein, zwei Kleinigkeiten die "ich" so nicht machen würde, weils viel zu umständlich ist:
Mit den Anführungszeichen etc. musst du noch mal schauen.
sqlSafeString ist eine Funktion gegen MySQL Injunctions.
VG
also da ist meiner Ansicht nach einiges Schief
<form action='<?php $_SERVER['PHP_SELF']; ?>' method='post'>
Das:
<form action="" method="post">
Das hier:
if($name == '' and $pass =='' and $mail =='')
Wenn ich aber nur die Mail oder was anderes weglasse wirds nicht abgefangen.
Die Zeile sollte eher
if($name == '' || $pass =='' || $mail =='')
Und zu guter Letzt muss dein
</form>
unter die mysqlanweisung.
Und noch ein, zwei Kleinigkeiten die "ich" so nicht machen würde, weils viel zu umständlich ist:
<?php
// Verbindung herstellen
$host = "localhost";
$user = "root";
$pass = "";
$db = "login";
mysql_connect($host, $user, $pass);
mysql_select_db($db);
unset($host,$user,$pass,$db);
function sqlSafeString($param) {
return (NULL === $param ? "NULL" : ''.mysql_escape_string ($param).'');
}
?>
<html>
<head>
<title>Registrieren</title>
</head>
<body>
<table align='center'>
<form action='' method='post'>
<h1>Formular ausfüllen um sich zu regestrieren!!</h1>
Benutzername:<input type='text' name='user' size='12' maxlength='24'><br/>
Passwort: <input type='password' name='pass'><br/>
E-mail:<input type='text' name='mail'><br/>
<input type='submit' name='submit' value='Abschicken'>
</table>
<?php
if(isset($_POST["Login"])){
if($_POST["user"] == '' || $_POST["pass"] =='' || $_POST["mail"] =='')
{echo 'Sie haben nicht alle Daten angegeben!!';
}
else
{
$sql = "
INSERT INTO `users`
(
`id` , `username` , `password` , `mail`
)
VALUES
(
NULL , '".sqlSafeString( $_POST["user"])."', '".sqlSafeString($_POST["pass"])."','".sqlSafeString($_POST["mail"])."'"
);
";
$db_erg = mysql_query($sql)
or die("Anfrage fehlgeschlagen: " . mysql_error());
echo "Benutzer erfolgreich angelegt!!!";
}};
?>
</form>
</body>
</html>
Mit den Anführungszeichen etc. musst du noch mal schauen.
sqlSafeString ist eine Funktion gegen MySQL Injunctions.
VG
Hm...
Warum müssen denn die MySQL-__Bearbeitung__sanweisungen noch in das __Eingabe__formular !?
Da sehe ich keinen Sinn drin.
Ich würde es sowieso ganz anders machen, es aber dennoch für Sinnvoller halten wenn die Erfolgsausgabe __über__ dem Formular stünde.
Denn nach dem abschicken der Daten ist alles was mich interessiert (interessieren könnte), ob die Daten gespeichert werden konnten oder nicht.
Das Formular ist doch bei Erfolg völlig unwichtig und bei einem Misserfolg erst nach der Fehlermeldung.
Und warum verpackst du die Funktion noch in einem Wrapper wenn doch nichts weiter gemacht wird als sie selbst aufzurufen !?
W3C - Forms in HTML documents
Nach wie vor ist es so, das kein Feld namens "Login" übertragen wird und so die gesamten MySQL-Anweisungen (Bearbeitung) übersprungen wird !
Und um das auch mal eben noch klar zu halten, der Submitbutton funktioniert also schon, es ist lediglich die Scriptlogik die Fehlerhaft ist ;)
~Arano
Warum müssen denn die MySQL-__Bearbeitung__sanweisungen noch in das __Eingabe__formular !?
Da sehe ich keinen Sinn drin.
Ich würde es sowieso ganz anders machen, es aber dennoch für Sinnvoller halten wenn die Erfolgsausgabe __über__ dem Formular stünde.
Denn nach dem abschicken der Daten ist alles was mich interessiert (interessieren könnte), ob die Daten gespeichert werden konnten oder nicht.
Das Formular ist doch bei Erfolg völlig unwichtig und bei einem Misserfolg erst nach der Fehlermeldung.
Zitat von PHP-Manual - mysql_escape_string()
---
Warning
This function has been DEPRECATED as of PHP 5.3.0. Relying on this feature is highly discouraged.
Nimm stattdessen PHP-Manual - mysql_real_escape_string()]---
Warning
This function has been DEPRECATED as of PHP 5.3.0. Relying on this feature is highly discouraged.
Und warum verpackst du die Funktion noch in einem Wrapper wenn doch nichts weiter gemacht wird als sie selbst aufzurufen !?
Das <form action='<?php $_SERVER['PHP_SELF']; ?>' method='post'> ist gar nicht notwendig.
Das <form action="" method="post"> reicht vollkommen aus.
Ähm... nö !Das <form action="" method="post"> reicht vollkommen aus.
W3C - Forms in HTML documents
- Ist das action-Attribut notwendig (required) und
- ist das Browserverhalten bei einer anderen Angabe als einer URI nicht definiert. (Jeder Browser macht also was er will - nicht was du willst !) (User agent behavior for a value other than an HTTP URI is undefined.)
Nach wie vor ist es so, das kein Feld namens "Login" übertragen wird und so die gesamten MySQL-Anweisungen (Bearbeitung) übersprungen wird !
Und um das auch mal eben noch klar zu halten, der Submitbutton funktioniert also schon, es ist lediglich die Scriptlogik die Fehlerhaft ist ;)
~Arano
Moin,
ich würde es auch anders machen, aber ich wollt ihm da nun nicht alles zerlegen...
Du kannst den ganzen MySQL Quatsch auch VOR das Formular packen, ansonsten muss es ins Formular. Kannst es ja gerne mal probieren unter und außerhalb des Formulars.
Mit der Funktion haste natürlich recht. Kann man die neue nehmen.
Ähm, doch!
Weil nichts anderes passiert, außer der Aufruf der gleichen Seite genau so wie mit PHP_SELF.
Mach ich seit eh und je und hatte noch NIE in egal welchem Browser Probleme damit
Required? Jo, es ist ja auch da ... ich habs ja nicht weggelassen - das ist der Unterschied.
Das mit dem Login stimmt natürlich, aber das hattest du ja bereits geschrieben.
VG
ich würde es auch anders machen, aber ich wollt ihm da nun nicht alles zerlegen...
Du kannst den ganzen MySQL Quatsch auch VOR das Formular packen, ansonsten muss es ins Formular. Kannst es ja gerne mal probieren unter und außerhalb des Formulars.
Parameter, die innerhalb von Quotes als String an die Datenbank übergeben werden sollen, dürfen selbst keine ungeschützten Quotes enthalten. Parameter, die IDs oder Zahlen repräsentieren, dürfen nur Ziffern enthalten. Die beiden Funktionen sichern genau dies, und sorgen zudem dafür, dass NULL-Values korrekt wiedergegeben werden
Ähm, doch!
Weil nichts anderes passiert, außer der Aufruf der gleichen Seite genau so wie mit PHP_SELF.
Mach ich seit eh und je und hatte noch NIE in egal welchem Browser Probleme damit
Required? Jo, es ist ja auch da ... ich habs ja nicht weggelassen - das ist der Unterschied.
Das mit dem Login stimmt natürlich, aber das hattest du ja bereits geschrieben.
VG
Hi,
__From, MySQL__:
es geht doch nicht ums probieren, sondern ums verstehen !
Warum "muss es ansonsten ins Formular" ?
__sqlSafeString__:
Na ich weiss nicht ob es so praktisch ist, wenn NULL (null bzw. der default Wert) in die DB gespeichert werden soll und wegen der Funktion "NULL" (string) gespeichert wird.
__Form, action__:
Ich sage ja auch gar nicht das es so überhaupt nicht funktioniert - dennoch ist es "nur Zufall" !
Nur ein Zufall das sich alle Browserhersteller für die selbe Vorgehensweise entschieden haben - aber kein muss !
Und wir wissen doch alle wie viele Unterschiede es bei der Interpretation von HTML zwischen den Browsern geben kann ;)
Also wähle ich doch lieber die Methode bei der ich sicher sein kann, dass das gewünschte passiert und fülle das action-Attribut mit einer URI.
Außerdem weiss ich so bei der Fehlersuche, das ich die Angabe einer URI nicht versehentlich vergessen habe den:
~Arano
__From, MySQL__:
es geht doch nicht ums probieren, sondern ums verstehen !
Warum "muss es ansonsten ins Formular" ?
__sqlSafeString__:
Na ich weiss nicht ob es so praktisch ist, wenn NULL (null bzw. der default Wert) in die DB gespeichert werden soll und wegen der Funktion "NULL" (string) gespeichert wird.
__Form, action__:
Ich sage ja auch gar nicht das es so überhaupt nicht funktioniert - dennoch ist es "nur Zufall" !
Nur ein Zufall das sich alle Browserhersteller für die selbe Vorgehensweise entschieden haben - aber kein muss !
Und wir wissen doch alle wie viele Unterschiede es bei der Interpretation von HTML zwischen den Browsern geben kann ;)
Also wähle ich doch lieber die Methode bei der ich sicher sein kann, dass das gewünschte passiert und fülle das action-Attribut mit einer URI.
Außerdem weiss ich so bei der Fehlersuche, das ich die Angabe einer URI nicht versehentlich vergessen habe den:
- URI vorhanden = oaky
- URI fehlt = nicht okay
~Arano
Beim Entwickeln gehört immer dieser Code an den Anfang eines PHP-Programms:
Damit siehst du noch so einige Stil-Fehler.
Das eigentliche Problem wurde ja schon eingehend erläutert, außer:
Also entweder du schreibt die URL fest, benutzt
<?php
error_reporting(E_ALL|E_STRICT);
ini_set('display_errors','On');
?>
Damit siehst du noch so einige Stil-Fehler.
Das eigentliche Problem wurde ja schon eingehend erläutert, außer:
PHP_SELF
ist eine Benutzerübergabe und kein Server-Wert und genau so gehört es auch behandelt (XSS lässt grüßen).Also entweder du schreibt die URL fest, benutzt
basename(_ _FILE_ _)
(was nur bei einfachen scripts geht) oder du escapst den Wert sauber: html_specialchars($_SERVER['PHP_SELF'])
Hi Batcher-CMD,
In dem du prüfst, ob der Button gesendet wurde . . .
Deine Zuweisung der Formularfelder an Variablen gehört ebenfalls hinter die Prüfung des Buttons.
Und damit die von Dog geschriebenen Anweisungen . . .
<?php
error_reporting(E_ALL|E_STRICT);
ini_set('display_errors','On');
?>
. . . keine Fehler/Warnungen hervorrufen, prüfst du die POST-Daten ebenfalls mit . . .
auf ihre Existenz.
Und wenn die Existenz gegeben ist, ist es auch ratsam, bei der Zuweisung an Variablen die Leerzeichen
zu entfernen. Heißt, auch wenn variable=='' ein positives Ergebnis liefert, muß da nicht unbedingt was
Lesbares drinstehen. Auch ein Leerzeichen ist eine gültige Eingabe!! Sieht aber in der DB-Tabelle
einigermaßen doof aus Falls das überhaupt eingetragen wird!?!.
Also: $variable=trim($_POST['Name_des_Feldes']);
Sind die Leerzeichen entfernt, muß man natürlich prüfen, ob noch was übrig geblieben ist. Dazu kann man
mit der Funktion strlen prüfen, ob die variable nach Entfernung der Leerzeichen überhaupt noch Zeichen
enthält: if(strlen(variable)>0){ . . . }
Gruß
Günni
Ok wie krieg ich das denn hin das der untere teil nur ausgefürt wird wenn der Bottum gedrückt wird???
In dem du prüfst, ob der Button gesendet wurde . . .
if(isset($_POST['Name_des_Buttons'])) { . . . }
Deine Zuweisung der Formularfelder an Variablen gehört ebenfalls hinter die Prüfung des Buttons.
Und damit die von Dog geschriebenen Anweisungen . . .
<?php
error_reporting(E_ALL|E_STRICT);
ini_set('display_errors','On');
?>
. . . keine Fehler/Warnungen hervorrufen, prüfst du die POST-Daten ebenfalls mit . . .
if(isset($_POST['Name_des_Feldes'])) { . . . }
auf ihre Existenz.
Und wenn die Existenz gegeben ist, ist es auch ratsam, bei der Zuweisung an Variablen die Leerzeichen
zu entfernen. Heißt, auch wenn variable=='' ein positives Ergebnis liefert, muß da nicht unbedingt was
Lesbares drinstehen. Auch ein Leerzeichen ist eine gültige Eingabe!! Sieht aber in der DB-Tabelle
einigermaßen doof aus Falls das überhaupt eingetragen wird!?!.
Also: $variable=trim($_POST['Name_des_Feldes']);
Sind die Leerzeichen entfernt, muß man natürlich prüfen, ob noch was übrig geblieben ist. Dazu kann man
mit der Funktion strlen prüfen, ob die variable nach Entfernung der Leerzeichen überhaupt noch Zeichen
enthält: if(strlen(variable)>0){ . . . }
Gruß
Günni