Problem mit if abfragen für Registerierung

Syc

Grünschnabel
Hallo zusammen,

aktuell versuche ich mein Script mal etwas zu säubern und zu verkleinern...
Leider habe ich gerade ein problem mit der Registrierung...

Geprüft werden soll, ob alle Felder ausgefüllt wurden, was auch soweit funktioniert!
Allerdings arbeitet das Script beendet sich die funktion reg() schon nach dem ersten Fehler, ohne die anderen zu Prüfen und bei der Passwort Prüfung auf "empty" gibt es zwar die ausgabe wenn TRUE, allerdings erfolgt hier keine ausgabe wenn kein Passwort eingegeben wurde.


Hier einmal der Code der register.php Klasse

PHP:
<?PHP
class register{

function reg(){
	$accountName	= strtolower($_POST['accountName']);
	$email			= strtolower($_POST['emailAddress']);
	$email2			= strtolower($_POST['emailConfirm']);
	$password		= $_POST['password'];
	$password2		= $_POST['passwordConfirm'];
	
	if(register::checkName($accountName) != 1){
		return register::checkName($accountName);
	 }
	if(register::checkMail($email) != 1){
		return register::checkMail($email);
	 }
	if(register::checkMail2($email, $email2) != 1){
		return register::checkMail2($email, $email2);
	 }
	if(register::checkPassword($password) != 1){
		return register::checkMail($password);
	 }
	if(register::checkPassword2($password, $password2) != 1){
		return register::checkMail2($password, $password2);
	 }

	if(register::checkName($accountName) == 1 and register::checkMail($email) == 1 and register::checkMail2($email, $email2) == 1 and register::checkPassword($password) == 1 and register::checkPassword2($password, $password2) == 1){
		echo "alles ok!";
	}

}

function checkName($accountName){
	if(empty($accountName)){
		$msg =    "<li class=\"feedbackPanelERROR\">
		 		   <span class=\"feedbackPanelERROR\">Bitte tragen Sie einen Wert im Feld 'Username' ein.</span>
				   </li>";
		return $msg;
	} else {
	$checkName		= $GLOBALS['db']->ReadField("SELECT count(*) FROM {'dbprefix'}account WHERE accountName = '$accountName'");
		if($checkName > 0){ 
			$msg = "<li class=\"feedbackPanelERROR\">
		 		   <span class=\"feedbackPanelERROR\">Der gewählte 'Username' ist bereits vergeben.</span>
				   </li>";
			return $msg;
		}
		if($checkName == "0" and !empty($accountName)){
			return true;
		}
	}
}

function checkMail($email){
	if(empty($email)){
		$msg =    "<li class=\"feedbackPanelERROR\">
		 		   <span class=\"feedbackPanelERROR\">Bitte tragen Sie einen Wert im Feld 'Emailadresse' ein.</span>
				   </li>";
		return $msg;
	} else {
	$checkMail		= $GLOBALS['db']->ReadField("SELECT count(*) FROM {'dbprefix'}account WHERE emailAddress = '$emailAddress'");
		if($checkMail > 0){ 
			$msg = "<li class=\"feedbackPanelERROR\">
		 		   <span class=\"feedbackPanelERROR\">Die gewählte 'Emailadresse' ist bereits vergeben.</span>
				   </li>";
			return $msg;
	} else {
		if(preg_match('/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$/',$email)){ 
			return true;
		} else {
			$msg = "<li class=\"feedbackPanelERROR\">
		 		   <span class=\"feedbackPanelERROR\">Die gewählte 'Emailadresse' ist ung&uuml;ltig.</span>
				   </li>";
			return $msg; 
		}
	}
		if($checkMail == "0" and !empty($email) and preg_match('/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$/',$email)){
			return true;
		}
	}
}

function checkMail2($email, $email2){
	if(empty($email2)){
		$msg =    "<li class=\"feedbackPanelERROR\">
		 		   <span class=\"feedbackPanelERROR\">Bitte tragen Sie einen Wert im Feld 'Emailadresse bestätigen' ein.</span>
				   </li>";
		return $msg;
	} else if($email2 != $email){
		$msg =    "<li class=\"feedbackPanelERROR\">
		 		   <span class=\"feedbackPanelERROR\">'".$email." vom Label Emailadresse und '".$email2."' vom Label Emailadresse bestätigen müssen gleich sein.</span>
				   </li>";
		return $msg;
	
	}

}

function checkPassword($password){
	if(empty($password)){
		$msg =    "<li class=\"feedbackPanelERROR\">
		 		   <span class=\"feedbackPanelERROR\">Bitte tragen Sie einen Wert im Feld 'Passwort' ein.</span>
				   </li>";
		return $msg;
	} else {
		return 1;
	
	}

function checkPassword2($password, $password2){
	if(empty($email2)){
		$msg =    "<li class=\"feedbackPanelERROR\">
		 		   <span class=\"feedbackPanelERROR\">Bitte tragen Sie einen Wert im Feld 'Emailadresse bestätigen' ein.</span>
				   </li>";
		return $msg;
	} else if($password2 != $password){
		$msg =    "<li class=\"feedbackPanelERROR\">
		 		   <span class=\"feedbackPanelERROR\">'Emailadresse' und 'Emailadresse bestätigen' müssen gleich sein.</span>
				   </li>";
		return $msg;
	
	}

	}


  }

}

?>

die Funktion reg() dient zum abfragen ;)

Hoffe ihr seht evtl. den einen oder anderen Fehler ;)

Ich bitte auf die Frage warum ich nicht ein fertiges RegScript benutze zu verzichten, da sich die jeder selbst beantworten kann ;)


Danke vorab ;)

Syc
 
Zuletzt bearbeitet:
Ich habe dein Skript mal so überarbeitet, dass sich das auch ein anderer mal anschauen möchte:
PHP:
class Errors implements Iterator {
  private $errors = array();

  public function current () {
    return current($this->errors);
  }

  public function key () {
    return key($this->errors);
  }

  public function next () {
    next($this->errors);
  }

  public function rewind () {
    reset($this->errors);
  }

  public function valid () {
    return (key($this->errors) !== null);
  }

  public function add ($field, $message) {
    $this->errors[$field][] = $message;
  }

  public function count () {
    return count($this->errors);
  }
}

class Registration {
  private $fields = array();
  private $errors;

  public function __construct (array $fields) {
    $this->fields = $fields;
    $this->errors = new Errors;

    $this->validate();
  }

  public function errors () {
    return $this->errors;
  }

  private function validate () {
    if (empty($this->fields['account_name'])) {
      $this->errors->add('Nutzername', 'Ungültiger Nutzername');
    }

    if (empty($this->fields['mail_address']) or empty($this->fields['mail_address_confirm'])) {
      $this->errors->add('E-Mail-Adresse', 'Ungültige E-Mail-Adresse');

    } elseif (!filter_var($this->fields['mail_address'], FILTER_VALIDATE_EMAIL)) {
      $this->errors->add('E-Mail-Adresse', 'Ungültige E-Mail-Adresse');

    } elseif ($this->fields['mail_address'] !== $this->fields['mail_address_confirm']) {
      $this->errors->add('E-Mail-Adresse', 'E-Mail-Adressen stimmen nicht überein');

    }

    $query  = 'SELECT COUNT(*) FROM {dbprefix}account WHERE emailAddress = "%s" OR accountName = "%s"';
    $result = $GLOBALS['db']->ReadField(spintf($query, $this->fields['mail_address'], $this->fields['account_name']));

    if ($result > 0) {
      $this->errors->add('Nutzername', 'Nutzername ist nicht mehr verfügbar');
    }

    if (empty($this->fields['password']) or empty($this->fields['password_confirm'])) {
      $this->errors->add('Kennwort', 'Ungültiges Kennwort');

    } elseif ($this->fields['password'] !== $this->fields['password_confirm']) {
      $this->errors->add('Kennwort', 'Kennwörter stimmen nicht überein');
      
    }
  }
}
PHP:
<?php
  $registration = new Registration(array(
    'account_name'          => $_POST['accountName'];
    'mail_address'          => $_POST['emailAddress'],
    'mail_address_confirm'  => $_POST['emailConfirm'],
    'password'              => $_POST['password'],
    'password_confirm'      => $_POST['passwordConfirm']
  ));

  $errors = $registration->errors();
?>

<?php if ($errors->count() > 0): ?>
  <div class="errors">
  <?php foreach ($errors as $field => $error): ?>
    <fieldset>
      <legend><?php echo $field ?></legend>
      <ul>
        <?php foreach ($error as $message): ?>
        <li><?php echo $message ?></li>
        <?php endforeach ?>
      </ul>
    </fieldset>
  <?php endforeach ?>
  </div>
<?php endif ?>
 
Zuletzt bearbeitet:
Das Skript beendet sich nach dem ersten Fehler, da du nach jeder Abfrage ein return eingebaut hast, was dazu führt dass im Fehlerfall die Funktion beendet wird ohne weiter den Code dort auszuführen.
Das Problem ist also hier:
Code:
if(register::checkName($accountName) != 1){
        return register::checkName($accountName);
     }
    if(register::checkMail($email) != 1){
        return register::checkMail($email);
     }
    if(register::checkMail2($email, $email2) != 1){
        return register::checkMail2($email, $email2);
     }
    if(register::checkPassword($password) != 1){
        return register::checkMail($password);
     }
    if(register::checkPassword2($password, $password2) != 1){
        return register::checkMail2($password, $password2);
     }

€dit: Durch die Überarbeitung wurden die returns entfernt und deswegen funktioniert das umgeschriebene Skript auch.
Schau dir die Unterschiede an, denn davon kann man auch was lernen ;)
 
Danke Chumper,
das war die Lösung meiner Probleme ;)

Meine Post oben wie gesagt bitte nicht Persönlich nehmen ;)


//Erldigt!
 
Ähnliches problem... Deshalb setzte ich das Thema nochmal auf "nicht erledigt" ;)

Dieses mal habe ich das problem, das bei erfolgreichem Update dennoch der Text für "return 3" ausgegeben wird...

Hier die Funktion der account.php
PHP:
function updateAccount(){
	$account 		= $_SESSION["account"];
		if(!empty($_POST["accountName"])){
			$checkNameConfirm = $GLOBALS['db']->ReadField("SELECT {'dbprefix'}account.accountName FROM {'dbprefix'}account WHERE id = '".$account."' ");
			if($checkNameConfirm != strtolower($_POST["accountName"])){
				$accountName = $_POST["accountName"];
					if(strlen($_POST["accountName"]) >= 3 and strlen($_POST["accountName"]) <= 255 ){
						$checkName = $GLOBALS['db']->ReadField("SELECT COUNT(*) FROM {'dbprefix'}account WHERE {'dbprefix'}account.accountName='".strtolower($accountName)."' ");
							if($checkName == 0){
								return $GLOBALS['db']->Execute("UPDATE
																		{'dbprefix'}account 
																	SET 
																		{'dbprefix'}account.accountName = '".strtolower($accountName)."',
																		{'dbprefix'}account.name = '".$accountName."'
																	WHERE 
																		{'dbprefix'}account.id = '".$account."'
																	");
							}else{
								return 0;
							}
					}else{
						return 2;					
					}
			}else{
				return 3;
			}
		}else{
			return 4;	
		}
//End function
}

Hier die Abfrage:
PHP:
	if(isset($_POST["id_f1"])){
		if(account::updateAccount() == 0){
			$msg = "* Der gewählte 'Username' ist bereits vergeben.";
		}else if(account::updateAccount() == 1){
			$msg = "Klappt";
		}else if(account::updateAccount() == 2){
			$msg = "* Der Username muss zwischen 3 und 255 Zeichen lang sein.";
		}else if(account::updateAccount() == 3){
			$msg = "* Keine Änderung.";
		}else if(account::updateAccount() == 4){
			$msg = "* Username darf nicht leer sein.";
		}
	}


Ansich klappt das alles, nur wird eben nicht bei erfolgreichem Update "$msg = "Klappt"; sondern "$msg = *keine änderung";" (return 3)...

return 3 ist allerdings nur wenn der Eintrag $accountName aus der Datenbank mit dem $_POST["accountName"] übereinstimmt...

Wenn ich mir bei erfolgreichem Update das ganze als "echo account::updateAccount()" ausgebe, erhalte ich den wert 1


Danke schonmal fürs sichten ;)
Nochmals die bitte... auch wenn ich die Arbeit zu schätzen weiß, sollte das ganze in dem Code-Format bleiben ;)


Syc
 
Zuletzt bearbeitet:
Du rufst die Funktion fünfmal (danke htc) hintereinander auf, beim ersten mal wird alles geändert (Rückgabe 1), du prüfst aber nur auf Rückgabewert 0, dann wird wieder geändert, da aber alles aktuell ist bekommst du Rückgabewert 3, du prüfst auf 1 also geht er da auch nicht rein, und so weiter, beim vierten mal klappt es dann.

Ich muss dich bitten, den Code besser einzurücken, den kann man nicht lesen.
Dann würde ich dir raten dich dem neuen Code zu widmen, da weniger fehleranfällig.
Ansonsten wirst du noch viele Fehler und Fragen haben ;)

Ruf die Funktion einmal******! auf und speicher den Rückgabewert und prüf dann auf die Variable, das ist immer! besser.

PHP:
if(isset($_POST["id_f1"])){
        $test = account::updateAccount();
        if($test  == 0){
            $msg = "* Der gewählte 'Username' ist bereits vergeben.";
        }else if($test  == 1){
            $msg = "Klappt";
        }else if($test  == 2){
            $msg = "* Der Username muss zwischen 3 und 255 Zeichen lang sein.";
        }else if($test == 3){
            $msg = "* Keine Änderung.";
        }else if($test  == 4){
            $msg = "* Username darf nicht leer sein.";
        }
    }
 
Zuletzt bearbeitet:
Hallo,

also dein Problem ist hier
PHP:
  if($checkNameConfirm != strtolower($_POST["accountName"])){
Also ist $checkNameConfirm das gleiche wie strtolower($_POST["accountName"])). Da mir aber nicht klar ist, was ich welcher Variable drinne ist, kann ich dir da nicht weiterhelfen.

Zudem ruffst du account::updateAccount() im Prinzip 5 mal auf, ich glaube das ist nicht so gewollt. Nimm lieber switch, http://php.net/manual/de/control-structures.switch.php

Gruß

EDIT:

Ach verdammt, wieder zu lamm. Naja, wurde ja oben schon mal schöner erklärt.
 
Zuletzt bearbeitet:
Hallo,

also dein Problem ist hier
PHP:
  if($checkNameConfirm != strtolower($_POST["accountName"])){
Also ist $checkNameConfirm das gleiche wie strtolower($_POST["accountName"])). Da mir aber nicht klar ist, was ich welcher Variable drinne ist, kann ich dir da nicht weiterhelfen.

Eine zeile höher ist die MySQL abfrage.... ;)
PHP:
$checkNameConfirm = $GLOBALS['db']->ReadField("SELECT {'dbprefix'}account.accountName FROM {'dbprefix'}account WHERE id = '".$account."' ");
    if($checkNameConfirm != strtolower($_POST["accountName"])){

$checkNameConfirm gibt den aktuell in der DB eingetragenen wert aus... Sprich findet da der abgleich statt, ob neuer Name = alter Name...

Alt: Test, Neu: Test = * Keine Änderung
Alt: Test, Neu: Muffin = Eintrag... (allerdings kommt dann hier wenn der eintrag erfolgreich war eben dennoch * Keine Änderung.

@Chumper: Habe es direkt so umgesetzt ;)
Werde mich wohl oder übel demnächst damit beschäftigen müssen, allerdings würde ich gerne erst die Account-Verwaltung fertigstellen ;) (nur noch Passwort ändern und Account Löschen)
 
Zuletzt bearbeitet:
Eine zeile höher ist die MySQL abfrage.... ;)
PHP:
$checkNameConfirm = $GLOBALS['db']->ReadField("SELECT {'dbprefix'}account.accountName FROM {'dbprefix'}account WHERE id = '".$account."' ");
    if($checkNameConfirm != strtolower($_POST["accountName"])){

$checkNameConfirm gibt den aktuell in der DB eingetragenen wert aus... Sprich findet da der abgleich statt, ob neuer Name = alter Name...


Das war mir schon klar, aber mir war nicht klar was in der DB steht ;) Wenn du dir sicher bist, das da kein Fehler in der SQL abfrage ist, würde ich mal den Rat von Chumper befolgen:

Du rufst die Funktion fünfmal (danke htc) hintereinander auf, beim ersten mal wird alles geändert (Rückgabe 1), du prüfst aber nur auf Rückgabewert 0, dann wird wieder geändert, da aber alles aktuell ist bekommst du Rückgabewert 3, du prüfst auf 1 also geht er da auch nicht rein, und so weiter, beim vierten mal klappt es dann.

mach es also so:

PHP:
if (isset($_POST["id_f1"])) {
		switch (account::updateAccount()) {
				case 0:
						$msg = "* Der gewählte 'Username' ist bereits vergeben.";
						break;
				case 1:
						$msg = "Klappt";
						break;
				case 2:
						$msg = "* Der Username muss zwischen 3 und 255 Zeichen lang sein.";
						break;
				case 3:
						$msg = "* Keine Änderung.";
						break;
				case 4:
						$msg = "* Username darf nicht leer sein.";
						break;
		}
}
 
Zurück