login schon vergeben....

Headymaster

Erfahrenes Mitglied
Hallo!

Also habe ein Prob.

Ich habe ein registrationsformular, dass nachdem es abgeschickt wurde auf vollständigkeit usw überprüft wird.

So ziemlich am Ende wird auch überprüft, ob der loginname schon existiert oder nicht....
Wenn der loginname schon existiert---> Fehler, wenn nicht dann halt Registration in DB schreiben....

Hier mal Auszug aus dem Reg-Vorgang:
PHP:
<?php
//Überprüfen, ob Username bereits existiert....
				           $query = $this->db->query("SELECT * FROM `user` WHERE login='".$user_login."'");
					       if($this->db->num_rows($query) == 0)
					       {
					          // Neuen User in die Datenbank schreiben + Password generieren + Mail mit Zugangsdaten an den User
							  $pw = $this->gen_pw(10);
							  $query2 = $this->db->query("INSERT INTO `user` (login, password, rights, email1) VALUES ('".$user_login."', '".md5($pw)."', '1', '".$user_email1."')");
}
?>

So Problem ist nun, dass wenn ein loginname mal existiert HAT aber der User gelöscht wurde oder sonstiges, sprich der login_name gar nicht mehr in der DB ist, dann wird trotzdem der Fehler ausgegeben, dass der User schon existieren würde....

Woran kann das liegen?

Würde mich super über Hilfe freuen :)

MFG Niels
 
Schonmal geguckt, was $this->db->num_rows() denn zurückgibt? Fängst du Fehler in deiner DB-Klasse auch ab? [phpf]error_reporting[/phpf] auf E_ALL? Und ist der User wirklich aus der DB raus? :) Man weiß ja nie... :)

PHP:
<?php
//Überprüfen, ob Username bereits existiert....
                           $query = $this->db->query("SELECT `login` FROM `user` WHERE `login` = '".$user_login."'");
                           if($this->db->num_rows($query) < 1)
                           {
                              // Neuen User in die Datenbank schreiben + Password generieren + Mail mit Zugangsdaten an den User
                              $pw = $this->gen_pw(10);
                              $query2 = $this->db->query("INSERT INTO `user` (`login`, `password`, `rights`, `email1`) VALUES ('".$user_login."', '".md5($pw)."', '1', '".$user_email1."')");
}
?>
 
Dass der Uer aus der DB raus ist kann ich mit Sicherheit sagen, da ich den USer noch per Hand über phpmyadmin löschen muss....habe das noch net in mein Interface geschrieben :(

Naja was zurückgegeben wird habe ich noch nicht überprüft, aber eigentlich werden ja nur alle Reihen gezählt die den login_namen haben, sprich wenn der login_name nicht existiert müsste ja 0 zurückgegeben werden.....

So und error_reporting habe ich nicht gesetzt, arbeite momentan nur mit mysql_error und mysql_errno....


//Edit
Es wird desweiteren der Uer trotzdem in die DB geschrieben, obwohl ich den Fehler bekomme, dass der User schon existiert....

//Edit 2

So als db_num_rows gibt mir zurück:

-> 00 wenn User nicht in DB
-> 11 wenn User schon in DB

Aber das kapier ich nicht, warum bekomme ich 00 und 11 zurück und nicht 0 und 1..... bei anderen Funktionen wo ich db->num_rows verwende bekomme ich auch nur 0 und 1 oder halt mehr als 1 wenn zb. 20 Reihen da sind dann halt 20....



MFG Niels
 
Zuletzt bearbeitet:
ok hier is die funktion register
PHP:
<?php
function register($user_login, $user_email1, $user_email2)
			{
			   if(isset($user_login) && isset($user_email1) && isset($user_email2))
			   {
			      if(!empty($user_login) && !empty($user_email1) && !empty($user_email2))
				  {
				     if($user_email1 == $user_email2)
					 {
					   if($this->proof->email_proof($user_email1))
					   {
				           //Überprüfen, ob Username bereits existiert....
				           $query = $this->db->query("SELECT * FROM `user` WHERE login='".$user_login."'");
						   echo $this->db->num_rows($query);
					       if($this->db->num_rows($query) < 1)
					       {
					          // Neuen User in die Datenbank schreiben + Password generieren + Mail mit Zugangsdaten an den User
							  $pw = $this->gen_pw(10);
							  $query2 = $this->db->query("INSERT INTO `user` (login, password, rights, email1) VALUES ('".$user_login."', '".md5($pw)."', '1', '".$user_email1."')");
							  // Hier mail an den User !

							  //header("Location:index.php");
					       }
					       else
					       {
					        // Fehlerausgabe
					        $fehler .= $this->lang['register_useralrexists']."<br>";
					       }
					    }
						else
						{
						   $fehler .= $this->lang['register_mailnotallowed']."<br>";
						}
					  }
					  else
					  {
					     $fehler .= $this->lang['register_mailsnotsame']."<br>";
					  }
				  }
				  else
				  {
				     $fehler .= $this->lang['register_notallfilled']."<br>"; 
				  }
			   }
			   else
			   {
			     $fehler .= $this->lang['register_notallfilled']."<br>";
			   }
			   $fehler .= $this->lang['java_back'];
			   
			  return $fehler; 
			}
?>

Und lies dir nochma mein Edit von dem Beitrag davor durch auf Bezug zu der Rückgabe von db->num_rows ^^
 
Rufst du die Funktion register eventuell doppelt auf? Mach mal ein .'<br />' hinter das echo $this->db->num_rows(), wenn die Zahlen in neuer Zeile, dann wird die Funktion zweimal aufgerufen... Weiterhin würde ich nur der Performance halber folgendes nicht machen:
PHP:
$query = $this->db->query("SELECT * FROM `user` WHERE login='".$user_login."'");
Hier werden alle Spalten der Reihe mit login=$user_login abgefragt, du brauchst ja aber nur eine Spalte zum Zählen, folgendes tuts also auch:
PHP:
$query = $this->db->query("SELECT `login` FROM `user` WHERE `login`= '".$user_login."'");
 
Ja hattest Recht, wird anscheinend 2 mal aufgerufen, nur wo..?!

Ich habe echt kein Plan wie das passieren kann obwohl in der ganzen Klassenmethode nur einmal num_rows aufrufe...

MFG Niels
 
Diese Zeile kannst du rausnehmen, da der Ausdruck allgemeingültig ist:
PHP:
if(isset($user_login) && isset($user_email1) && isset($user_email2))

Ich empfehle dir übrigens eine etwas andere Struktur, die – wie ich finde – übersichtlicher ist:
PHP:
function register($user_login, $user_email1, $user_email2)
{
	$fehler = array();

	// Validierung der Daten
	if( empty($user_login) || empty($user_email1) || empty($user_email2) ) {
		$fehler[] = $this->lang['register_notallfilled'];
	}
	if( $user_email1 != $user_email2 ) {
		$fehler[] = $this->lang['register_mailsnotsame'];
	}
	if( !$this->proof->email_proof($user_email1) ) {
		$fehler[] = $this->lang['register_mailnotallowed'];
	}
	$result = $this->db->query("SELECT 1 FROM `user` WHERE login='".mysql_real_escape_string($user_login)."'");
	if( $this->db->num_rows($result) > 0 ) {
		$fehler[] = $this->lang['register_useralrexists'];
	}

	// war Validierung erfolgreich, wird der neue Benutzer angelegt
	if( empty($fehler) ) {
		$result = $this->db->query("INSERT INTO `user` (login, password, rights, email1) VALUES ('".mysql_real_escape_string($user_login)."', '".md5($this->gen_pw(10))."', '1', '".mysql_real_escape_string($user_email1)."')");
		return true;
	}

	$fehler[] = $this->lang['java_back'];

	return $fehler;
}
 
Also das mit der Strukturierung is ne supa Idee nur das Problem ist, dass nun ein Problem mit dem array entsteht, denn ich bekomme nur array ausgegeben und nicht die Fehler :)

Es wird ja auch nur das array zurückgegeben, aber wie mache ich das nun dass er auch gleich den Inhalt des arrays ausgibt?!

Also aufrufen tu ich die reg function so:

PHP:
$content =  $user->register($_POST['login'], $_POST['email1'], $_POST['email1_2']);

$content wird global immer für einen Platzhalter eingesetzt sprich $content ist der eigentlich content bereich der Page.

MFG Niels
 
PHP:
$content =  $user->register($_POST['login'], $_POST['email1'], $_POST['email1_2']);
if(is_array($content))
{
    foreach($content as $err)
    {
        echo $err.'<br />';
    }
}
else
{
    // ... 
}
 
Zurück