[PHP/SQL] - function.mail() macht Probleme



  • Hallo

    Ich hatte ein Memberportal in PHP mit Verwendung von SQL programmiert.
    Bei der Registrierung werden alle Daten des Mitgliedes gesammelt und anschliessend wird ein Aktivierungscode in die Datenbank gespeichert.

    Das neu registrierte Mitglied erhält gleich danach eine E-Mail an seine Adresse mit einem Aktivierungslink. Dieser schaltet dann die Mitgliedschaft endgültig frei wodruch der Login danach möglich ist.

    Bis dorthin klappt alles! Der Parameter $email wird vom Aktivierungslink ...&email=mail@mitglied.ch&sid=88828281 übergeben.

    Der Code:

    case 'activate':
    	{
    			$connectionid_acti  = mysql_connect ($db_host, $db_user_config, $db_pass);
    if (!mysql_select_db ($db_name_config, $connectionid_acti))
    {
      die ("Keine Verbindung zur Datenbank");
    }
    
    //Überprüfgen ob Nummer mit Eintrag stimmt, wenn Ja, dann status ändern!
    	$result = mysql_query("SELECT membernr, Nickname, email, number_activate FROM members WHERE email='$email'");
    		while ($row = mysql_fetch_array($result)) {
    		$mitgliednr = $row['membernr'];
    		$old_email = $row['email'];
    		$nickname_member = $row['Nickname'];
    		$old_nr = $row['number_activate'];
    	}
    
    	if($sid == $old_nr)
    	{
    	//UPDATE STATUS
    	$new_status = "OK";
    	mysql_query("UPDATE members SET status='".$new_status."', number_activate='ACTIVATED'");
    	echo '<center><b>Registrierung erfolgreich!</b><br>Die Registrierung wurde erfolgreich abgeschlossen und Dein Account aktiviert.<br>Du kannst Dich nun einloggen. Klicke <a href="your_account.php" target="_self" style="text-decoration: underline; color:black;">hier</a>.</center>';
    
    	$result_ok1 = mysql_query("SELECT Nickname, Kennwort, Nachname, Vorname FROM benutzerdaten WHERE Nickname='".$nickname_member."'");
    		while ($row_ok1 = mysql_fetch_array($result_ok1)) {
    		$nick = $row_ok1['Nickname'];
    		$pass = md5($row_ok1['Kennwort']);
    		$nachname = $row_ok1['Nachname'];
    		$vorname = $row_ok1['Vorname'];
    		}
    
    	$header_ok = "From:info@globesolutions.ch(Globesolutions GmbH)";
    	$betreff_ok = "Herzlich Willkommen, ".$nachname." ".$vorname."!";
    	$nachricht_ok = "Sehr geehrter ".$vorname." ".$nachname.",
    
    	Deine Registrierung war erfolgreich.
    	Wir heissen Dich als neues Mitglied bei Globesolutions herzlich willkommen und wünschen Dir viel Spass.
    
    	Hier sind nocheinmal Deine Logindaten, bitte bewahre diese sorgfältig auf:
    
    	---------------------------------------
    	Nick-/Username:    ".$nick."
    	Kennwort      :    ".$pass."
    	Mitgliednummer:    ".$mitgliedernr."
    	---------------------------------------
    
    	Freundliche Grüsse
    
    	Dein Globesolutions-Team!";
    	mail($old_email, $betreff_ok, $nachricht_ok, $header_ok);
    	}
    
    	else
    	{
    	echo '<center>Der Account existiert nicht / wurde gelöscht!</center>';
    	}
    

    Doch das Problem liegt, so vermute ich, entweder an dieser Stelle hier:

    $result = mysql_query("SELECT membernr, Nickname, email, number_activate FROM members WHERE email='$email'");
    		while ($row = mysql_fetch_array($result)) {
    		$mitgliednr = $row['membernr'];
    		$old_email = $row['email'];
    		$nickname_member = $row['Nickname'];
    		$old_nr = $row['number_activate'];
    	}
    

    oder an dieser Stelle hier:

    result_ok1=mysql_query("SELECTNickname,Kennwort,Nachname,VornameFROMbenutzerdatenWHERENickname=".result\_ok1 = mysql\_query("SELECT Nickname, Kennwort, Nachname, Vorname FROM benutzerdaten WHERE Nickname='".nickname_member."'");
    while (row_ok1=mysql_fetch_array(row\_ok1 = mysql\_fetch\_array(result_ok1)) {
    $nick = row_ok1['Nickname']; pass = md5(row_ok1['Kennwort']); nachname = row_ok1['Nachname']; vorname = $row_ok1['Vorname'];
    }

    Denn das E-Mail, welches nach der erfolgreichen Aktivierung verschickt werden sollte und die Logindaten des Mitglieds enthält, wird leider nicht abgeschickt. Alles funktioniert bestens, nur dieses E-Mail erhält man nie.

    Ich habe lange gesucht, komme aber nicht auf den Fehler. Denn $email wird richtig übergeben und auch der Rest der members-Tabelle ist richtig ausgelesen, da sosnt die Überprüfung auch nicht funtkionieren würde, doch diese funktioniert!

    Testen?? Testen kann man das Script unter http://www.globesolutions.ch/register.php?reg=page1

    Grüsse
    Wolf



  • Okay, ich habe mir jetzt ein "Fehler-Quellen"-Report einbauen lassen.

    Dieser sollte eigentlich dann alle Daten in den benötigten Variablen ausgeben. Doch das Ergebnis bleibt leer. Somit wurden keine Daten ausgelesen oder übergeben. Doch ich frage mich warum? Schon oben gings nicht! Liegt es wohl an der if-Abfrage? Was ich aber bezweifle.

    Mein FehlerQuota-Report einbau sieht so aus:

    ....
    mysql_query("UPDATE members SET status='".$new_status."', number_activate='ACTIVATED'");
    	echo '<center><b>Registrierung erfolgreich!</b><br>Die Registrierung wurde erfolgreich abgeschlossen und Dein Account aktiviert.<br>Du kannst Dich nun einloggen. Klicke <a href="your_account.php" target="_self" style="text-decoration: underline; color:black;">hier</a>.</center>';
    
    	echo '<br><br><b>Ausgabe - Fehlerquellen der Tabelle <i>members</i></b><br><br>';
    	echo "Mitgliednr: ".$mitgliednr." <br>";
    	echo "E-Mail: ".$old_email." <br>";
    	echo "Nickname aus Tabelle <i>members</i>: ".$nickname_member." <br>";
    
    	$result_ok1 = mysql_query("SELECT Nickname, Kennwort, Nachname, Vorname FROM benutzerdaten WHERE Nickname='".$nickname_member."'");
    		while ($row_ok1 = mysql_fetch_array($result_ok1)) {
    		$nick = $row_ok1['Nickname'];
    		$pass = md5($row_ok1['Kennwort']);
    		$nachname = $row_ok1['Nachname'];
    		$vorname = $row_ok1['Vorname'];
    		}
    
    	echo '<br><br><b>Ausgabe - Fehlerquelle der Tabelle <i>benutzerdaten</i></b><br><br>';
    	echo "Nickname: ".$nick."<br>";
    	echo "Passwort: ".$pass."<br>";
    	echo "Nachname: ".$nachname."<br>";
    	echo "Vorname : ".$vorname."<br><br>Sind alle Angaben korrekt? Dann liegt in der SQL-Anweisung kein Fehler vor!";
    
    ....
    

    Ergebnis = NULL.

    Die Variablen werden net angezeigt. Lediglich der Text in Echo "".

    Wo ist das Problem? Versteh ich net... sobald ich die Lösung hab meld ich mich wieder ,danke für Eure Hilfe!

    Grüsse
    Wolf



  • überprüf mal den Rückgabewert der mail-Funktion

    dann natürlich den SQL-String mal in phpmyadmin testen, ob er eine Rückgabe liefert...

    ein paar Sachen noch: mysql_fetch_assoc() wäre in deinem Fall praktischer (deine Version ist nicht falsch, liefert aber auch numerische Indizes, die man selten benötigt.
    Und <center> sollte man schon seit Jahren nichtmehr verwenden. Schon alleine deswegen, da es als deprecated (abgelehnt) gilt, es kann also jederzeit passieren, dass es nichtmehr funktioniert. (genauso wie <b>, <i>, <u> usw.)
    Und es heißt <br />, nicht <br> 😉



  • zwutz schrieb:

    Und <center> sollte man schon seit Jahren nichtmehr verwenden. Schon alleine deswegen, da es als deprecated (abgelehnt) gilt, es kann also jederzeit passieren, dass es nichtmehr funktioniert. (genauso wie <b>, <i>, <u> usw.)
    Und es heißt <br />, nicht <br> 😉

    Was verleitet dich denn zu der Annahme, er würde XHTML verwenden? 😉

    @Wolf1985
    Ich hoffe doch, du prüfst die Namen deiner Benutzer auch gut durch, und speicherst sie nicht "nur" escaped in der Datenbank? Andernfalls könntest du dir Ärger durch z.B. HTTP Response Splitting einfachen ...

    Und wieso ließt du sämtliche Benutzer in eienr Schleife aus, die die gleiche E-Mail-Adresse besitzen, wenn du am Ende nur den letzten gefundenen Eintrag behandelst? Abgesehen davon denke ich, dass es eigentlich gar nicht erwünscht ist, beliebig viele Benutzer mit der gleichen E-Mail-Adresse zu haben? Dann pack ein LIMIT 1; rein und gut 😉



  • zwutz schrieb:

    überprüf mal den Rückgabewert der mail-Funktion

    dann natürlich den SQL-String mal in phpmyadmin testen, ob er eine Rückgabe liefert...

    ein paar Sachen noch: mysql_fetch_assoc() wäre in deinem Fall praktischer (deine Version ist nicht falsch, liefert aber auch numerische Indizes, die man selten benötigt.
    Und <center> sollte man schon seit Jahren nichtmehr verwenden. Schon alleine deswegen, da es als deprecated (abgelehnt) gilt, es kann also jederzeit passieren, dass es nichtmehr funktioniert. (genauso wie <b>, <i>, <u> usw.)
    Und es heißt <br />, nicht <br> 😉

    Danke. Hat sich erledigt. Bin selber drauf gekommen!

    Hatte nur $mail durch $_REQUEST['mail'] und bei sid das gleiche ersetzen müssen!
    Jetzt funktionierts..7

    Ach ja: $POST hätte nicht funktioniert. 😉

    Danke trotzdem. 🙂

    lg
    Wolf

    PS: Da das PAsswort MD5 verschlüsselt gespeichert wird, und nachträglich bei der Aktivierung das Passwort aber an den user gesnedet werden soll, wird das passwort vom User, welches gewählt wurde, mit in den Aktivierungslink eingebaut um dieses danach in Klartext dem user zu senden. Somit existiert in der DB nur verschlüsselte PWD's.. 🙂

    Passwort vergessen gibts halt ned, nur: Neues Generieren... *g*

    lg
    Wolf



  • árn[y]ék schrieb:

    zwutz schrieb:

    Und <center> sollte man schon seit Jahren nichtmehr verwenden. Schon alleine deswegen, da es als deprecated (abgelehnt) gilt, es kann also jederzeit passieren, dass es nichtmehr funktioniert. (genauso wie <b>, <i>, <u> usw.)
    Und es heißt <br />, nicht <br> 😉

    Was verleitet dich denn zu der Annahme, er würde XHTML verwenden? 😉

    ok... streichen wir die <br>-sache mal vorerst raus. Der Rest ist schlechter Stil, den man sich garnicht erst angewöhnen sollte (auch wenns auf dem ersten Blick einfacher ist als entsprechende CSS-Formatierungen).

    Und außerdem wird durch XHTML endlich mal versucht, Ordnung in das HTML-Chaos zu bringen... von daher spricht nix dagegen, es zu nutzen (im Gegenteil)

    jm2c



  • árn[y]ék schrieb:

    @Wolf1985

    Und wieso ließt du sämtliche Benutzer in eienr Schleife aus, die die gleiche E-Mail-Adresse besitzen, wenn du am Ende nur den letzten gefundenen Eintrag behandelst? Abgesehen davon denke ich, dass es eigentlich gar nicht erwünscht ist, beliebig viele Benutzer mit der gleichen E-Mail-Adresse zu haben? Dann pack ein LIMIT 1; rein und gut 😉

    Wieso kommst Du darauf dass ich sämtliche Benutzer in einer Schleife auslese mit der gleichen E-Mail Adresse??

    Zumal ist eine registrierung mit zwei gleichen oder Benutzern gar nicht möglich. 🙂 Und mit der Whileschleife lasse ich einfach die ganze Zeile, in dessen der gesuchte Wert vorhanden ist. Auselen wäre, wenn ich in der Whileshlife drin ein echo hätte. 🙂

    Aber in der Schleife habe ich nur die Zuordnungen für die Weiterverwendung...

    *smile* 😃

    Könnte sein dass es eine Bessere Methode zum auslesen der WErte gibt als mit while. Aber mit while hätte man gleich eine Alternative parat, falls man doch noch mal was ausgeben müsste.. kann man nur so fix rasch ändern um zum Beispiel mögliche FEhlerquellen abzuklären. 😉



  • Wolf1985 schrieb:

    Wieso kommst Du darauf dass ich sämtliche Benutzer in einer Schleife auslese mit der gleichen E-Mail Adresse??

    Hier rufst du alle Datensätze der DB ab, die die gegebene E-Mail-Adresse "besitzen", iterierst durch die Ergebnis-Tabelle, überschreibst jedes Mal die Inhalte der Variablen ($mitgliednr, $old_email usw.) mit den Daten der jeweiligen Tabellenzeile, lässt nach der letzten Iteration die Daten in den Variablen gespeichert und arbeitest mit ihnen:

    $result = mysql_query("SELECT membernr, Nickname, email, number_activate FROM members WHERE email='$email'"); 
            while ($row = mysql_fetch_array($result)) { 
            $mitgliednr = $row['membernr']; 
            $old_email = $row['email']; 
            $nickname_member = $row['Nickname']; 
            $old_nr = $row['number_activate']; 
        }
    


  • Zur verdeutlichung... der Parameter $email kommt von einer persönlichen E-Mail Adresse des registrierenden Benutzers, der seinen Account erst freischalten muss.

    Der Aktivierungslink in der E-Mail lautet zum beispiel so:

    http://www.globesolutions.ch/register.php?reg=activate&email=useremail@user.com&sid=83282722

    darum ist dort der parameter..

    Diese Abfrage sucht nicht alles durch. Übersetzt heisst der Befehl so:

    Suche in der Tabelle diese Zeile, wo die Email Adresse usermail@user.com vorkommt, wenn gefunden gebe die ganze Zeile zurück, den Rest bleibt ungültig.

    Und doppelte E-Mail Adressen können nicht vorkommen, da diese bei der registrierung auf einträge überprüft werden ob schon vorhanden oder nicht. 🙂

    Somit kann ja jeweils nur eine Mail ausgegeben werden. Und dieser Parameter $email sowie $sid ist nach der aktivierung ungültig, da der status auf OK und der parameter sid auf ACITVATED umgeschrieben wird. Somit würde bei einem zweiten Aufruf des aktivierungslinks die Fehlermeldung kommen dass schon aktiviert wurde oder der Account nicht gefunden wurde. : :p

    Alles klar? Wenn Du den ganzen Sinn verstehen möchtest, dann poste ich gerne hier die betreffenden Codes mit der Erklärung.. wird aber dann ein etwas längerer Post.. 😃

    lg
    Wolf



  • Ich verstehe durchaus den Sinn, aber das ändert nichts an meiner Aussage. Du iterierst durch alle Ergebnis-Zeilen, obwohl nur eine vorkommen sollte. Das ist nicht falsch, aber nicht sehr elegant. Mehr war gar nicht meine Aussage 😉


Anmelden zum Antworten