Login

smyle

Erfahrenes Mitglied
Hallo an alle :D
...
Und wieder versuche ich PhP erfolglos zu programmieren :(
Ich habe aus der folgenden Seite einen Script für das login gedownloaded.

http://www.php-einfach.de/tuts_php_login_sessions_dateien.php#oben

Die eintragen.php Datei schreibt jedoch die Registrierungsdaten in einer *.txt Datei und die login.php liest diese aus der *.txt Datei aus.

Wie kann ich denn Code der login.php Datei umschreiben damit es die Daten aus der Datenbank ausliehst und immer noch das selbe bewirkt, wie das Original?
Hier der Code:
login.php

PHP:
session_start();
$username = $_POST["username"];
$passwort = $_POST["password"];
$passwort = md5($passwort);
$log=0;

$userdatei = fopen ("user.txt","r");
while (!feof($userdatei))
   {
   $zeile = fgets($userdatei,500);
   $userdata = explode("|", $zeile);

   if ($userdata[0]==$username and $passwort==trim($userdata[1]))
      {
      $_SESSION['username'] = $username;
	  echo "Login war erfolgreich. <a href=\"geheim.php\" target=\"IFRAME\">Gesch&uuml;tzer Bereich</a>";
      $log = 1;
      }
   }
fclose($userdatei);

if ($log==0)
   {
   echo "Zugriff verweigert <a href=\"login.html\">Zur&uuml;ck</a>";
   }

In der Datenbank habe ich die Felder: ID, Benutzername und Passwort.
Ich denke ich benötige nicht mehr. Oder?

Ich wäre natürlich über Glücklich und Dankbar wen mir jemand helfen könnte.
Denn ich habe 2 Tage an dieser Datei gesessen und mir sind die Ideen ausgegangen. :(
 
Zuletzt bearbeitet:
Mach nen Select auf die Datenbank mit dem du dir Benutzername und Passwort holst und vergleiche halt statt den Strings aus dem Array von der Textdatei die Ergebnisse im Result Set.
Und die Datenbankfelder brauchst du schon wenn du die Sachen auslesen willst:P
Code:
userdata = explode("|", $zeile);
Das hier ist übrigens etwas suboptimal. Ich hatte mich mal in nem Forum als clan00|d4vid angemeldet. Bei solchen Nicknames würde dein Login nicht mehr funktionieren.
 
Dieses Script kannst du für die DB nicht nutzen.
Zudem empfehle ich dir vielleicht noch einige zusätzliche Spalten, wie User_Agent, letzte Login, durch vernünftiges Login beendet und und und.
Für einfache Sachen ist es aber völlig ausreichend.

Damit es nicht zu scher wird. Also ich würde es in Etwa so machen:

Einloggen:
PHP:
<form action="login.php" method="post">  
<table border="0">  
  <tr>
    <td>Name:</td>
	<td><input type="text" name="Nickname" size="20" value=""></td>
  </tr>
  <tr>
    <td>Kennwort:</td>
    <td><input type="password" name="Kennwort" size="20" value=""></td>
  </tr>
  <tr>
    <td colspan="2" align="center"><input type="submit" value="Login">  </td>
  </tr>     
</table>
</form>


zur Login.php
PHP:
$Nickname = trim($_POST["Nickname"]);
// Eingegebene Date prüfen, ob diese in der Datenbank enthalten sind
$sql = "SELECT ".  
    "Id, Nickname, Kennwort".  
  "FROM ".  
    "benutzerdaten ".  
  "WHERE ".  
  	// mysql_escape_string um SQL-Injection zu vermeiden (ungeklärt)
    "(Nickname like '".$Nickname."') AND ".  
    "(Kennwort = '".md5(trim($_POST["Kennwort"]))."')";  
$result = mysql_query ($sql);  

if (mysql_num_rows ($result) > 0)  
{  
  // Benutzerdaten in ein Array auslesen.  
  $data = mysql_fetch_array ($result);  

#####################_____Sessionvariabeln definieren_____#######################

  // Sessionvariablen erstellen und registrieren aus den Arrayelementen
  $_SESSION["user_id"] = $data["Id"];  
}

Auf jeder Seite sollte am Anfang folgendes stehen:
PHP:
<?php  
if(!isset($_SESSION)) {
	session_start();
} 

if ((!isset ($_SESSION["user_id"])))  { 
	header ("Location: http://localhost/XXXX/index.php?session=1");  
}


So sollte alles klappen, ich hab das mal schnell aus meinem Code raus gezogen, ich hab gleich Feierabend und hoff nicht zu viel oder zu wenig weg genommen^^
 
Ich habe den Code kopiert.
Und zwar habe ich eine login.html Datei, eine login.php Datei und eine Index.php Datei.
Wenn ich nun das Programm ausführe kommt diese Fehlermeldung:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\Programme\xampp\htdocs\Homepage\login.php on line 17

Deswegen habe ich den 3.Teil des Codes noch zu Oberst in die login.php Datei eingefügt. Die Fehlermeldung ist nicht mehr gekommen, jedoch kontrolliert er nicht ob man das richtige Passwort zum angegebenen Benutzernamen gehört, er leitet beim klicken des Login Button einfach weiter.

Meine Frage:
Sollte der Code nicht kontrolliert, ob man eingelegt ist und somit zu den "geschützten" Seiten weiter leiten?

Und dann noch eine blöde Frage: wie kann ich jemand bewerten?

Übrigens, vielen Dank für die Hilfe :D
 
Zuletzt bearbeitet:
Bewerten?
Bei dem Beitrag unten links bei dem Smiley ^^

So, jetzt noch mal ganz langsam:

Deine index.php muss folgendermaßen aussehen:

PHP:
if(!isset($_SESSION)) { 
	session_start(); 
} 

<form action="login.php" method="post">  
<table border="0">  
  <tr>
    <td>Name:</td>
	<td><input type="text" name="Nickname" size="20" value=""></td>
  </tr>
  <tr>
    <td>Kennwort:</td>
    <td><input type="password" name="Kennwort" size="20" value=""></td>
  </tr>
  <tr>
    <td colspan="2" align="center"><input type="submit" value="Login">  </td>
  </tr>     
</table>
</form>

Dann geht es weiter zur login.php:

PHP:
if(!isset($_SESSION)) { 
	session_start(); 
} 
// Datenbankverbindung aufbauen  
require ("lib/dbconnect.inc.php");

$Nickname = trim($_POST["Nickname"]);
// Eingegebene Date prüfen, ob diese in der Datenbank enthalten sind
$sql = "SELECT ".  
    "Id, Nickname, Kennwort ".  
  "FROM ".  
    "benutzerdaten ".  
  "WHERE ".  
  	// mysql_escape_string um SQL-Injection zu vermeiden (ungeklärt)
    "(Nickname like '".$Nickname."') AND ".  
    "(Kennwort = '".md5(trim($_POST["Kennwort"]))."')";  
$result = mysql_query ($sql);  

if (mysql_num_rows ($result) > 0)  
{  
  // Benutzerdaten in ein Array auslesen.  
  $data = mysql_fetch_array ($result);  

#####################_____Sessionvariabeln definieren_____#######################

  // Sessionvariablen erstellen und registrieren aus den Arrayelementen
  $_SESSION["user_id"] = $data["Id"];  
  $_SESSION["user_nickname"] = $data["Nickname"];
 
#######################_____Login-Daten speichern_____###########################

// Logfile mit Informationen füllen
$host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
$domain = explode(".", $host); $domain_array = count($domain)-2;
$msg =  "Nickname: ". $_SESSION["user_nickname"] . " | "; 
$msg .= "Besuch: " . date("d.m.Y H:i") . " Uhr | ";
$msg .= "IP-Adresse: " . $_SERVER['REMOTE_ADDR'] . " | ";
$msg .= "Hostname: " . gethostbyaddr($_SERVER['REMOTE_ADDR']) . " | ";
$msg .= "User_Agend: ". $_SERVER['HTTP_USER_AGENT'] . "\n";

$Dateiname = "lib/log/logfile.txt";
$Datei = fOpen($Dateiname,"a+");
fPuts($Datei,$msg);
fClose($Datei);

###########################_____Weiterleitung_____###############################

	// Userdaten in der DB enthalten, weiterleitung zur Hauptseite
	header ("Location: WOHIN_AUCH_IMMER.php");  
}  else  {
	// Falsche Userdateneingabe, erneuter Aufruf des Formular
	header ("Location: index.php?fehler=1");  
}

Wichtig die Daten in der DB müssen mittels md5() eingetragen werden!


Natürlich gibt es viel was man schicker machen kann, ist ja auch nur ein Auszug vom Script sollte aber wunderbar funktionieren, wenn man es auch sein Script etwas anpasst.

Ich füg die 3 erforderlichen Datein einfach mal an. Wirst schon das passende finden, klar sieht es mit Klassen schöner aus. Aber damals hat mir das auch gereicht!
 

Anhänge

Zuletzt bearbeitet:
Du hasst mir sehr geholfen :D
Denn…:D
…es funktioniert bis auf die Verbindung mit der Datenbank, glaube ich.

Denn ich habe extra ein neuer Benutzer erstellt und beim anmelden, statt mich zur nächsten Seite weiter zu leiten, komme ich immer wieder auf die index.php seit, egal ob ich das Passwort richtig oder falsch angegeben habe. :(
Deswegen denke ich dass die Verbindung zur DB nicht ganz stimmt.

Hier den Code den ich angepasst habe:
login.php

PHP:
if(!isset($_SESSION)) {  
    session_start();  
}

include('inc.php');

$Nickname = trim($_POST["Nickname"]);
$pw = trim($_POST["Passwort"]);

// Eingegebene Date prüfen, ob diese in der Datenbank enthalten sind 
$sql = "SELECT ".   
    "ID, Benutzername, Passwort ".   
  "FROM ".   
    "login ".   
  "WHERE ".   
      // mysql_escape_string um SQL-Injection zu vermeiden (ungeklärt) 
    "(Benutzername like '".$Nickname."') AND ".   
    "(Passwort = '".md5($pw)."')";   


$result = mysql_query($sql);   

if (mysql_num_rows($result) > 0)   
{   
  // Benutzerdaten in ein Array auslesen.   
  $data = mysql_fetch_array($result);   

#####################_____Sessionvariabeln definieren_____####################### 

  // Sessionvariablen erstellen und registrieren aus den Arrayelementen 
  $_SESSION["user_id"] = $data["ID"];
  $_SESSION["user_nickname"] = $data["Benutzername"]; 
  
#######################_____Login-Daten speichern_____########################### 

// Logfile mit Informationen füllen 
$host = gethostbyaddr($_SERVER['REMOTE_ADDR']); 
$domain = explode(".", $host); $domain_array = count($domain)-2; 
$msg =  "Benutzername: ". $_SESSION["user_nickname"] . " | ";  
$msg .= "Besuch: " . date("d.m.Y H:i") . " Uhr | "; 
$msg .= "IP-Adresse: " . $_SERVER['REMOTE_ADDR'] . " | "; 
$msg .= "Hostname: " . gethostbyaddr($_SERVER['REMOTE_ADDR']) . " | "; 
$msg .= "User_Agend: ". $_SERVER['HTTP_USER_AGENT'] . "\n"; 

$Dateiname = "log/logfile.txt"; 
$Datei = fOpen($Dateiname,"a+"); 
fPuts($Datei,$msg); 
fClose($Datei); 

###########################_____Weiterleitung_____############################### 

    // Userdaten in der DB enthalten, weiterleitung zur Hauptseite 
    header ("Location: home.php");   
}  else  { 
    // Falsche Userdateneingabe, erneuter Aufruf des Formular 
    header ("Location: index.php");     
   
}

index.php

PHP:
if(!isset($_SESSION)) { 
    session_start(); 
}
HTML:
<form action="login.php" method="post">   
<table border="0">   
  <tr> 
    <td>Name:</td> 
    <td><input type="text" name="Nickname" size="20" value=""></td> 
  </tr> 
  <tr> 
    <td>Kennwort:</td> 
    <td><input type="password" name="Kennwort" size="20" value=""></td> 
  </tr> 
  <tr> 
    <td colspan="2" align="center"><input type="submit" value="Login">  </td> 
  </tr>      
</table> 
</form>

Und den Code meiner Datenbankverbindung:
inc.php

PHP:
$mysqlhost="localhost"; 
$mysqluser="dbbenutzer";
$mysqlpwd="passwort";
$mysqldb="dbname";

 $connection=mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die
("Verbindungsversuch fehlgeschlagen");

mysql_select_db($mysqldb, $connection) or die("Konnte die Datenbank nicht
waehlen.");

Da es nicht funktionierte habe ich eine andere Datei erstellt um zu sehen ob sich die Datenbank überhaupt verbindet und die Daten herausgelesen werden können.
Select.php

PHP:
echo "Erster Versuch <br>";
require("inc.php");
mysql_query($conn);
$sql = "SELECT * FROM `login`";
$ausgabe = mysql_query($sql) or die (mysql_error());
$erg = mysql_db_query($mysqldb,$connection);
$anzahl = mysql_num_rows($ausgabe);

echo $ausgabe;
echo "<br>";
echo mysql_error();
echo "<br>";
echo "Anzahl der Datensätze: $anzahl"; 
echo "<br>";

PHP:
echo "Zweiter Versuch";

//Inhalt der inc.php

$sql = "SELECT * FROM `login`";
$adressen_query = mysql_query($sql) or die("Anfrage nicht erfolgreich");
$anzahl = mysql_num_rows($adressen_query);

echo "Anzahl der Datensätze: $anzahl";
echo "<br>";
echo $adressen_query;
echo "<br>";
echo mysql_error();

Leider habe ich beim ausführen der Select Datei diese Meldungen bekommen:

Erster Versuch:
Resource id #4
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Resource id #3' at line 1
Anzahl der Datensätze: 2


Zweiter Versuch:
Anzahl der Datensätze: 2
Resource id #5



Beim ersten Versuch habe ich die inc.php Datei durch include und require eingebunden.
Beim zweiten Versuch habe ich den Code direkt in der Select Datei hineingeschrieben.

Da die Datensätze angezeigt werden, frage ich mich:
Was mache ich Falsch?
Denn es scheint als würde die Datenbank verbunden werden.
 
Das Problem mit der Select.php Datei konnte ich lösen. ich hatte den Code falsch verwendet.
Aber das andere Problem leider immernoch nicht :(
 
Hallo,
Ich habe den selben Code aus folgender Seite und bekomme diesen Fehler: http://www.php-resource.de/tutorials/tutorial,38,Login-mit-Hilfe-von-PHP-und-mySQL,1.htm
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:\Programme\xampp\htdocs\Ordner\Ordner\Login\function.inc.php on line 27
Auf der Zeile 27 befindet sich
PHP:
return(mysql_num_rows($result)==1);
und das ist der ganze Code
PHP:
function logged_in()
{
 $sql="SELECT `ID` FROM `benutzer` WHERE `Session`='".session_id()."' LIMIT 1";
 $result=mysql_query($sql);
 return(mysql_num_rows($result)==1);
}

Was ist mein Fehler?
Übrigens ich arbeite mit der neuen Version von Xampp Lite
 
Zurück