Session-Script, Meinungen



  • du kannst keine berchtigung zuweisen wenn du nicht weißt ob ein Datensatz vorhanden ist. Also musst du überprüfen ob eine Ergebnismenge vorliegt.



  • Na das hatte ich doch vorher mit dem while, da wurde sie nur zugewiesen, wenn eine ergebnissmenge vorliegt. Und da sowieso nie mehr als eine Ergebnissmenge vorliegen wird mache ich es dann auch besser wieder so, oder?

    Oder meinst du so in der Art?

    if ($result>0) 
            {    $Text = "Da ist deine Ergebnismenge";    } 
            else 
            {    $error= mysql_error($link); echo "<br>keine Ergebnismenge $error"; 
                die();    
            }
    


  • Ich mache das immer so

    $ID = $_POST["ID"];
    $PW = $_POST["PW"];
    
    if (isset($ID) && isset($PW))
    {
    	$PW = str_replace(' ','',$PW);
    	if (empty($ID) || !is_numeric($ID) )
    	{
    		$alert = "Bitte geben Sie Ihre Kennung ein!";
    	} elseif (empty($PW))
    	{
    		$alert = "Bitte geben Sie Ihr Passwort ein!";
    	}
    	else
    	{
    		$db = new sql_db($dbhost, $dbuser, $dbpasswd, $dbname);
    		if (!$db->db_connect_id)
    		{
    			$alert = "Fehler: Keine Verbindung zur DB hergestellt!\n Versuchen sie es bitte nochmals !";
    		}
    		else
    		{
    			if(!($result = $db->sql_query("SELECT id FROM userdaten WHERE id=$ID AND passwort='$PW' LIMIT 1")))
    			{
    				$errorm = $db->sql_error();
    				echo $errorm['message'];
    
    //				$alert = "Fehler: SQL-Anfrage nicht korrekt!";
    			}
    			else
    			{
    				if ($db->sql_numrows($result) == 0)
    				{
    					$alert = "Bitte geben Sie eine gültige Kennung oder Passwort ein!";
    				}
    				else 
    				{
    					if (!($row = $db->sql_fetchrow($result)))
    					{
    						$alert = "Fehler: SQL-Ergebnis nicht korrekt!";
    					}
    					else
    					{	
    						$kdnrId = $ID;
    						session_start();
    						$_SESSION['kdnrId'] = $kdnrId;
    						header("Location: frame.php?".SID);
    					}
    				}
    			}
    		}
    	}
    
    }
    


  • Ich habs jetzt so gemacht:

    if ( mysql_affected_Rows() > 0)	// Wenn Anmeldeinformationen korrekt sind
    		{	
    			// Jetzt wird man angemeldet			
    			$data=mysql_fetch_array($result);
    			$_SESSION['userPermission']=$data['permission'];	// Dem User wird die, in der DB für ihn eingetragene, Berechtigung zugewiesen
    			$logok = TRUE;	// Logon-Variable wird auf true gesetzt
    
    			// Jetzt wird das aktuelle Datum als last_logon in die DB geschrieben
    			$datum = date('Y-m-d H:i:s');
    			$query2="UPDATE user SET last_logon='$datum' WHERE user='$_SESSION[userName]' && password='$_SESSION[userPass]'";
    			$result2=mysql_query($query2,$db);
    			if ($result2>0)
    			{	
    				// Datum aktualisiert	
    			}
    			else
    			{
    				// Datum konnte nicht akutlisiert werden	
    			}
    		}
    		else
    		{
    			// Anmeldeinformationen nicht korrekt
    		}
    

    Erklär mir mal bitte nochmal das mit dem Passwort und dem Space und so.



  • Du überprüfst ob die ANfrage erfolgreich war und nicht ob eine Ergebnismenge geliefert wurde. Die Anfrage war ja erfolgreich deshalb liefert die mysql_query true zurück.

    if ($result>0) // Wenn Anmeldeinformationen korrekt sind
    {

    Das die Anfrage erfolgreich ist heißt aber nicht das ein Datensatz zurückgekommen ist.

    num_rows=mysql_numrows(num\_rows = mysql\_num_rows(result);

    if ($num_rows >= 1)
    {
    // USER gefunden mache was mit ihm
    }
    else
    {
    USERNAME oder PASSWORT sind nicht korrekt
    }

    http://www.php.net/manual/de/function.mysql-num-rows.php



  • Ich hab es doch jetzt so gemacht (s.o.), ist das nicht ok???

    if ( mysql_affected_Rows() > 0)    // Wenn Anmeldeinformationen korrekt sind
    


  • ich würde sogar noch unterscheiden zwischen ==1 und >1!

    Bei >1 liegt ein gravierender Fehler vor, den ich zumindest irgendwo vermerken würde (log,mail an admin). Bestünde doch Handlungsbedarf beim Anlegen der Accounts (Duplikatprüfung fehlte oder versagte)!



  • Ja ok, also habs jetzt so gemacht wie in deinem Beispiel, was ich mache wenns doppelt ist, weiß ich noch nicht, eigentlich sollte das ja nicht passieren.

    Und was meintest du mit dem Passwort?



  • mysql_affected_Rows ist falsch

    Schaue dir bitte die API an.

    mysql_affected_Rows bezieht sich nicht auf die Ergebnismenge.
    Eine Ergebnismenge gibt nicht bei INSERT,UPDATE,DELETE.
    Deshalb überprüft man die Anzahl betroffener Datensätze mit mysql_affected_Rows.

    Obn eine Ergebnismenge vorliegt bekommt man so: mysql_num_rows



  • Doppelt darf ein Datensatz sein solange USERNAME und PASSWORT unterschiedlich sind.

    Sollte aber nicht passieren weil eine USERNAME ja eindeutig ist.

    Wenn es 2 gleiche USERNAMEN gibt und beide verwenden das gleiche Passwort ist es ein Problem.
    Man übergibt ja die USERID weiter um damit was zu machen.



  • Es gibt keine doppelten User.
    Es gibt aber doppelte Passwörter.

    Ich meinte das hier:

    Das Passwort sollte auf Space gecheckt werden sonst ist ein 1 OR 1 = 0 möglich.

    Und was sagst du zur Übergabe der SessinID per URL?



  • Ändere mal deinen Code so wie ich es gesagt haben.
    Statt mysql_affected_Rows mysql_num_rows

    Dann geht es auch.

    Bezgl. SQL-Injektions guckst du bitte im INET.



  • Hab den Code jetzt so geändert:

    $num_rows = mysql_num_rows($result); 
    		if ($num_rows >= 1)	// Wenn Anmeldeinformationen korrekt sind		{	
    			// Jetzt wird man angemeldet			
    			$data=mysql_fetch_array($result);
    			$_SESSION['userPermission']=$data['permission'];	// Dem User wird die, in der DB für ihn eingetragene, Berechtigung zugewiesen
    			$logok = TRUE;	// Logon-Variable wird auf true gesetzt
    usw. ...
    

    Danke für deine Hilfe!


Anmelden zum Antworten