batcher-cmd
Goto Top

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:

<?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??

Content-ID: 156367

Url: https://administrator.de/contentid/156367

Ausgedruckt am: 25.11.2024 um 02:11 Uhr

Nottrott
Nottrott 05.12.2010 um 16:18:11 Uhr
Goto Top
<form action='<?php $_SERVER['PHP_SELF']; ?>' method='post'>  

Schau mal in den ausgegebenen HTML-Code, da fehlt ein echo vor $_SERVER['PHP_SELF'];.
Arano
Arano 05.12.2010 um 17:47:05 Uhr
Goto Top
Hallo Batcher-CMD

size'12'
Das sollte sicher "size='12'" sein ;)

Zum Problem:
if(isset($_POST["Login"])){
Wenn ich nicht irre, ist dies NIEMALS der Fall, den in dem Formular wird kein Feld namens "Login" verwendet !


Einen schönen Abend noch
~Arano
Xaero1982
Xaero1982 05.12.2010 um 18:29:47 Uhr
Goto Top
Moin,

also da ist meiner Ansicht nach einiges Schief face-confused

<form action='<?php $_SERVER['PHP_SELF']; ?>' method='post'>   
Das hier ist gar nicht notwendig.
Das:
<form action="" method="post">  
reicht vollkommen aus.

Das hier:
if($name == '' and $pass =='' and $mail =='')  
trifft nur zu, wenn alle Eingaben fehlen.
Wenn ich aber nur die Mail oder was anderes weglasse wirds nicht abgefangen.
Die Zeile sollte eher
if($name == '' || $pass =='' || $mail =='')  
lauten.

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
Arano
Arano 05.12.2010 um 19:30:37 Uhr
Goto Top
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.

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()]
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ö !
W3C - Forms in HTML documents
  1. Ist das action-Attribut notwendig (required) und
  2. 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
Xaero1982
Xaero1982 05.12.2010 um 19:50:36 Uhr
Goto Top
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.

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
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
Arano
Arano 05.12.2010 um 20:43:26 Uhr
Goto Top
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:
  • URI vorhanden = oaky
  • URI fehlt = nicht okay
erkennbar auf den ersten Blick ! (Zumal es bei mir eh selten der Fall ist, das Formular und Zieladresse die selbe URI haben).


~Arano
dog
dog 05.12.2010 um 23:02:58 Uhr
Goto Top
Beim Entwickeln gehört immer dieser Code an den Anfang eines PHP-Programms:

<?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'])
Batcher-CMD
Batcher-CMD 06.12.2010 um 16:08:08 Uhr
Goto Top
Ok wie krieg ich das denn hin das der untere teil nur ausgefürt wird wenn der Bottum gedrückt wird???
Guenni
Guenni 06.12.2010 um 17:17:47 Uhr
Goto Top
Hi Batcher-CMD,

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 face-sad 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