Usernamen ermitteln/ausgeben über ID, MySQL und Cookie.

Joe

Erfahrenes Mitglied
Hallo alle.

Ich möchte gern den Namen eines eingeloggten Users ermitteln und ihn anzeigen lassen.
Das Problem ist nur wie ermittele ich die korrekte ID des Users? Ich hatte es über ein Cookie versucht aber diese ID stimmt nicht mit der ID beim registrieren in der Datenbank überein.

Wie kann ich nun die korrekte ID ermitteln um auf den UserNamen in der Datenbank zu kommen?

In dem Skript zeigt das Vardump NULL , soll aber den Usernamen ausgeben.


Hier mal der Codeteil den ich soweit hatte:
main.php
PHP:
<? ob_start(); ?>
<?php
if (!isset($_COOKIE['UserID']) || !isset($_COOKIE['Password'])) {
header("Location: ../index.php");
}
?>
<? readfile("inc.doctype.php"); ?>



<!-- TEMPLATEENGINE
hier werden die Templates passend zur Navi geladen
-->

<?php
include 'variables.php';
include 'constants.php';


$db = @new MySQLi('***', '***', '****', ******');
$ret = 1; // speichert den rückgabewert von include, standardwert 1
if (mysqli_connect_errno()) {
	die('Konnte keine Verbindung zu Datenbank aufbauen, MySQL meldete: '.mysqli_connect_error());
} else if (is_string($error = getUserID($db))) { // String, also ein MySQL Fehler
	$ret = $error; // die Fehlermeldung in $ret speichern, damit sie angezeigt wird.
} else 

// Laden der Include-Datei
/*
 * Die Include-Datei muss eine return Anweisung enthalten mit folgenden
 * Werten:
 * - Bei normaler Ausführung
 *   Array('filename' => string, -- Dateiname vom Template
 *		 'data' => Array())	-- Array mit Daten für das Template
 * - Bei einem Fehler
 *   string  -- Die Fehlermeldung die angezeigt werden soll.
 */
if (isset($_GET['section'], $dateien[$_GET['section']])) {
	if (file_exists('includes/'.$dateien[$_GET['section']])) {
		$ret = include 'includes/'.$dateien[$_GET['section']]; 
	} else {
		$ret = "Include-Datei konnte nicht geladen werden: 'includes/".$dateien[$_GET['section']]."'";
	}
} else {
	// default bereich laden, news
	 $ret = include 'includes/'.$dateien['startseite'];
}
if (is_array($ret) and isset($ret['filename'], $ret['data']) and
		is_string($ret['filename']) and
		is_array($ret['data'])) {
	// Gültiger return-Wert
	if (file_exists($file = 'templates/'.$ret['filename'])) {
		$data = $ret['data']; 
		   // speicher die Arraydaten in eine Variable $data
	   // die dann im Template verwendet werden kann.
		include $file;
	} else {
		// Datei existiert nicht, eine Fehlermeldung anzeigen.
		$data = array();
		$data['msg'] = 'Templatedatei "'.$file.'" ist nicht vorhanden.';
		include 'templates/error.tpl';
	}
} else if (is_string($ret)) {
	// include-Datei lieferte eine String zurück, welches eine Fehlermeldung sein soll
	$data = array();
	$data['msg'] = $ret;
	include 'templates/error.tpl';
} else if (1 === $ret) {
	// return-Anweisung wurde vergessen
	$data = array();
	$data['msg'] = 'In der Include-Datei wurde die return Anweisung vergessen.';
	include 'templates/error.tpl';
} else {
	// überhaupt ein ungültiger return-Wert
	$data = array();
	$data['msg'] = 'Die Include-Datei hat einen ungültigen Wert zurückgeliefert.';
	include 'templates/error.tpl';
}
/**
 * Erzeugt ein Array für das Infomessage-Template.
 *
 * Diese Funktion erzeugt eine Array für unsere Templateengine die dann
 * die Infomessage-Template-Datei "info.tpl" läd. Der Parameter gibt
 * dabei die Nachricht an die angezeigt werden soll.
 *
 * @param msg Die Nachricht die angezeigt werden soll.
 * @return Das Array für unsere Templateengine.
 */
function showInfo($msg) {
	$ret = array();
	$ret['filename'] = 'info.tpl.php';
	$ret['data'] = array();
	$ret['data']['msg'] = $msg;
	return $ret;
}
/**
 * Liefert die Benutzer-ID zurück.
 *
 * Diese Funktion liefert die Benutzer-ID des angemeldeten Benutzers zurück.
 * Falls kein Benutzer angemeldet ist liefert diese Funktion den Wert false
 * zurück. Der Parameter gibt dabei das MySQLi-Objekt an in der nach
 * dem Login geprüft werden soll. Es werden dabei die Cookies "UserID" und
 * "Password" ausgelesen. Bei einem MySQL-Fehler wird ein String mit
 * der Fehlermeldung zurückgeliefert.
 *
 * @param db Das MySQLi-Objekt auf dem gearbeitet wird.
 * @return false wenn der Benutzer nicht eingeloggt ist, die ID des Benutzers
 *		 wenn er eingeloggt ist oder ein string wenn eine Fehlermeldung
 *		 auftrat.
 */
function getUserID($db) {
	if (!is_object($db)) {
		return false;
	}
	if (!($db instanceof MySQLi)) {
		return false;
	}
	if (!isset($_COOKIE['UserID'], $_COOKIE['Password'])) {
		return false;
	}
	$sql = 'SELECT
				ID
			FROM
				User
			WHERE
				ID = ? AND
				Password = ?';
	$stmt = $db->prepare($sql);
	if (!$stmt) {
		return $db->error;
	}
	$stmt->bind_param('is', $_COOKIE['UserID'], $_COOKIE['Password']);
	if (!$stmt->execute()) {
		return $stmt->error;
	}
	$stmt->bind_result($UserID);
	if (!$stmt->fetch()) {
		return false;
	}
	return $UserID;

		
}


///////////////// dieser Teil ist das Problem:

// <div id="User und Stats"> Im Div soll der Name des aktuellen Users stehen.
	$uid = $_COOKIE['UserID'];
	$sql = 'SELECT
	            ID,
				Username
			FROM
				User
			WHERE
				ID= "$uid"';		
	$result = $db->query($sql);
    if (!$result) {
    die ('Etwas stimmte mit dem Query nicht: '.$db->error);
    }		
	$row = $result->fetch_assoc();
	var_dump($row['Username']);	
// </div>

?>

login.php
Hier wird der Cookie gesetzt:
PHP:
<? $aktiv="login"; include("inc.header.php"); ?>
<?php
if (getUserID($db)) {
	return 'Sie sind bereits eingeloggt.';
}
$ret = array();
$ret['filename'] = 'login.tpl.php';
$ret['data'] = array();
if ('POST' == $_SERVER['REQUEST_METHOD']) {
	if (!isset($_POST['Username'], $_POST['Password'], $_POST['formaction'])) {
		return INVALID_FORM;
	}
	if (('' == $Username = trim($_POST['Username'])) OR
			('' == $Password = trim($_POST['Password']))) {
		return EMPTY_FORM;
	}
	$sql = 'SELECT
				ID
			FROM
				User
			WHERE
				Username = ?';
	$stmt = $db->prepare($sql);
	if (!$stmt) {
		return $db->error;
	}
	$stmt->bind_param('s', $Username);
	if (!$stmt->execute()) {
		return $stmt->error;
	}
	$stmt->bind_result($UserID);
	if (!$stmt->fetch()) {
		return 'Es wurde kein Benutzer mit den angegebenen Namen gefunden.';
	}
	$stmt->close();
	$sql = 'SELECT
				Password
			FROM
				User
			WHERE
				ID = ? AND
				Password = ?';
	$stmt = $db->prepare($sql);
	if (!$stmt) {
		return $db->error;
	}
	$Hash = md5(md5($UserID).$Password);
	$stmt->bind_param('is', $UserID, $Hash);
	if (!$stmt->execute()) {
		return $stmt->error;
	}
	$stmt->bind_result($Hash);
	if (!$stmt->fetch()) {
		return 'Das eingegebene Password ist ungültig.';
	}
	$stmt->close();
	setcookie('UserID', $UserID, strtotime("+1 month"));
	setcookie('Password', $Hash, strtotime("+1 month"));
	$_COOKIE['UserID'] = $UserID; // fake-cookie setzen
	$_COOKIE['Password'] = $Hash; // fake-cookie setzen
  //return showInfo('Sie sind nun eingeloggt.');
	 // hier wird die main.php geladen
	  header ("Location: Backend/main.php");
}
return $ret;
?>
 
Ok das bedeutet ich ersetze den Cookie mit Sessionstart und speichere die Session_id in die Datenbank .. als neue Zeile SessionID?

Ich bin noch recht unerfahren in PHP und SQL.
 
Wozu ein Cookie?
Das Cookie brauchst du nur, wenn die Anmeldung beim nächsten Start automatisch erfolgen soll.
Ansonsten reicht die Session des Servers
 
Also ich habs nun auf Session geändert der Teil kommt dann natürlich irgendwo ins Loginskript oder in eine session.php.

Allerdings hab ich ein Fehler (Parse error: syntax error, unexpected T_STRING) drinn und ich versteh leider nicht was ich falsch mache.

Hier der relevante Codeauszug:
PHP:
   session_start();
	    $sessid =session_id();
	INSERT INTO "User" ("session_id") VALUES ("$sessid"); // Parse error: syntax error, unexpected T_STRING
	$sql = 'SELECT
	            session_id,
				Username
			FROM
				User
			WHERE
				session_id = "$sessid"';
		$result = $db->query($sql);
    if (!$result) {
    die ('Etwas stimmte mit dem Query nicht: '.$db->error);
    }		
	$row = $result->fetch_assoc();
	var_dump($row['Username']);	// Das var_dump wird das echo "Username"
 
PHP:
INSERT INTO "User" ("session_id") VALUES ("$sessid");
Du kannst eine MySQL-Query nicht einfach so in den Quellcode rein schmeissen, was dann passiert siehst du ja.

Du musst die Query - genau wie in den darunter folgenden Zeile - der Methode $db->query() übergeben, damit sie ausgeführt wird.
 
Danke Deluxe. Das ging freilich nicht.
Bei der vermeindlich einfachen Sache hab ich festgestellt das ich wohl noch viel zu lernen hab.

Nun ich hab vorerst eine Lösung gefunden allerdings stützt diese sich noch auf den unötigen Cookie. Den ich dann noch komplett durch Sessions ersetzen werde. Das ganze kommt dann auch noh mal in andre Dateien in Login.php zb.

Vieleicht brauchts doch mancher User hier deswegen nochmal der funktionierende Code (unten):
PHP:
<? ob_start(); ?>
 <?session_start();?>
<?php
if (!isset($_COOKIE['UserID']) || !isset($_COOKIE['Password'])) {
header("Location: ../index.php");
}
?>
<? readfile("inc.doctype.php"); ?>
//<meta name="description" ....


<!-- TEMPLATEENGINE
hier werden die Templates passend zur Navi geladen
-->

<?php
include 'variables.php';
include 'constants.php';


$db = @new MySQLi('Host', 'User', 'PW', 'Datenbank');
$ret = 1; // speichert den rückgabewert von include, standardwert 1
if (mysqli_connect_errno()) {
	die('Konnte keine Verbindung zu Datenbank aufbauen, MySQL meldete: '.mysqli_connect_error());
} else if (is_string($error = getUserID($db))) { // String, also ein MySQL Fehler
	$ret = $error; // die Fehlermeldung in $ret speichern, damit sie angezeigt wird.
} else 

// Laden der Include-Datei
/*
 * Die Include-Datei muss eine return Anweisung enthalten mit folgenden
 * Werten:
 * - Bei normaler Ausführung
 *   Array('filename' => string, -- Dateiname vom Template
 *		 'data' => Array())	-- Array mit Daten für das Template
 * - Bei einem Fehler
 *   string  -- Die Fehlermeldung die angezeigt werden soll.
 */
if (isset($_GET['section'], $dateien[$_GET['section']])) {
	if (file_exists('includes/'.$dateien[$_GET['section']])) {
		$ret = include 'includes/'.$dateien[$_GET['section']]; 
	} else {
		$ret = "Include-Datei konnte nicht geladen werden: 'includes/".$dateien[$_GET['section']]."'";
	}
} else {
	// default bereich laden, news
	 $ret = include 'includes/'.$dateien['startseite'];
}
if (is_array($ret) and isset($ret['filename'], $ret['data']) and
		is_string($ret['filename']) and
		is_array($ret['data'])) {
	// Gültiger return-Wert
	if (file_exists($file = 'templates/'.$ret['filename'])) {
		$data = $ret['data']; 
		   // speicher die Arraydaten in eine Variable $data
	   // die dann im Template verwendet werden kann.
		include $file;
	} else {
		// Datei existiert nicht, eine Fehlermeldung anzeigen.
		$data = array();
		$data['msg'] = 'Templatedatei "'.$file.'" ist nicht vorhanden.';
		include 'templates/error.tpl';
	}
} else if (is_string($ret)) {
	// include-Datei lieferte eine String zurück, welches eine Fehlermeldung sein soll
	$data = array();
	$data['msg'] = $ret;
	include 'templates/error.tpl';
} else if (1 === $ret) {
	// return-Anweisung wurde vergessen
	$data = array();
	$data['msg'] = 'In der Include-Datei wurde die return Anweisung vergessen.';
	include 'templates/error.tpl';
} else {
	// überhaupt ein ungültiger return-Wert
	$data = array();
	$data['msg'] = 'Die Include-Datei hat einen ungültigen Wert zurückgeliefert.';
	include 'templates/error.tpl';
}
/**
 * Erzeugt ein Array für das Infomessage-Template.
 *
 * Diese Funktion erzeugt eine Array für unsere Templateengine die dann
 * die Infomessage-Template-Datei "info.tpl" läd. Der Parameter gibt
 * dabei die Nachricht an die angezeigt werden soll.
 *
 * @param msg Die Nachricht die angezeigt werden soll.
 * @return Das Array für unsere Templateengine.
 */
function showInfo($msg) {
	$ret = array();
	$ret['filename'] = 'info.tpl.php';
	$ret['data'] = array();
	$ret['data']['msg'] = $msg;
	return $ret;
}
/**
 * Liefert die Benutzer-ID zurück.
 *
 * Diese Funktion liefert die Benutzer-ID des angemeldeten Benutzers zurück.
 * Falls kein Benutzer angemeldet ist liefert diese Funktion den Wert false
 * zurück. Der Parameter gibt dabei das MySQLi-Objekt an in der nach
 * dem Login geprüft werden soll. Es werden dabei die Cookies "UserID" und
 * "Password" ausgelesen. Bei einem MySQL-Fehler wird ein String mit
 * der Fehlermeldung zurückgeliefert.
 *
 * @param db Das MySQLi-Objekt auf dem gearbeitet wird.
 * @return false wenn der Benutzer nicht eingeloggt ist, die ID des Benutzers
 *		 wenn er eingeloggt ist oder ein string wenn eine Fehlermeldung
 *		 auftrat.
 */
function getUserID($db) {
	if (!is_object($db)) {
		return false;
	}
	if (!($db instanceof MySQLi)) {
		return false;
	}
	if (!isset($_COOKIE['UserID'], $_COOKIE['Password'])) {
		return false;
	}
	$sql = 'SELECT
				ID
			FROM
				User
			WHERE
				ID = ? AND
				Password = ?';
	$stmt = $db->prepare($sql);
	if (!$stmt) {
		return $db->error;
	}
	$stmt->bind_param('is', $_COOKIE['UserID'], $_COOKIE['Password']);
	if (!$stmt->execute()) {
		return $stmt->error;
	}
	$stmt->bind_result($UserID);
	if (!$stmt->fetch()) {
		return false;
	}
	return $UserID;	
}


/////////////// Dieser Teil speichert die Session_id in die Datenbank
/////////////// und holt über den Cookie den passenden Namen.

$uid = $_COOKIE['UserID'];
$sql = "UPDATE
			User
		SET
			Session= ('".session_id()."')
		WHERE
			ID= $uid";
		$stmt = $db->query($sql);
if (!$stmt) {
die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
$sql = "SELECT
	        Session,
			Username
		FROM
			User
		WHERE
			Session =('".session_id()."')";
$result = $db->query($sql);
if (!$result) {
die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}		
$row = $result->fetch_assoc();
	//	VALUES ('".session_id()."')";
?>	
<div id="upper-pic">
<h2><? echo ($row['Username']);?></h2>
</div>
<div id="uppercontent">
<br class="clear" />



Ich hab keine Ahnung wie sicher so ein System überhaupt ist aber bin froh das ichs mit meinen wenigen Kenntnissen überhaupt zum laufen gebracht habe.
Ich habe ne Ewigkeit gebraucht um zu erfahren das normale Anführungszeichen ' nicht reichen, denn darin werden keine Variablen übernommen.
 
Zurück