Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > PHP > PHP-Programmierung > Templatesytem und sessionbasierender Login
Antwort
 
Themen-Optionen
Alt 22.03.2007, 23:11   Nach oben    #21
Xean
Erfahrener Benutzer
 
Benutzerbild von Xean
 
Registriert seit: 17.08.2005
Beiträge: 423
Standard

Ich würde jetzt das ganze weiter trennen. In der Index.php alles was das Template angeht (laden, Felder ersetzen, ausgeben) und eine Login.php, die sich ums login kümmert,mit einer Funktion, die dann entrweder ein "Herzlich Willkommen" oder "Name: / Passwort:" zurückgibt
Und via $tpl->assign("login", getLoginField()); den zurückgegebenen werd in das template einsetzt. ich fang mal an, dies bisschen als code umzu setzen

EDIT:
Mhh... bei meiner idee müsste man viel a, code ändern...
Ich hab da n kleines Projekt, was auch mit dem gleichen Template System funktoniert, aber mit einem einfachen Login scrip (selbst geschrieben), was eben so aufgebaut ist, dass man es gut für sas Tpl-Sys benutzen kann.. wenn du willst, kann ichs ja mal hier rein schreiben (oder als "Sessionbasiertes Loginsystem II" bei Tutorials rein stellen.), aber villeicht haben die anderen eine bessere idee

Geändert von Xean (22.03.2007 um 23:20 Uhr).
Xean ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.03.2007, 00:21   Nach oben    #22
WarrenFaith
Mensch
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
Standard

Im moment kann ich dir sagen, dass der letzte else-Zweig mit dem header() weg muss, da sonst beim einfachen aufruf der index.php sofort ne endlosweiterleitung beginnt, da die if-Abfrage nach $_POST-Variablen beim einfachen Seitenaufruf schief geht

Einfacher geht das hier auch:
PHP-Code:
if (isset($_POST['username'], $_POST['passwort'])
    AND 
strcmp(trim($_POST['username']),'') != 0
    
AND strcmp(trim($_POST['passwort']),'') != ) { 

PHP-Code:
if (isset($_POST['username'], $_POST['passwort'])
    AND 
trim($_POST['username']) != ''
    
AND trim($_POST['passwort']) != '' ) { 
PHP ist typenunsicher und daher nicht so "umständlich" beim Stringvergleich

Hier meine index.php inklusive Logout
PHP-Code:
<?php
session_start
();
if (isset(
$_GET['logout'])) {
    
// session zerstört
    
session_destroy();
    
// redirect auf die Startseite, damit die zerstörte Session wirksam wird -> siehe Doku für Details
    
header('Location:'.$_config['domain'].'/index.php');
}

// Das Templatesystem einbinden
include("template.class.php");

// Config einbinden
include_once 'admin/config.inc.php';

// Eine neue Instanz der Template Klasse erzeugen
$tpl = new Template();

// Das Template laden
$tpl->load("index.tpl");

$login "nicht eingeloggt! :(";

/*------------ Login Anfang ------------*/
if (isset($_POST['username'], $_POST['passwort'])
    AND 
trim($_POST['username']) != ''
    
AND trim($_POST['passwort']) != '' ) {

    
// Erstellen der Verbindung zur MySQL-Datenbank
    
if (!$connection mysql_connect$_config['host'], $_config['user'], $_config['password'])) {
        die( 
'Verbindung zum Datenbankserver konnte nicht hergestellt werden.' );
    }

    if (!
mysql_select_db$_config['database'], $connection)) {
        die(
'Die Datenbank ' $_config['database'] . ' kann nicht verwendet werden.<br />MySQL-Error: <br />' mysql_error());
    }


    
// SQL-Anweisung an die Datenbank senden, um erstens herauszufinden, ob
    // diese Kombination von Usernamen und Passwort überhaupt existiert und
    // zweitens bei Existenz Userinformationen auszulesen
    
$sql "SELECT
                _id, _anzahlLogins
            FROM
                login
            WHERE
                _username = '" 
trim($_POST['username']) . "'
            AND
                _passwort = '" 
md5(trim($_POST['passwort'])) . "'";

    
$res mysql_query($sql) or die('Error[SELECT|User]: <br /><pre>' $sql '</pre><br />MySQL-Error: ' mysql_error());

    
// Nur wenn genau ein Datensatz selektiert wurde wird der User eingeloggt.
    // In allen anderen Fällen wird er zurück zum Loginformular geleitet.

    
if (mysql_num_rows($res) != 1) {
        
header('Location:'.$_config['domain'].'/index.php?se=loginfehler' );
        exit();
    } else {
        
$_SESSION['loggedIn'] = true;

        
// Die userspezifischen Daten werden ausgelesen und der Session hinzugefügt
        
$user mysql_fetch_object($res);
        
$_SESSION['anzahlLogins'] = $user->_anzahlLogins;
        
$_SESSION['id'] = $user->_id;

        
// Aktualisierung des Anzahl der Logins
        
$sql 'UPDATE
                    login
                SET
                    _anzahlLogins = _anzahlLogins + 1
                WHERE
                    _id = ' 
$user->_id;

        
mysql_query($sql) or die('Error[UPDATE|User]: <br /><pre>' $sql '</pre><br />MySQL-Error: ' mysql_error());

        
// Der Login war erfolgreich 
        
$login "eingeloggt!";
    }
}

if (isset(
$_SESSION['id'])) {
    
$login "eingeloggt!";
}

/*------------ Login Ende ------------*/

//Content-Seite zuweisen
if (isset($_REQUEST['se'])) {
    switch (
$_REQUEST['se']) {
        case 
'home'$tpl->assign("content",'{include file="home.tpl"}');
                        break;
        default: 
$tpl->assign("content",'{include file="nosite.tpl"}');
    }
} else {
    
$tpl->assign("content",'{include file="home.tpl"}');
}

// Dem Platzhalter {$titel} den Text "Willkommen" zuweisen
$tpl->assign("title""Willkommen");

// Dem Platzhalter $name den Text "Benutzer" zuweisen
$tpl->assign("name""Benutzer");

// Dem Platzhalter $time den aktuellen Timestamp zuweisen
$tpl->assign("time"time());

$tpl->assign("loginstatus"$login);


// Die Sprachdatei laden

if (isset($_REQUEST['lang'])) {
    switch (
$_REQUEST['lang']) {

        case 
'de'$langs[] = "de/lang_main.php";
                    break;

        case 
'fr'$langs[] = "fr/lang_main.php";
                    break;

        case 
'en'$langs[] = "en/lang_main.php";
                    break;

        default: 
$langs[] = "de/lang_main.php";
    }
} else {
    
$langs[] = "de/lang_main.php";
}

$lang $tpl->loadLanguage($langs);

// Und das fertige Template ausgeben
$tpl->out();
?>
und die index.tpl
Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
<head>
<title>Mein Templatesystem:: {$title}</title>
<meta http-equiv="Content-Type" content="text/xhtml; charset=ISO-8859-1" />
</head>
<body>
<h1>{L_START}</h1>
Hallo {$name}. Der Aktuelle Timestamp lautet: {$time}
{* Ein Template einbinden *}
{include file="othertemplate.tpl"}<br />
{$content}<br />

Mein Loginstatus: {$loginstatus}

<form action="/index.php" method="POST">
	Name: <input type="text" name="username" /><br />
	Password: <input type="password" name="passwort" /><br />
	<input type="submit" name="submitbutton" value="los"/>
</form>
<a href="/index.php?logout=true">Logout</a>
</body>
</html>
Ich hab, wie du vielleicht gesehen hast, noch ein wenig deinen Quelltext formatiert. Sollte etwas übersichtlicher sein.
Und so ein Anfänger biste auch nicht, immerhin kannste scheinbar das Manual schonmal lesen und selbstständig Funktionen finden und nutzen. Nur bei der Logik stolperste noch, aber das wird schon, wart ab

//edit: vergiss meine beiden PNs, dachte ich brauch noch infos von dir und das es 2 wurden lag an meiner blöden leitung...
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.03.2007, 07:53   Nach oben    #23
dsxs
leftover when bar closes
 
Benutzerbild von dsxs
 
Registriert seit: 29.06.2006
Ort: Bern
Beiträge: 123
Standard

Zitat:
Zitat von WarrenFaith Beitrag anzeigen
haha sorry, aber ich habe noch keine überladene Software gesehen die für nen Anfänger leicht war.
Ein Anfänger lernt in kleinen Schritten und es bringt ihm nix wenn er weiß dass die Methoden in der Reihenfolge aufgerufen werden muss damit am Ende "Hello World" da steht.
Er muss auch wissen was die Methoden genau machen und wie sie es machen.
Bei mir war genau das der Fall - erstmal schnell und einfach was zum Laufen bringen, später durch Anbringen von Modifikationen, rumprobieren und spezisches Lesen von Informationen, was welche Methode denn nun macht, stetig was dazu lernen.

Jeder lernt anders; gut, dass es für bl-25 so klappt.

Grüsse
__________________
Unkraut ist die Opposition der Natur gegen die Regierung der Gärtner.
ticketbörse

dsxs ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.03.2007, 14:01   Nach oben    #24
bl-25
Benutzer
 
Registriert seit: 18.03.2007
Beiträge: 38
Standard

@WarrenFaith: Danke klappt jetzt auch (fast) alles.. nur wenn ich etwas falsches angebe kommt
Code:
Warning: Cannot modify header information - headers already sent by (output started at ..../admin/config.inc.php:22) in ...../index.php on line 57
@Xean: Das würd mich mal interessieren.. schreibs doch bitte mal rein Dann kann ich mir mal angucken wie man das von der index trennt
bl-25 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.03.2007, 15:31   Nach oben    #25
WarrenFaith
Mensch
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
Standard

Zitat:
output started at ..../admin/config.inc.php:22
Du hast dort scheinbar ein Leerzeichen drin. Schau mal in Zeile 22 (wahrscheinlich am Ende der Datei), ob da ein Leerzeichen ist.
Ansonsten ist die index.php sauber (achte beim copy&paste auf leerzeichen am Anfang und am Ende. Hatte eben beim rauskopieren des Quellcodes wieder leerzeichen vor dem <?php in der ersten Zeile)
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.03.2007, 15:43   Nach oben    #26
bl-25
Benutzer
 
Registriert seit: 18.03.2007
Beiträge: 38
Standard

lol ein Leerzeichen hinter dem ?> Danke
bl-25 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.03.2007, 17:24   Nach oben    #27
Basti
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 774
Standard

Zitat:
Zitat von WarrenFaith Beitrag anzeigen
Hier meine index.php inklusive Logout
Wie Sessions korrekt zerstört werden, steht im Handbuch. Sowohl beim Starten der Session, als auch bei einem Statuswechsel (also in erster Linie beim Login) sollte unbedingt die SID gewechselt werden (mal zum Thema Session-Fixation einlesen). Vor einem Location-Header Sessions explizit mit session_write_close() schließen. Ferner muss magic_qutes.gpc natürlich immer berücksichtigt werden (und sei es nur, dass auf diesen Punkt verwiesen wird oder geprüft wird, ob die Config wie erwartet eingesetellt ist). Externe Vars dürfen niemals ungefiltert in Datenbank-Queries eingesetzt werden. Hier also mysql_real_escape_string() verwenden!

Am einfachsten für den ganzen Krempel Klassen bauen (Request, Session, Datenbank, Benutzer, Config etc.) und so Zeug da reinpacken. Damit kombinierst du einfachste Bedienung mit minimaler Wartung und maximaler Sicherheit.

Solche Konstrukte sind das Grab!:
PHP-Code:
//Content-Seite zuweisen
if (isset($_REQUEST['se'])) {
    switch (
$_REQUEST['se']) {
        case 
'home'$tpl->assign("content",'{include file="home.tpl"}');
                        break;
        default: 
$tpl->assign("content",'{include file="nosite.tpl"}');
    }
} else {
    
$tpl->assign("content",'{include file="home.tpl"}');

Gibt so ein Prinzip: DRY (don`t repeat yourself). Damit kann man schonmal gleich die doppelte Verarbeitung bei "home" rauslöschen:
PHP-Code:
$se 'home';
if (isset(
$_REQUEST['se']))
    
$se $_REQUEST['se'];

switch (
$_REQUEST['se']) {

    case 
'home':
    
$tpl->assign("content",'{include file="home.tpl"}');
    break;

    default:
    
$tpl->assign("content",'{include file="nosite.tpl"}');

Weiter:

PHP-Code:
$aSe = array(
    
'home' => 'home'
);
$sPageNotFoundTemplate '404';

$sSe key($aSe);
if (isset(
$_REQUEST['se']))
    
$sSe $_REQUEST['se'];

$sTemplate array_key_exists($se$aSe)
    ? 
$aSe[$se]
    : 
$sPageNotFoundTemplate;

$tpl->assign("content",'{include file="' $sTemplate '.tpl"}'); 
Und, falls in dem Array Schlüssel und Wert eh immer gleich sind, dann kann man das natürlich auch gleich rausschmeißen. Wichtig natürlich dann, alle entsprechenden Templates in einen Ordner zu legen oder auch nach einem bestimmten Schema zu benennen und sicherstellen, dass eben kein manipulierter Request den Rahmen sprengen kann.

Ach ja: "nosite" ist irgendwie nicht nachvollziehbar, da sich ja doch alles auf der Site abspielt. Sehr lesenswert:

http://praegnanz.de/essays/homepage_traeume

Für die Arbeit absolut hilfreich, hier klar zu sein (den Kunden aber trotzdem zu verstehen, ohne ihm vorzuhalten, dass er die Begriffe irgendwie komisch verwendet *g)

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.03.2007, 17:32   Nach oben    #28
WarrenFaith
Mensch
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
Standard

Zitat:
Am einfachsten für den ganzen Krempel Klassen bauen (Request, Session, Datenbank, Benutzer, Config etc.) und so Zeug da reinpacken. Damit kombinierst du einfachste Bedienung mit minimaler Wartung und maximaler Sicherheit.
Immer langsam mit den Pferden. bl-25 steht am Anfang seines Wissens, da wäre es vielleicht etwas zu schnell, direkt mit OOP anzufangen und von Wartung etc reden.
Das was er jetzt baut, wird er in 3 Monaten mit mehr wissen eh neu bauen.
Zitat:
Solche Konstrukte sind das Grab!:
PHP-Code:
//Content-Seite zuweisen
if (isset($_REQUEST['se'])) {
    switch (
$_REQUEST['se']) {
        case 
'home'$tpl->assign("content",'{include file="home.tpl"}');
                        break;
        default: 
$tpl->assign("content",'{include file="nosite.tpl"}');
    }
} else {
    
$tpl->assign("content",'{include file="home.tpl"}');

Und auch hier: es ist zwar nicht das super dynamischste, aber es erfüllt seinen Zweck und dient dem Anfang durchaus.
Ich will die Fähigkeiten von bl-25 nicht zu klein einschätzen, aber man kann einen Anfänger auch mit überfülle an Infos verschrecken.
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.03.2007, 17:45   Nach oben    #29
Basti
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 774
Standard

Hi.

Ich wollte damit ja auch nicht sagen, dass du im Alltag solchen Code produzierst. Dennoch sollte man Sicherheitslöcher gleich von Anfang an vermeiden oder eben zumindest darauf hinweisen, wenn ein Code voll davon ist.

Zitat:
Zitat von WarrenFaith Beitrag anzeigen
Zitat:
Am einfachsten für den ganzen Krempel Klassen bauen (Request, Session, Datenbank, Benutzer, Config etc.) und so Zeug da reinpacken. Damit kombinierst du einfachste Bedienung mit minimaler Wartung und maximaler Sicherheit.
Immer langsam mit den Pferden. bl-25 steht am Anfang seines Wissens, da wäre es vielleicht etwas zu schnell, direkt mit OOP anzufangen und von Wartung etc reden.
Das was er jetzt baut, wird er in 3 Monaten mit mehr wissen eh neu bauen.
Genauso, wie die Template-Klasse gibt es im Netz unzählige Session-, Request- und MySQL-Klassen, die sich sicherlich einfach integrieren und bedienen lassen. Und, um OOP zu erlernen ist es doch nie zu früh, oder? Was könnte einfacher sein?

Zitat:
Zitat:
Solche Konstrukte sind das Grab!:
PHP-Code:
//Content-Seite zuweisen
if (isset($_REQUEST['se'])) {
    switch (
$_REQUEST['se']) {
        case 
'home'$tpl->assign("content",'{include file="home.tpl"}');
                        break;
        default: 
$tpl->assign("content",'{include file="nosite.tpl"}');
    }
} else {
    
$tpl->assign("content",'{include file="home.tpl"}');

Und auch hier: es ist zwar nicht das super dynamischste, aber es erfüllt seinen Zweck und dient dem Anfang durchaus.
Ich will die Fähigkeiten von bl-25 nicht zu klein einschätzen, aber man kann einen Anfänger auch mit überfülle an Infos verschrecken.
Abschrecken will ich auch nicht. Eher im Gegenteil. Mir macht es tierisch Spaß, mir sowas anzuschauen und umzuschreiben, auszuklammern etc. Kann nur hoffen, dass das ansteckend wirkt.

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.03.2007, 17:57   Nach oben    #30
bl-25
Benutzer
 
Registriert seit: 18.03.2007
Beiträge: 38
Standard

Zitat:
Zitat von Basti Beitrag anzeigen
PHP-Code:
$se 'home';
if (isset(
$_REQUEST['se']))
    
$se $_REQUEST['se'];

switch (
$_REQUEST['se']) {

    case 
'home':
    
$tpl->assign("content",'{include file="home.tpl"}');
    break;

    default:
    
$tpl->assign("content",'{include file="nosite.tpl"}');

Weiter:

PHP-Code:
$aSe = array(
    
'home' => 'home'
);
$sPageNotFoundTemplate '404';

$sSe key($aSe);
if (isset(
$_REQUEST['se']))
    
$sSe $_REQUEST['se'];

$sTemplate array_key_exists($se$aSe)
    ? 
$aSe[$se]
    : 
$sPageNotFoundTemplate;

$tpl->assign("content",'{include file="' $sTemplate '.tpl"}'); 
Das hab ich jetzt nicht ganz verstanden *fg* .. besonders an der stelle
PHP-Code:
if (isset($_REQUEST['se']))
    
$se $_REQUEST['se']; 
muss das wirklich so oder fehlen da {} <<-- diese Klammern .. das bringt mich ein wenig durcheinander

Ps: Ich weiß meine Datei-, Variablen- und und und bennenung ist schwachsinnig *gg* aber mir fällt meistens nichts besseres ein

Zum Thema $_Request ... das hab ich immernoch nicht ganz verstanden warum request und nicht get und wo der unterschied ist
bl-25 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.03.2007, 18:05   Nach oben    #31
Xean
Erfahrener Benutzer