You are not logged in.

  • Login

1

Wednesday, November 30th 2011, 10:20pm

Verflixtest Porblem mit verschachtelten if abfragen

Hallo,

Da unser eigentliche Coder immoment keine Zeit hat habe ich mich dran versucht.
Gibt man Username und Passwort korrekt an leitet er ohne Probleme weiter. Lässt man aber das PW frei so sagt er Passwort falsch obwohl er dort garnicht mehr nach Passwort prüfen soll.

Das Script hat mehrere if abfragen die alles Prüfen sollen.
Passwort übergeben, wen nicht prüfen ob name in der db, wen nja fehlermeldung wenn nein session setzen
passwort und name übergeben prüfen auf richtigkeit etc
Erklärungen kann man den Kommentaren entnehmen.

Wenn kein Passwort angebenen ist sollte er den else teil in zeile 46 nutzen und nicht den in zeile 41?

Ich kann mir vorstellen das dort einiges nicht stimmt und hoffe ihr weist mir den richtigen Weg ;)

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// Prüfen ob eingeloggt
		if ( $User->login_status() == true )
		{
			// Login OK, Weiterleite an Chat
			$_SESSION['user_nickname'] = $User->get_user_value('user_nickname');
			$_SESSION['user_id'] = $User->get_user_value('user_id');
			$Core->redirect("index.php?mode=chat");
		}
		else
		{
			// Loginvorgang wird ausgeführt
			if ( $Core->get(POST, 'login_send', true) )
			{
				$username		= $User->clean_username($Core->get(POST, 'username'));
				$password		= trim(htmlspecialchars($Core->get(POST, 'password')));
				// Userdaten aus der Datenbank laden
				$DB->set_sql('SELECT * FROM ' . USERS . ' WHERE `user_nickname`=:1');
				$DB->execute($username);
				$user_row = $DB->fetch_assoc();
				$DB->free();
 
				// Passwort übergeben?
				if (empty($password)) 
				{
					$pass_crypt = $User->password_hash($password . $user_row['user_salt'], ($user_row['user_old_pw'] == 1)? true : false);
					// Userdaten aus der Datenbank laden
					$DB->set_sql('SELECT * FROM ' . USERS . ' WHERE `user_nickname`=:1 AND user_password =:2');
					$DB->execute($username,$pass_crypt);
					$row = $DB->fetch_assoc();
					$DB->free();
 
					// Stimmen die Daten, weiterleiten an Chat
					if($row !== false)
					{
						// Login OK, Weiterleite an Chat
						$_SESSION['user_nickname'] = $row['user_nickname'];
						$_SESSION['user_id'] = $row['user_id'];
						$Core->redirect("index.php?mode=chat");
					}
					else
					{
						// Passwort Falsch
						echo 'Falsches PW';
					}
				}
				else
				{
					// else Teil der Passwort übergabe
					// Wenn kein Passwort übergeben wurde hier prüfen
					// Ob nickname bereits in der DB
					if(!$user_row !== false)
					{
						echo 'Nickname belegt';
					}
					else
					{
						// Nickname nicht in der DB dann weiterleiten
						$_SESSION['user_nickname'] = $Core->get(POST, 'username');
						$_SESSION['user_id'] = 1;
						$Core->redirect("index.php?mode=chat");
					}
				}
 
			}
			else
			{
				$Smarty->assign(array(
            		'LANG' 				=> $lang,
					'SITENAME'			=> $Core->get_config('page_title') . ' • ' . $lang['LOGIN'],
        		));
 
				$this->display('chat_login.htm');
 
			}
		}

2

Wednesday, November 30th 2011, 10:50pm

Du hast den if und else zweig bei empty($password) vertauscht... wenn die passwortvariable leer ist fängst du an mit dem hashen etc... Einfach die Bedingung negieren und es sollte passen... zumindestens die Stelle, weiter hab ich dann nicht geschaut ^^

3

Wednesday, November 30th 2011, 11:12pm

Ich hab ja nicht viel Ahnung von PHP, aber ich glaube man schreibt

$User->login_status()
statt
$User->login_status() == true

und

!$user_row
statt
!$user_row !== false

4

Wednesday, November 30th 2011, 11:14pm

@Rondrer
oO da hab ich wohl den wald vor lauter bäumen nicht gesehen *g*

Aber nun das nächste Problem. Bei Zeile 51 sagt er mir nun nickname belegt obwohl dies nicht der fall ist und ich bin ir ganz sicher das dort die if abfrage diesmal korrekt ist

5

Wednesday, November 30th 2011, 11:21pm

Sicher?

Wenn $user_row daten enthält (und der User existiert), wird die Vareable auf true gemappt.

!$user_row !== false
!true !== false
false !== false
false


und schwups landest du im else-part, obwohl du eigentlich die Fehlermeldung ausgeben willst oder?

6

Wednesday, November 30th 2011, 11:28pm

Hrhr klar klingt logisch :P

Ein Ändern auf

!$user_row == false

brachte den Erfolg.
Ich denke mal bei diesen 2 Flüchtigkeitsfehlern sollte ich mal 1-2 Tage Pause einlegen oder doch nicht :?:

7

Wednesday, November 30th 2011, 11:29pm

und warum änderst du es nicht auf:
if ($user_row)

???

8

Wednesday, November 30th 2011, 11:40pm

Weil es mit !$user_row == false ja auch klappte von daher sollte dies ja eigentlich egal sein ob !$user_row == false oder nur $user_row oder wird dort auch unterschieden? Beide IF Abfragen erziehlen ja das gleiche Ergebniss

9

Thursday, December 1st 2011, 8:21am

Es ist halt irgendwie ne doppelte Verneinung, was die ganze Sache auf den ersten Blick ein bisschen schwierig zu verstehen macht. Und dann passieren eben auch so Fehler, wie du ihn hattest, dass es dann einfach falschrum ist ;)

10

Friday, December 2nd 2011, 2:39pm

Weil es mit !$user_row == false ja auch klappte von daher sollte dies ja eigentlich egal sein ob !$user_row == false oder nur $user_row oder wird dort auch unterschieden? Beide IF Abfragen erziehlen ja das gleiche Ergebniss

Natürlich funktioniert das so auch, aber die Grundlagen der Logik geben vor, dass du deine Aussagen einfach halten sollst, damit diese leicht zu verstehen sind. Man sagt ja auch nicht zwei mal nicht in einem Satz :)

Es ist für andere und auch für dich selber viel besser, wenn du deine logischen Aussagen so aufstellst, dass man diese auf anhieb verstehen kann. Dann findet man einen eventuellen Fehler auch viel schneller :)

11

Friday, December 2nd 2011, 5:26pm

Ok Ok, ich werde in Zkunkft schauen das ich es lesbarere hinbekomme ;)

Similar threads

Social bookmarks