[PHP] Anmeldeformular, Überprüfung

mbassus

Well-known member
ID: 104267
L
23 April 2006
5.071
449
Irgendwie hab ich geplant, das der die Daten nur in die DB schreiben soll (insert..) wenn der username nicht schon vorhanden ist, bzw. die mail adresse nicht schon in der DB steht.. das tut aber nich ganz so, wie ich wollte.. :ugly:

Seht ihr das was?
(Ab Zeile 100 wirds eigentl. interessant)
PHP:
<?php
$header       ="Anmeldung";
$text         ="Hier können Sie sich einen Account bei uns anlegen, dies ist selbstverständlich, definitiv und in jedem Fall kostenfrei!<br>
<form method=post action=index.php?grund=join&step=2><br>
<table border=0 cellpadding=0 cellspacing=0 width=400>
<tr align=center>
<td colspan=2><b>Pflichtfelder</b></td></tr>
<tr align=left>
<td>Gewünschter Benutzername:</td><td><input name=username value='$username'></td></tr>
<tr align=left>
<td>Passwort:</td><td><input name=pw1 type=password></td></tr>
<tr align=left>
<td>Passwortwiederholung:</td><td><input type=password name=pw2></td></tr>

<tr align=left>
<td>E-Mail:</td><td><input name=mail value='$mail'></td></tr>

<tr align=left>
<td>E-Mail Wiederholung:</td><td><input name=mail2 value='$mail2'></td></tr>

<tr align=left>
<td>IP:</td><td><input value='$REMOTE_ADDR' DISABLED></td></tr>

<tr align=center><td colspan=2><B>Optionale Angaben</b></td></tr>
<tr align=left>
<td>Vorname:</td><td><input name=vorname value='$vorname'></td></tr>
<tr align=left>
<td>Nachname:</td><td><input name=nachname value='$nachname'></td></tr>
<tr align=left>
<td>Straße + Hausnr.</td><td><input name=strasse value='$strasse'> <input name=hausnr size=2 length=2 value='$hausnr'></td></tr>
<tr align=left>
<td>Plz</td><td><input name=plz value='$plz'></td></tr>
<tr align=left>
<td>Ort</td><td><input name=ort value='$ort'></td></tr>
<tr align=left>
<td>ICQ</td><td><input name=icq value='$icq'></td></tr>
<tr align=left>
<td>AIM</td><td><input name=aim value='$aim'></td></tr>
<tr align=left>
<td>Skype</td><td><input name=skype value='$skype'></td></tr>
<tr align=left>
<td>Handy:</td><td><input name=handy value='$handy'></td></tr>
<tr align=center><td colspan=2><input type=submit value='Anmeldung Abschließen'></td></tr></table>
";
if ($step == "")
{
   $dick                            =1;
   $farbe                           =blau;
   box($header, $text, 600, $dick, $farbe);
}

if ($step == "2")
{
   $fail                                                                                                                       ="";
   if (($pw1 != $pw2) or $pw1 == "" or $pw2 == "" or strlen($pw) < 6 or $mail == "" or $mail2 == "" or ($mail != $mail2) or $username == "")
   {
      $head      ="Fehler";
      if ($pw1 != "$pw2")
      {
         $fehler++;
         $fail .= "Sie haben unterschiedliche Passwörter eingegeben.<br>";
      }
      if ($pw1 == "" or $pw2 == "" or strlen($pw1) < 6)
      {
         $fehler++;
         $fail .= "Überprüfen Sie Ihre Passwörter! (Mind. 6 Zeichen)<br>";
      }
      if (($mail != $mail2) or ($mail == "" or $mail2 == ""))
      {
         $fail .= "Mailadressen nicht Identisch oder Mailadresse nicht angegeben.<br>";
         $fehler++;
      }
      if ($username == "")
      {
         $fehler++;
         $fail .= "Username nicht angegeben.<br>";
      }
   }
   if ($fehler > 0)
   {
      box($head, $fail, 600, $dick, $farbe);
      box($header, $text, 600, $dick, $farbe);
   }
   else
   {
      if ($fehler < 1)
      {
         $anfrage="select * from f_user where username = '$username' or mail = '$mail'";
         $erfolg=mysql_query($anfrage);
         $anz=mysql_num_rows($erfolg);
         if ($anz > 0)
         {
            $headl                  ="Fehler";
            $textl                  ="Benutzername oder E-Mailadresse bereits in Verwendung. <br>Benötigen Sie ein neues Passwort, können Sie unter <b>Login</b> ein neues Beantragen.";
            box($headl, $textl, 600, $dick, $farbe);
            box($header, $text, 600, $dick, $farbe);
         }
         else
         {
            $anfrage="select * from f_user where lastip = '$REMOTE_ADDR'";
            $erfolg=query($anfrage);
            $anz=mysql_num_rows($erfolg);
            if ($anz > 0)
            {
               $text="IP $REMOTE_ADDR legte den Account '$username' an, ist aber bereits angemeldet gewesen, im Account $usernam (Gecheckt durch lastip)";
               fehler($text);
            }
            $date=date("d.m.Y - H:i:s");
            $anfrage="insert into f_user (username, lastlog, lastip, mail, pw, status) VALUES ('$username','$date','$REMOTE_ADDR','$mail','$pw1','wait')";
            query($anfrage);
            $head                 ="Erfolgreich";
            $text                 ="Sie haben die Anmeldung erfolgreich abgeschlossen.<br>Jetzt müssen Sie nur noch die Bestätigungsmail anklicken, um Ihren Account vollständig zu aktivieren.";
            box($head, $text, 600, $dick, $farbe);
            $code=rand(1,29482493);
            $anfrage="insert into f_activate (mail, code) VALUES ('$mail','$code')";
            query($anfrage);
         }
      }
   }
}

?>
 
ehm sicher das du keinen parse error bekommst???

PHP:
if ($step == "2")
{
 [COLOR="Red"]  $fail   [/COLOR]                                                                                                                    ="";
   if (($pw1 != $pw2) or $pw1 == "" or $pw2 == "" or strlen($pw) < 6 or $mail == "" or $mail2 == "" or ($mail != $mail2) or $username == "")
   {

und dann definier mal $fehler = 0; am anfang des scriptes
 
$fehler = 0 wird gesetzt, damit die fehler gezählt werden können, die im Fehler bei den Eingaben gezählt werden können.

Was heißt denn bei dir, er macht es nicht. Schreibt er einen User doppelt in die Datenbank oder ist bei ihm schon immer der User "vorhanden"?

Weiterer Tipp: Hab mal irgendwo gelesen, dass man SELECT * FROM nicht benutzen soll.:ugly:
 
$fehler = 0 wird gesetzt, damit die fehler gezählt werden können, die im Fehler bei den Eingaben gezählt werden können.

Was heißt denn bei dir, er macht es nicht. Schreibt er einen User doppelt in die Datenbank oder ist bei ihm schon immer der User "vorhanden"?

Weiterer Tipp: Hab mal irgendwo gelesen, dass man SELECT * FROM nicht benutzen soll.:ugly:
Ich will aber tatsächlich (bei der Prüfung) dann alles ausgeben lassen (7 zellen)... die kommen dann in die f_abuse mit rein ;)...

Aber ich glaub ich hab das prob grad am schlawittchen
 
kleine Frage: REGISTER_GLOBALS = ON ???
Du greifst direkt auf $step zu, aus deiner form url geht hervor das es $_GET['step'] sein müsste.
Selbe Problem mit den ganzen post Daten und der IP.

Was hast du eigentlich gegen Anführungszeichen?:roll: Wenn ich mir den Code so ansehe könnte man denken du hast keine Ahnung das man die mit \" einfügen kann.

Edit: kleiner Tipp an Rande... Usernamen und Email würde ich mit LIKE statt = überprüfen... das irgnoriert die Groß-/Kleinschreibung
 
Edit: kleiner Tipp an Rande... Usernamen und Email würde ich mit LIKE statt = überprüfen... das irgnoriert die Groß-/Kleinschreibung
Auch das normale = ist case insensitive. Um explizit case sensitive zu prüfen, muss man BINARY benutzen:
Code:
SELECT * FROM user
WHERE BINARY nickname = 'tleilax'
Dieses Query würde den User mit dem Nickname "Tleilax" nicht finden.
 
Edit: kleiner Tipp an Rande... Usernamen und Email würde ich mit LIKE statt = überprüfen... das irgnoriert die Groß-/Kleinschreibung

VORSICHT: 'LIKE' ist nicht gleich '=' !
Und die Vergleiche finden nicht immer case-insensitive statt!
Die obigen Aussagen kann man nun mal leider nicht pauschal so stehen lassen, da sie nicht immer wahr sind. Im Detail:

LIKE vergleicht zeichen-für-zeichen. Das kann ein anderes Ergebnis bedeuten, wenn Sonderzeichen wie z.B. Umlaute geprüft werden und man Spalten/Tabellen eine bestimmte Zeichensatzkodierung zugeordnet hat. So kann '=' einen Vergleich 'ö' = 'oe' erfolgreich als identisch erkennen, 'LIKE' dagegen nicht.

Das Ergebnis hängt davon ab, welchen Zeichensatz ausgewählt ist, will man 1-zu-1 Vergleiche erzwingen, setzt man den lieber auf latin1_bin. Default ist Swedisch, das kann komische Ergebnisse hervorrufen, z.B. 'y' ist gleich 'ü'.

Man sollte auch aufpassen, wenn man daher von Mysql v3 auf v4 updatet oder innerhalb der 4er Version, da es da teilweise Unterschiede gibt, auch was das case-sensitive angeht!

Ein Blick in die englische (!!! - die deutsche ist teilweise unvollständig!) MySQL-Doku sollte alles genau erklären.

*edit* Ach ja, latin1_bin als Zeichensatz für eine Spalte oder Tabelle bewirkt, daß Vergleiche ebenfalls nur noch case sensitive stattfinden. Bei Usernamen wäre das wohl das sicherste in Kombination mit 'LCASE'.