# Überprüfen ob eMail Adresse schon vorhanden ist



## haihaihai (22. Januar 2009)

Hi,

ich habe ein kleines Problem. Folgendes bekomme ich nicht hin. In einer Datenbank stehen eMail Adressen von registrierten Usern. 

Ich habe eine Funktion die bereits registrierten Usern ermöglicht sich ihr Login erneut zusenden zu lassen (falls man das Passwort vergessen hat  z,B.) Funktioniert auch wunderbar, nur ein Problem ist, dass das Script an jede eMail die Zugangsdaten sendet, auch an eMail Adressen die gar nicht in der Datenbank stehen. 

Es müsste also abgefragt werden ob die Adresse bereits existiert und wenn ja dann die Zugangsdaten senden, wenn nicht vorhanden dann abbrechen und Meldung Adresse nicht vorhanden oder so. *grübel*

Hier meine vorhandene Funktion zum senden:



```
else if($action == 2){
					//send Mail
					$eMail = stripslashes($_POST['eMail']);
					
					$sql = "SELECT accountName, password FROM user WHERE eMailPrivat='".$eMail."' or eMailWork='".$eMail."'";
					
					global $db, $config;
					$result = $db->query($sql);
					
					include_once($config->get_path_mail()."mailOp.php");
					$mailOp = new MailOp($db, $config);
					$mailOp->mail_passRecover($eMail, $result[0], base64_decode($result[1]));
					
					echo '<br><font face="verdana" size="1" color="#ffffff">Accountdaten gesendet an Ihre bevorzugte eMailadresse</font>';
				}
```

Einen Schnipsel habe ich hier leider nicht gefunden, vielleicht ist hier ja ein Profi der mit helfen kann.

Liebe Grüße!


----------



## Maniac (22. Januar 2009)

Da ich Deine verwendeten Klassen nicht kenne kann ich nur das hier mal als ansatz anbieten:


```
<?
else if($action == 2){
                    //send Mail
                    $eMail = stripslashes($_POST['eMail']);
                    
                    $sql = "SELECT accountName, password, eMailPrivat, eMailWork FROM user WHERE eMailPrivat='".$eMail."' or eMailWork='".$eMail."'";
                    
                    global $db, $config;
                    $result = $db->query($sql);
                    
                    include_once($config->get_path_mail()."mailOp.php");
                    $mailOp = new MailOp($db, $config);
					if($eMail == $result[3] || $eMail == $result[4])
					{
                    	$mailOp->mail_passRecover($eMail, $result[0], base64_decode($result[1]));
                    }
                    echo '<br><font face="verdana" size="1" color="#ffffff">Accountdaten gesendet an Ihre bevorzugte eMailadresse</font>';
                }  

?>
```


----------



## Gumbo (22. Januar 2009)

Was macht denn die MailOp-Klasse?


PS: Da du auch das Kennwort versendest: Speicherst du das etwa als Klartext? Mach das bloß nicht! Das ist eines der größten Fehler, die ein machen kann! Speichere lieber nur einen Salted Hash des Kennworts. Das reicht für deine Zwecke aus und das Kennwort als solches bleibt geschützt.
Um dennoch eine Passwort-vergessen-Funktion implementieren zu können, schickst du dem Benutzer statt des alten (oder eines neuen) Kennworts nur einen Link zu einer Seite, auf der er ein neues Kennwort eingeben kann. Und diesen Link machst du zusätzlich nur einmalig und zeitlich begrenzt gültig (beispielsweise 5 Minuten), um so einem Missbrauch vorzubeugen.


----------



## haihaihai (22. Januar 2009)

Uiii das geht ja flott hier 
Also die Klasse sieht so aus:

```
class MailOp{
	private $db;
	private $config;
	private $mail_body_passRecover;
	private $SENDER;

	
	public function MailOp($db, $config){
		$this->db = $db;
		$this->config = $config;
		$this->initMailBodies();
		$this->SENDER = "From: xxx@xxx.de";
	}
	
	public function mail_passRecover($eMail, $accountName, $password){
		global $db, $config;
		
		$body = $this->mail_body_passRecover;
		$body = preg_replace("!<accountName>!", $accountName, $body);
		$body = preg_replace("!<password>!", $password, $body);
		
		$subject = "Accountdaten für Schwarzes Brett";
		@mail($eMail, $subject, $body, $this->SENDER);
	}
```

Ja, mit dem Klartext Passwort stimmt natürlich, nur sind da leider schon 600 User drinn in der Datenbank und die müsste ich ja dann ovon hand umstellen denke ich.
Nebenbei müsste das ja dann auch umfangreich geändert werden. Das kann ich eh nicht so einfach.

LG


----------



## Gumbo (22. Januar 2009)

haihaihai hat gesagt.:


> Ja, mit dem Klartext Passwort stimmt natürlich, nur sind da leider schon 600 User drinn in der Datenbank und die müsste ich ja dann ovon hand umstellen denke ich.
> Nebenbei müsste das ja dann auch umfangreich geändert werden. Das kann ich eh nicht so einfach.


Und das hältst du für eine plausible Ausrede? Das ist Quatsch. Du kannst das sehr wohl auch nachträglich ändern. Und das solltest du auch.


----------



## l34trul3r (22. Januar 2009)

Nabend Jungs,

ich hab grad das gleiche Problem und hab mal ins Forum geschaut, schwups da hab ich schon nen passenden Thread gefunden 

Hoffe ich kann hier mit meinem code auch mal nachfragen, da meins bissl anders aussieht und ich aus dem bisherigen noch nicht schlau geworden bin.

Bei mir schauts so aus, dass ich mir nen register gebastelt habe und nun vorher gern in der db abfragen würde, ob die email oder der username bereits vergeben sind. Falls ja, soll nur ne Fehlermeldung ausgegeben werden, falls nicht, sollen die Daten an die db geschickt und gespeichert werden.

Meine Funktion sieht so aus:

```
function register($loginname, $md5pw, $emailadress, $birthday, $place)
{
	$check = "SELECT UserId FROM users WHERE UserName='".$name."' OR UserMail='".$emailadress."'";
	if (mysql_query($check)==true)
		echo'Der Name oder die Email-Adresse sind bereits vergeben';
	else
	{
	$sql = "INSERT INTO users (UserName, UserPass, UserMail, UserBirthday, UserPlace) VALUE ('".$loginname."', '".$md5pw."', '".$emailadress."', '".$birthday."', '".$place."')";
	mysql_query($sql) or die (mysql_error());
	echo 'Registrierung erfolgreich, <br>Sie können sich nun einloggen.';
	}
}
```
Scheint aber nicht zu funktionieren, denn obwohl beide Sachen frei sind, schreibt er, dass es nicht so ist.
Ich muss dazu sagen, so an sich funktioniert das Register, sprich ab dem "$sql".

Btw, bin noch PHP Anfänger wie man sieht, also bitte nich zu scharfe Kritik, dennoch würd ich mich freuen, wenn jemand Verbesserungsvorschläge hinsichtlich Struktur oder Optimierung posten könnte, da meine Seite die Anfragen nur sehr sehr langsam verarbeitet 

Danke im Voraus,

Gruß
l34trul3r


----------



## haihaihai (24. Januar 2009)

keiner eine Idee?

Gibt es eine FAQ für MsSql Datenbankabfragen, dann kann man dann sicher so einen Befehl ersehen vielleicht bekomm ich es selber hin irgendwie


----------



## Homer Simpson (25. Januar 2009)

l34trul3r hat gesagt.:


> Scheint aber nicht zu funktionieren, denn obwohl beide Sachen frei sind, schreibt er, dass es nicht so ist.


@l34trul3r
Ich denke mal es liegt an deiner if Abfrage:

```
if (mysql_query($check)==true)
```
da wird wahrscheinlich immer true zurück kommen, weil die SQL Abfrage immer etwas zurück liefert. Du musst halt prüfen was genau geliefert wird, bin jetzt aber selber nicht sicher.



			
				haihaihai hat gesagt.:
			
		

> dass das Script an jede eMail die Zugangsdaten sendet, auch an eMail Adressen die gar nicht in der Datenbank stehen.


 wo kommen die denn her?
Also im Prinzip musst du die einzelnen Schritte manuell prüfen, z.B. die Abfrage mit "echo $sql;" ausgeben und direkt auf der DB laufen lassen und mal die mail funktion deaktivieren und da eine Ausgabe machen.

```
//@mail($eMail, $subject, $body, $this->SENDER); 
echo $eMail . ": " . $body . "<hr>";
```


----------

