 | |
22.03.2007, 23:11
| Nach oben
#21 | | Oliver O.
Registriert seit: 17.08.2005
Beiträge: 426
|
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).
|
| |
23.03.2007, 00:21
| Nach oben
#22 | | Martin Breuer
Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
|
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']),'') != 0 ) {
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...
|
| |
23.03.2007, 07:53
| Nach oben
#23 | | leftover when bar closes
Registriert seit: 29.06.2006 Ort: Bern
Beiträge: 123
| Zitat:
Zitat von WarrenFaith 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 |
| |
23.03.2007, 14:01
| Nach oben
#24 | | Benutzer
Registriert seit: 18.03.2007
Beiträge: 38
|
@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
|
| |
23.03.2007, 15:31
| Nach oben
#25 | | Martin Breuer
Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
| 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)
|
| |
23.03.2007, 15:43
| Nach oben
#26 | | Benutzer
Registriert seit: 18.03.2007
Beiträge: 38
|
lol ein Leerzeichen hinter dem ?>  Danke |
| |
23.03.2007, 17:24
| Nach oben
#27 | | Bastian Fenske
Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
| Zitat:
Zitat von WarrenFaith 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
|
| |
23.03.2007, 17:32
| Nach oben
#28 | | Martin Breuer
Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
| 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.
|
| |
23.03.2007, 17:45
| Nach oben
#29 | | Bastian Fenske
Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
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 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
|
| |
23.03.2007, 17:57
| Nach oben
#30 | | Benutzer
Registriert seit: 18.03.2007
Beiträge: 38
| Zitat:
Zitat von Basti 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
|
| |
23.03.2007, 18:05
| Nach oben
#31 | | Oliver O.
Registriert seit: 17.08.2005
Beiträge: 426
|
die geschweifte klammer beim If sagt nur aus, dass alles, was sich darin befindet ausgeführt wird, wenn in der runden klammer TRUE raus kommt.
Wenn man jetzt keine Geschweifte klammer geschrieben wird, dann passiert was anderes: PHP-Code: if(false){ echo "Hallo "; echo "du "; } echo " da!"; //Ausgabe: " da!"
if(false) echo "Hallo "; //Nicht ausgeführt echo "du "; //ausgeführt echo " da!"; //Ausgabe: "du da!";
D.h. nur die erste anweisung nach dem If ohne {} wird (nicht) ausgeführt
|
| |
23.03.2007, 18:10
| Nach oben
#32 | | Bastian Fenske
Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
//edit: War wohl etwas zu langsam, was die Klammern angeht...
Hi.
Die geschweiften Klammern kannst du weglassen, wenn der Block nur aus einem Befehl besteht. Zitat: |
Ps: Ich weiß meine Datei-, Variablen- und und und bennenung ist schwachsinnig *gg* aber mir fällt meistens nichts besseres ein
| Was soll "se" denn bedeuten? Und wieso wird an einen Link die Information angehängt, welches Template eingebunden werden soll? Ich arbeite in meinem CMS mit Seitentypen. Anhand der angefragten Seite wird nachgesehen, welcher Seitentyp das ist. Dann wird zwar nicht ein entsprechendes Seitentyp-Template eingebunden (vielmehr ist ein Seitenyp unter anderem durch bestimmte Komponenten definiert), aber das wäre quasi die Vorstufe.
Wenn ich also die Seite "konzept" will, dann "weiß" die Datenbank, dass es sich um eine Seite vom Typ "einfachere Artikel" handelt und würde das entsprechende Template einbinden, dass z.B. ein Bild, eine Überschrift und einen Text enthält. Die Seite "about" könnte genauso ein "einfacher Artikel" sein, könnte sich vielleicht aber später in einen "erweiterten Artikel" verändern (ein Template mit zwei Bildern), weshalb es quatsch wäre, diese Information (welches Template) in den Link mit einzubauen. Vielmehr gehört diese Info eben in die Datenbank. Zumindest, falls du halbwegs übliche Anforderungen umsetzt. Zitat: |
Zum Thema $_Request ... das hab ich immernoch nicht ganz verstanden warum request und nicht get und wo der unterschied ist
| $_REQUEST ist eine Kombination aus $_GET, $_POST und $_COOKIE. Ob das für dich taugt, hängt von den konkreten Anforderungen und Rahmenbedingungen ab.
Basti
|
| |
23.03.2007, 18:25
| Nach oben
#33 | | Benutzer
Registriert seit: 18.03.2007
Beiträge: 38
|
Anstatt "se" hätte ich auch "seite" "site" oder was anderes nehmen können aber ich ich hab "seite" einfach abgekürzt und so entstand das "se". Zum Thema warum das in der URL stehen soll, ich wollte das wenn man jetzt auf der Seite ist und sich z.B. im Bereich News befindet den Link kopieren könnte jemandem schicken und der Mensch der den Link bekommt genau auf der Seite landet wo derjenige ist der den Link verschickt hat. Eine bessere/andere Möglichkeit als diese ist mir dafür nicht eingefallen.
Aber die Benennung von Variablen ist doch im Grunde genommen sowieso egal..
|
| |
23.03.2007, 18:41
| Nach oben
#34 | | Bastian Fenske
Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
| Zitat:
Zitat von bl-25 Anstatt "se" hätte ich auch "seite" "site" oder was anderes nehmen können aber ich ich hab "seite" einfach abgekürzt und so entstand das "se". Zum Thema warum das in der URL stehen soll, ich wollte das wenn man jetzt auf der Seite ist und sich z.B. im Bereich News befindet den Link kopieren könnte jemandem schicken und der Mensch der den Link bekommt genau auf der Seite landet wo derjenige ist der den Link verschickt hat. Eine bessere/andere Möglichkeit als diese ist mir dafür nicht eingefallen. | Achso ... dann passts doch. Dann würd ich halt wirklich so ein Array schreiben, anstatt er case-Anweisung oder eben in die Datenbank damit. "Seite" heißt im Übrigen "page" auf englisch. Zitat: |
Aber die Benennung von Variablen ist doch im Grunde genommen sowieso egal..
| Absolut nicht! Schau dir in drei Wochen deinen Quellcode nochmal und. Du hast garantiert alles vergessen, was du dir so gedacht hast, als du deine Variablen se, t1, sul, qf4, e, tmp und string benannt hast. Folglich musst du weit mehr an Code einlesen um eine bestimmte Stelle zu verstehen, als eigentlich nötig wäre. Klar, bevor du nicht weitermachst, weil dir keine Bezeichnung einfällt, benenn das Dingens erstmal provisorisch. Aber dann eben auch lieber $page oder $page_id oder $sPageId als $se.
Basti
|
| |
23.03.2007, 19:03
| Nach oben
#35 | | Benutzer
Registriert seit: 18.03.2007
Beiträge: 38
|
Wie würde das dann mit einem Array funktionieren ? Mit Array's hab ich noch nicht viel gemacht |
| |
23.03.2007, 20:01
| Nach oben
#36 | | Benjamin Klaile
Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.480
| | |