Switch bietet zudem dank 'default:' den Vorteil Programmlogik die in verschiedenen cases - aber nicht in allen - vorkommt zusammenzufassen, indem man bei diesen cases auf das 'break;' verzichtet. Bei einem if-elseif-Konstrukt musst du eine weitere if-Abfrage bemühen, den wiederkehrenden Code in allen entsprechenden Fällen wiederholen, oder in eine Funktion auslagern.
Kommt jetzt nicht so häufig vor, ich fand es aber das ein oder andere Mal schon durchaus praktisch.
Beiträge von SinnlosS
-
-
Dass switch da jetzt schneller ist als ein if-elseif-Konstrukt wage ich grad auch zu bezweifeln, werde ich aber bei Gelegenheit mal aus Neugier testen.
Ich finde aber eine Switch-Anweisung übersichtlicher als ein ellenlanges if-elseif-Konstrukt. Daher bevorzuge ich im Zweifelsfall immer switch.
-
Cool danke, wieder was dazu gelernt
-
Kann man mit switch() größer/kleiner-Überprüfungen machen? Das ist mir neu, wie sieht da die Notation aus?
-
Ist zwar nur eine Kleinigkeit und wirkt sich nicht auf die Funktionalität aus, aber du kannst das ganze performanter gestalten, wenn du die ganzen if-Abfragen zu einem if-elseif-Konstrukt zusammenfasst.
Dafür brauchst du nur die Reihenfolge der Abfragen umdrehen, dann werden nicht in jedem Schleifendurchlauf alle Bedingungen geprüft, sondern nur bis eine erfüllt wird. Bei jedem Diamant-Member sparst du damit drei Überprüfungen, bei jedem Platinum-Member zwei und bei jedem Gold-Member eine.PHPif($row['turnierspiele']>349) $status = "<img src=\"grafik/diamand.gif\" border=\"0\" alt=\"".$row['nick']." ist diamand Spieler, dazu kommt man ab 350 Turnierteilnahmen\">"; elseif($row['turnierspiele']>249) $status = "<img src=\"grafik/platinum.gif\" border=\"0\" alt=\"".$row['nick']." ist Platinum Spieler, dazu kommt man ab 250 Turnierteilnahmen\">"; elseif($row['turnierspiele']>149) $status = "<img src=\"grafik/gold.gif\" border=\"0\" alt=\"".$row['nick']." ist Gold Spieler, dazu kommt man ab 150 Turnierteilnahmen\">"; elseif($row['turnierspiele']>49) $status = "<img src=\"grafik/vip.gif\" border=\"0\" alt=\"".$row['nick']." ist Vip Spieler, dazu kommt man ab 50 Turnierteilnahmen\">";
Ist jetzt nichts allzu gravierendes, aber Kleinvieh macht ja bekanntlich auch Mist.
-
In x steht nur "TEST_true", was soll er da eval()'n?
Das alert('1') steht in TEST_true, nicht in x.
Für das was du willst bräuchtest du variable Variablen, ka ob es die in JavaScript gibt und wie das dann funktioniert. Bin kein JavaScript-Experte. -
z.B. werden die Strings leider nicht aneinander gehängt
Wo werden die nicht aneinander gehängt? Schau nochmal genau hin. -
-
Schöner ist das ganze wenn du sowas auf MVC-Prinzip aufbaust und nicht eine Klasse für alles hast mfg
Klar, große Projekte sind bei mir auch anders aufgebaut.
Das hier ist halt ne simple Klasse die ich mir privat mal für kleinere Projekte geschrieben habe. Da finde ich sie ausreichend und bequem zu handhaben. -
Da ich gerade etwas Zeit hatte, mal noch eine Beschreibung der Klasse. Die restlichen Methoden folgen noch.
Konstanten
In den Konstanten werden einige Einstellungen für Registrierung und Login festgelegt. Im Einzelnen sind dies:const activationExpires
Hier wird die Anzahl der Tage festgelegt, nach denen ein Aktivierungscode ungültig wird. Wird nur benötigt wenn registrierte User nicht direkt nach der Registrierung freigeschaltet werden, sondern ihre Email-Adresse durch einen Aktivierungslink der ihnen zugeschickt wird verifizieren müssen.
Kann beliebig festgelegt werden, Default-Wert ist 14.const IP_maxLoginTries
Hier wird die maximale Anzahl fehlgeschlagener Logins festgelegt, nach denen die Anmeldung von dieser IP aus für einen bestimmten Zeitraum gesperrt wird.
Kann beliebig festgelegt werden, Default-Wert ist 5.const IP_blockDuration
Hier wird die Dauer in Minuten festgelegt, für die eine IP-Adresse gesperrt wird, nachdem sie eine bestimmte Anzahl fehlgeschlagener Login-Versuche hatte (festgelegt in const IP_maxLoginTries).
Kann beliebig festgelegt werden, Default-Wert ist 15.Eigenschaften
private $db
Selbsterklärend (hoffentlich). Hier wird das Datenbank-Objekt abgelegt.private $cache
In diesem Array werden User-Daten gecached um sie bei mehrmaliger Abfrage nicht jedesmal aufs neue aus der Datenbank holen zu müssen. Weiteres siehe bei der Beschreibung der Eigenschaft $fields und den Beschreibungen der magischen Methoden __set und __get.private $fields
In diesem Array werden die Spaltennamen der User-Tabelle abgelegt, deren Werte für den aktuellen User aus der Datenbank gelesen und in der Datenbank geupdated werden dürfen. Für weiteres siehe die Beschreibungen der magischen Methoden __set und __get.
Kann beliebig um weitere Felder der eigenen User-Tabelle erweitert werden.private $id
Hier wird die ID des Users abgelegt.Magische Methoden
Für diejenigen die den Begriff magische Methoden nicht kennen: Damit werden Methoden bezeichnet, die nicht explizit aufgerufen werden, sondern automatisch beim Eintreten gewisser Umstände. Ein Beispiel ist der Konstruktor einer Klasse, die magische Methode __construct. Diese wird automatisch aufgerufen, wenn via new ein neues Objekt einer Klasse erzeugt wird. Weiterhin verwendet werden von mir __get und __set.
__get wird automatisch aufgerufen, wenn lesend auf eine Objekt-Eigenschaft zugegriffen wird, die nicht gesetzt ist.
__set wird automatisch aufgerufen, wenn schreibend auf eine Objekt-Eigenschaft zugegriffen wird, die nicht gesetzt ist.__get
PHP
Alles anzeigenpublic function __get($key) { if(!in_array($key,$this->fields)) { throw new UserException ("Das gewünschte Feld existiert nicht oder darf nicht abgefragt werden.",10); } if(!isset($this->cache[$key])) { $sql = "SELECT $key FROM user WHERE id=?"; $res = $this->db->prepare($sql); $res->bind_param("i",$this->id); $res->bind_result($value); $res->execute(); if($res->fetch()) { $res->free_result(); $this->cache[$key] = $value; } else { throw new UserException ("Das gewünschte Feld existiert nicht.",10); } } return $this->cache[$key]; }
Wird lesend auf eine Eigenschaft eines User-Objektes zugegriffen die nicht gesetzt ist, so wird überprüft ob diese Eigenschaft in den als verfügbar festgelegten Feldern des Arrays $fields enthalten ist. Wenn dem so ist wird überprüft, ob der Wert dieser Eigenschaft bereits im Array $cache abgelegt ist. Falls nicht, wird das Feld aus der Datenbank ausgelesen und im Array $cache abgelegt. Anschließend wird der entsprechende Wert zurückgegeben.
Beispiel:
name ist keine gesetzte Eigenschaft in dem User-Objekt, also wird auf die magische Methode __get zugegriffen. Diese sieht, dass "name" durch den Array fields zugelassen (=enthalten) ist, liest das entsprechende Feld aus der Datenbank, schreibt es in den Array cache und gibt den Wert zurück. Beim nächsten Zugriff auf $user->name wird in diesem Scriptdurchlauf nicht mehr die Datenbank abgefragt, sondern auf den Wert aus dem Array cache zurückgegriffen.__set
PHP
Alles anzeigenpublic function __set($key, $value) { if(!in_array($key, $this->fields)) { throw new UserException ("Das gewünschte Feld existiert nicht oder darf nicht geändert werden.",30); } $sql = "UPDATE user SET $key=? WHERE id=?"; $res = $this->db->prepare($sql); $res->bind_param("si",$value,$this->id); if(!$res->execute()) { throw new UserException ("Das gewünschte Feld konnte nicht aktualsiert werden.",20); } else { $this->cache[$key] = $value; } }
Wird schreibend auf eine Eigenschaft eines User-Objektes zugegriffen die nicht gesetzt ist (auch wenn sie nur nicht im Sichtbarkeitsbereich liegt, aufgrund von private/protected), so wird überprüft ob diese Eigenschaft in den als verfügbar festgelegten Feldern des Arrays fields enthalten ist. Wenn dem so ist wird ein Datenbank-Query ausgeführt, der das entsprechende Feld für den aktuellen User updated, und der neue Wert dann in den Array cache geschrieben (ein eventuell bereits vorhandener Eintrag für diese Eigenschaft wird überschrieben, klar).
Beispiel:
name ist keine gesetzte Eigenschaft in dem User-Objekt, also wird auf die magische Methode __get zugegriffen. Diese sieht, dass "name" durch den Array fields zugelassen (=enthalten) ist, aktualisiert das entsprechende Feld in der Datenbank und schreibt den neuen Wert in den Array cache. Der Name für unseren User wird also auf "Peter" gesetzt.Die Idee zu dieser Verwendung von __set und __get habe ich in einem Tutorial gefunden, für gut befunden, und dreist assimiliert.
Hier die Quelle:
http://professionelle-softwareentwicklung-mit-php5.de/oop.interceptors.set.html
Beispiel 2.5: Virtuelle Instanzvariablen im Einsatz -
[Edit]
Klassen-Beschreibung im 2. Post begonnenKleinen Fehler in der Methode registerUser behoben, der dazu führte, dass neue User im mit isActive=0 registriert wurden, auch wenn durch Übergabe des Parameters $requiresActivation=false festgelegt wurde, dass keine Aktivierung nötig ist.
[/Edit]Hier habe ich mal eine kleine User-Klasse mit ein paar Grundfunktionalitäten. Ist jetzt nicht besonders umfangreich, kann aber recht problemlos erweitert werden (weiter User-Felder z.B.).
Benötigt:
PHP5
MySQLi (OOP-Stil)User können sich registrieren, hierbei kann per Parameter festgelegt werden, ob eine Aktivierung erforderlich ist oder der User direkt freigeschaltet wird.
Ist eine Aktivierung erforderlich wird beim registrieren ein Aktivierungscode erstellt und zurückgegeben. Mit diesem Aktivierungscode und der id des soeben angelegten Users kann der User dann freigeschaltet werden, bzw ein Link generiert werden den man dem User per Email schickt, wie ihr das macht ist eure Sache.
Für das User-Login kann festgelegt werden, ob IP-Adressen nach einer bestimmten Anzahl fehlgeschlagener Login-Versuche in einem bestimmten Zeitraum für einen bestimmten Zeitraum gesperrt werden sollen.
Die entsprechende Anzahl und der entsprechende Zeitraum können in den Klassen-Konstanten angepasst werden.User.class.php
PHP
Alles anzeigen<?php class LoginException extends Exception {} class UserException extends Exception {} class RegisterException extends Exception {} class User { // Settings for registration and login const activationExpires = 14; // Number of days after which Activation-Code for new User expires const IP_maxLoginTries = 5; // Number of failed Login-Tries after which IP is blocked, set NULL for disabling IP-Blocking const IP_blockDuration = 15; // Number of minutes for which IP is blocked after reaching max failed login-tries // MySQLi-Object private $db; // Array for caching User-Data private $cache = array(); // Allowed fields to be retrieved and altered via magic methods __get() and __set() private $fields = array('email','name','ipAdress','isActive'); // id of current user private $id; // Constructor expects MySQLi-Object as first Parameter and user_id as (optional) second Parameter public function __construct(mysqli $db,$user_id=0) { $this->db = $db; if((int)$user_id) $this->id = (int)$user_id; } // Magic Method __get provides user-data from the user-table public function __get($key) { // first of all, check if requested field exists and is allowed, if so, it is contained in the fields-array if(!in_array($key,$this->fields)) { throw new UserException ("Das gewünschte Feld existiert nicht oder darf nicht abgefragt werden.",10); } // Check if the requested field is already cached if(!isset($this->cache[$key])) { // if not cached, try to get it from the database user-table... $sql = "SELECT $key FROM user WHERE id=?"; $res = $this->db->prepare($sql); $res->bind_param("i",$this->id); $res->bind_result($value); $res->execute(); if ($res->fetch()) { // if successfull, write it into the cache-array $res->free_result(); $this->cache[$key] = $value; } else { throw new UserException ("Das gewünschte Feld existiert nicht.",10); } } // return the requested field-value return $this->cache[$key]; } // Magic Method __set can be used to update user-fields public function __set($key, $value) { // first of all, check if requested field exists and is allowed, if so, it is contained in the fields-array if(!in_array($key, $this->fields)) { throw new UserException ("Das gewünschte Feld existiert nicht oder darf nicht geändert werden.",30); } // Try to update the user-table $sql = "UPDATE user SET $key=? WHERE id=?"; $res = $this->db->prepare($sql); $res->bind_param("si",$value,$this->id); if(!$res->execute()) { // if update wasn't successfull throw exception and return throw new UserException ("Das gewünschte Feld konnte nicht aktualsiert werden.",20); } else { // otherwise, update the cache-array $this->cache[$key] = $value; } } // Check if login-data is valid public function checkLogin($email,$pass,$ipAdress=NULL) { if(!empty($email) && !empty($pass)) { if($ipAdress===NULL || !self::IP_maxLoginTries || $this->getIpPermission($ipAdress)) { $sql = "SELECT id,password,isActive FROM user WHERE email=?"; $res = $this->db->prepare($sql); $res->bind_param("s",$email); $res->bind_result($id,$dbPass,$isActive); $res->execute(); if($res->fetch()) { $res->free_result(); if($isActive) { $salt = substr($dbPass,-23); if(md5($pass.$salt).$salt==$dbPass) { $this->setLogin($id,$ipAdress); $this->id = $id; return true; } } else { $this->setFailedLogin($ipAdress); throw new LoginException ("Ihr Zugang wurde noch nicht aktiviert.",30); } } else { $res->free_result(); $this->setFailedLogin($ipAdress); throw new LoginException ("Falsches Login oder Passwort. Bitte probieren Sie es erneut.",20); } } } else { $this->setFailedLogin($ipAdress); throw new LoginException ("Sie müssen ein Login und ein Passwort eingeben. Bitte probieren Sie es erneut.",10); } } // Check if IP was blocked due to too many failed Logins public function getIpPermission($ipAdress) { $cpr = mktime()-(60*self::IP_blockDuration); $sql = "SELECT `count`,UNIX_TIMESTAMP(`dateTime`) FROM login_failed WHERE UNIX_TIMESTAMP(`dateTime`)>? AND ipAdress=?"; $res = $this->db->prepare($sql); $res->bind_param("is",$cpr,$ipAdress); $res->bind_result($count,$timestamp); $res->execute(); if($res->fetch() && $count>=self::IP_maxLoginTries) { $res->free_result(); $timeLeft = ceil(((self::IP_blockDuration*60) - (mktime()-$timestamp))/60); throw new LoginException ("Zuviele fehlgeschlagene Logins mit Ihrer IP-Adresse ".$ipAdress.". Sie können es in ".$timeLeft." Minuten erneut probieren.",30); } $res->free_result(); return true; } // Returns the user_id as it can't be received via magic method __get as it mustn't be changed via magic method __set public function getId() { return isset($this->id) ? $this->id : false; } // Register new user public function registerUser($email,$pass,$name,$ipAdress,$requiresActivation=true) { $salt = substr(md5(uniqid(mt_rand(), true)),0,23); $pass = md5($pass.$salt).$salt; $isActive = $requiresActivation ? 1 : 0; $sql = " INSERT INTO user SET email=?,password=?,name=?,register_ipAdress=?,register_date=CURDATE(),isActive=".$isActive; $res = $this->db->prepare($sql); $res->bind_param("ssss",$email,$pass,$name,$ipAdress); if($res->execute() && $this->db->affected_rows) { $this->id = $this->db->insert_id; if(!$requiresActivation) { return $this->id; } $activationCode = md5(uniqid(mt_rand(), true)); $expireDate = date("Y-m-d",mktime()+86400*self::activationExpires); $sql = "INSERT INTO user_activation SET user_id=?,activationCode=?,expireDate=?"; $res = $this->db->prepare($sql); $res->bind_param("iss",$this->id,$activationCode,$expireDate); if($res->execute() && $this->db->affected_rows) { return $activationCode; } } return false; } public function activateUserByCode($id,$activationCode) { $sql = "SELECT activationCode,expireDate FROM user_activation WHERE user_id=?"; $res = $this->db->prepare($sql); $res->bind_param("i",$id); $res->bind_result($dbActivationCode,$expireDate); $res->execute(); if($res->fetch()) { $res->free_result(); if($dbActivationCode==$activationCode) { if(date("Y-m-d")<=$expireDate) { $sql = "UPDATE user SET isActive=1 WHERE id=?"; $res = $this->db->prepare($sql); $res->bind_param("i",$id); $res->execute(); $sql = "DELETE FROM user_activation WHERE user_id=?"; $res = $this->db->prepare($sql); $res->bind_param("i",$id); $res->execute(); return true; } else { throw new UserException ("Dein Aktivierungscode ist abgelaufen.",40); } } else { throw new UserException ("Der Aktivierungscode ist nicht korrekt.",50); } } else { throw new UserException ("Der Benutzer wurde nicht gefunden oder ist bereits aktiviert.",60); } } public function changeMyPass($id,$passOld,$passNew) { return $this->checkUserPass($id,$passOld) && $this->changeUserPass($id,$passNew) ? true : false; } public function checkUserPass($id,$pass) { $sql = "SELECT password FROM user WHERE id=?"; $res = $this->db->prepare($sql); $res->bind_param("i",$id); $res->bind_result($passDB); $res->execute(); if($res->fetch()) { $salt = substr($passDB,-23); if(md5($pass.$salt).$salt==$passDB) { return true; } } return false; } public function changeUserPass($id,$pass) { $salt = substr(md5(uniqid(mt_rand(), true)),0,23); $pass = md5($pass.$salt).$salt; $sql = "UPDATE user SET password=? WHERE id=?"; $res = $this->db->prepare($sql); $res->bind_param("si",$pass,$id); return $res->execute() && $this->db->affected_rows ? true : false; } public function deleteUser($id) { $sql = "DELETE FROM user WHERE id=?"; $res = $this->db->prepare($sql); $res->bind_param("i",$id); return $res->execute() && $this->db->affected_rows ? true : false; } private function setLogin($id,$ipAdress) { $sql = "UPDATE user SET lastLogin_date=NOW(),lastLogin_ipAdress=? WHERE id=?"; $res = $this->db->prepare($sql); $res->bind_param("si",$ipAdress,$id); $res->execute(); } private function setFailedLogin($ipAdress) { $cpr = mktime()-(60*self::IP_blockDuration); $sql = "SELECT COUNT(*) FROM login_failed WHERE UNIX_TIMESTAMP(`dateTime`)>? AND ipAdress=?"; $res = $this->db->prepare($sql); $res->bind_param("is",$cpr,$ipAdress); $res->bind_result($count); $res->execute(); if($res->fetch() && $count) { $res->free_result(); $sql = "UPDATE login_failed SET `count`=`count`+1,`dateTime`=NOW() WHERE ipAdress=?"; $res = $this->db->prepare($sql); $res->bind_param("s",$ipAdress); } else { $res->free_result(); $sql = "REPLACE INTO login_failed SET ipAdress=?,`count`=1,`dateTime`=NOW()"; $res = $this->db->prepare($sql); $res->bind_param("s",$ipAdress); } $res->execute(); $res->close(); } private function generateRandomPass($length=8,$chars="abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZäöüÄÖÜß0123456789_-.:+*#!$%/") { $password = ""; for($i=0;$i<$length;$i++) { $password.= substr($chars,(rand()%(strlen($chars))),1); } return $password; } } ?>
tables.sql
Code
Alles anzeigenCREATE TABLE IF NOT EXISTS `login_failed` ( `ipAdress` char(15) NOT NULL, `dateTime` datetime NOT NULL, `count` tinyint(4) NOT NULL, PRIMARY KEY (`ipAdress`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `email` varchar(70) NOT NULL, `password` char(55) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, `name` varchar(70) NOT NULL, `register_date` date NOT NULL, `register_ipAdress` varchar(15) NOT NULL, `lastLogin_date` datetime NOT NULL, `lastLogin_ipAdress` varchar(15) NOT NULL, `isActive` tinyint(1) NOT NULL DEFAULT '1', PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; CREATE TABLE IF NOT EXISTS `user_activation` ( `user_id` int(10) unsigned NOT NULL, `activationCode` char(32) NOT NULL, `expireDate` date NOT NULL, PRIMARY KEY (`user_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Desweiteren habe ich hier noch einen kleinen Beispielcode zur Verwendung. Man kann sich damit registrieren, der Aktivierungslink wird nicht verschickt sondern direkt ausgegeben. Man kann sich einloggen und ausloggen. Ist aber alles eher schlampig auf die schnelle runtergehackt. Zum testen reicht es aber
Die Dateien müssen so benannt werden wie hier und im gleichen Verzeichnis wie die User.class.php abgelegt werden. Natürlich müssen vorher die MySQL-Tabellen angelegt werden.
In der test.php müssen außerdem die Daten für die DB-Verbindung angepasst werden.test.php
PHP
Alles anzeigen<?php session_start(); $db = new mysqli('localhost','root','','bela'); require_once "User.class.php"; // Wurde das Login-Formular abgeschickt? Dann... if(isset($_POST['login']) && isset($_POST['email']) && isset($_POST['password'])) { // ... neues User-Objekt erstellen und... $user = new User($db); // ... Login-Daten prüfen. try { $user->checkLogin($_POST['email'],$_POST['password'],$_SERVER['REMOTE_ADDR']); // Bei korrekten Login-Daten wird die user_id in der Session gespeichert. $_SESSION['user_id'] = $user->getId(); } catch(LoginException $Exception) { // Bei fehlgeschlagenem Login wird die Fehlermeldung für die spätere Ausgabe abgefangen und gespeichert. $loginMsg = $Exception->getMessage(); } } // Wurde das Registrierungs-Formular abgeschickt? Dann... elseif(isset($_POST['register']) && isset($_POST['name']) && isset($_POST['email']) && isset($_POST['password'])) { // ... neues User-Objekt erstellen und... $user = new User($db); // ... Login-Daten prüfen. try { $activationCode = $user->registerUser($_POST['email'],$_POST['password'],$_POST['name'],$_SERVER['REMOTE_ADDR']); // Bei korrekten Login-Daten wird der Aktivierungslink ausgegeben $registerMsg = "<a href='?activate=1&uid=".$user->getId()."&code={$activationCode}'>Zugang aktivieren</a>"; } catch(RegisterException $Exception) { // Bei fehlgeschlagenem Login wird die Fehlermeldung für die spätere Ausgabe abgefangen und gespeichert. $registerMsg = $Exception->getMessage(); } } // Wurde die Aktivierungsseite aufgerufen? elseif(isset($_GET['activate']) && isset($_GET['uid']) && isset($_GET['code'])) { $user = new user($db); try { $user->activateUserByCode($_GET['uid'],$_GET['code']); $_SESSION['user_id'] = (int)$_GET['uid']; $activateMsg = "Ihr Account wurde aktiviert. Sie können sich nun einloggen.<br /><a href='test.php'>zum login</a>"; } catch(UserException $Exception) { $activateMsg = $Exception->getMessage(); } } // Logout aufgerufen? elseif(isset($_REQUEST['logout']) && isset($_SESSION['user_id'])) { // Session zerstören und... session_destroy(); // ... Seite neu laden header("Location: ./test.php"); } // Ist der User eingeloggt? if(!isset($_SESSION['user_id'])) { if(isset($_GET['register'])) { $registerMsg = isset($registerMsg) ? $registerMsg : "Bitte geben Sie Ihre Daten ein."; include "registerForm.tpl.php"; } elseif(isset($activateMsg)) { echo $activateMsg; } else { // Prüfen ob eine Fehlermeldung aus einem fehlgeschlagegen Login-Versuch gesetzt ist, // ansonsten Standard-Meldung zur Ausgabe über dem Login-Formular $loginMsg = isset($loginMsg) ? $loginMsg : "Bitte mit Passwort und Email einloggen."; // Das Login-Formular laden include "loginForm.tpl.php"; } } else { // User-Bereich nach erfolgreichem Login echo "Herzlichen Glühstrumpf. Du bist jetzt eingeloggt...<br /><a href='?logout=1'>ausloggen</a>"; } ?>
loginForm.tpl.php
PHP
Alles anzeigen<html> <head> <title>Login</title> </head> <body> <?php echo $loginMsg; ?> <br /> <form method='post' action=''> Email: <input type='text' name='email' /> Passwort: <input type='password' name='password' /> <input type='submit' name='login' value='Einloggen' /> </form> <a href='?register=1'>registrieren</a> </body> </html>
registerForm.tpl.php
PHP
Alles anzeigen<html> <head> <title>Registrieren</title> </head> <body> <?php echo $registerMsg; ?> <br /> <form method='post' action=''> Name: <input type='text' name='name' /> Email: <input type='text' name='email' /> Passwort: <input type='password' name='password' /> <input type='submit' name='register' value='Registrieren' /> </form> <a href='?'>zum login</a> </body> </html>
-
Hm ohne die Größe der Connect Klasse zu kennen könnte in dieser Klasse durchaus ein Verfahren sein welches nur einmal eine DB Connect erstellt und beim 2ten Aufruf diesen zurück gibt
Ich bin aber auch für DI oder Registry bei DB
Ah stimmt, da hast du Recht.
Ich nutze aktuell eigentlich nur noch DI. -
Nur mal so nebenbei:
Das Datenbankobjekt im Konstruktor der Klasse zu erstellen ist ganz schlecht. Wenn die Datenbankverbindung ausschließlich in dieser Klasse und nirgends sonst benötigt wird, dann ist es noch halbwegs vertretbar, wenn auch immer noch schlecht in Sachen Wiederverwendbarkeit.
Ich gehe aber mal davon aus, dass die DB-Verbindung auch von anderen Klassen benötigt wird. Generiert da jede Klasse ein eigenes DB-Objekt? Sehr unperformant.
Sinnvoller ist es, das Datenbankobjekt im Hauptprogramm zu erzeugen und den Klassen die es benötigen als Parameter an den Konstruktor zu übergeben. -
Ich habe nicht gesagt, PHP sei kaputt, das stimmt nicht.
Ausser in meinem Falle von den Segmentation Faults.Den Script habe ich leider nicht mehr, aber ich weiss, wie er aufgebaut wurde:
- Aufruf: Session Start
- Wenn Session Variable x nicht gesetzt ist, wird sie mit einer ID gefüllt
- Überprüfung auf GET Var redir
- Wenn redir nicht no ist
- Weiterleitung auf den gleichen Script aber mit GET Var redir=no mit header()
- Sonst Ausgabe von SESSION Variable x
- Wenn redir nicht no ist
Das geht aber nicht, es wird nichts angezeigt.So hat er das wahrscheinlich auch gemacht.
Und ich habe wirklich NUR das reingeschrieben, mehr nicht.
Natürlich geht das, habe grad mal eben exakt deine Beschreibung nachgebaut:PHP<?php session_start(); $_SESSION['var'] = !isset($_SESSION['var']) ? uniqid() : $_SESSION['var']; if(!isset($_GET['redir']) || $_GET['redir']!="no") { header("Location: mytest.php?redir=no"); } echo $_SESSION['var']; ?>
Was soll da jetzt nicht funktionieren? Läuft einwandfrei.
Allerdings habe ich mir grad nochmal das Eröffnungspost angeschaut. Der TE hat uns da offensichtlich eine wichtige Fehlermeldung verheimlicht. Diese ist so einleuchtend und selbsterklärend, dass er sich den Thread hier auch hätte sparen können, bzw. zumindest den Hinweis darauf hätte bringen müssen:
Damit begibst du dich in einen Endlos-Loop, die Seite ruft sich immer wieder selbst auf. Und der Browser gibt auch eine entsprechende Meldung aus.
Du kannst mit PHP nicht innerhalb einer HTML-Datei springen, weil PHP serverseitig läuft. header("Location: xxx") führt immer zu einem neuen Seitenaufruf. Und wenn das selbe Script immer wieder aufgerufen wird und der header()-Befehl nicht in einem einschränkenden if-Befehl liegt, der dafür sorgt, dass er nur beim ersten Aufruf der Seite ausgeführt wird, hat man einen klassischen Endlos-Loop. -
Nä, das hätt ich bestimmt bemerkt.
Es ging einfach nur die Session Variable nicht, wie hier schon Donkey beschrieb.So wies aussieht, weiss also keiner eine Lösung dazu.
Ich sag jetzt halt nur, falls du - Donkey - das wieder brauchen solltest, dann merk dir, geh einfach über eine redirect-PHP-Seite und dann wieder zurück ins index Script, natürlich aufpassen wegen Endlosschleifen.
Ohne Code weiß natürlich keiner wo der Fehler liegt und kann eine Lösung bieten. Aber einen Fehler habt ihr beide definitiv gemacht. PHP ist bei euch sicherlich nicht "kaputt", auch wenn viele Leute das gerne so haben wollen wenn etwas nicht klappt, da es ja keinesfalls an ihrem Code liegen kann, der selbstverständlich richtig ist...Wenn man es richtig macht funktioniert sowas völlig problemlos.
-
http://www.oooff.com/php-scripts/ba…ll-tutorial.php
Guck dir das mal an, könnte vielleicht hilfreich sein für dein Vorhaben. -
Nur mal so aus Neugier: Du nimmst für Sprachkürzel und Name der Sprache den Feldtyp Text? Sind die Felder falsch benannt und da steht was völlig anderes drin als der Bezeichner vermuten lässt, oder was spricht gegen Feldtyp Varchar?
Das Sprachkürzel wird ja nie länger als 2 ("de","en",etc.) bzw 5 ("de-DE","en-EN",etc.) Zeichen sein und der Name der Sprache sicherlich auch nicht über ~30-40 Zeichen gehen. Wozu da einen so enormen Überhang mit Feldtyp Text generieren? -
Wie sinnvoll ORDER BY RAND() ist hängt stark von der Größe der Tabelle ab. Wenn da nur ein paar Hundert zeilen drin stehen ist es kein allzu großes Ding. Je mehr Zeilen eine Tabelle hat, desto sinnvoller kann es aber sein einen alternativen Weg zu gehen.
Wenn du eine Tabelle mit 10000 Zeilen hast und darauf ein ORDER BY RAND() verwendest muss SQL erstmal 10000 random ids erstellen, was relativ kostspielig ist. Daraus muss dann die niedrigste ermittelt werden (bzw. in diesem Fall z.B. die 8 niedrigsten).
Eine Alternative wird hier gezeigt: http://www.titov.net/2005/09/21/do-…ows-from-table/Es ist natürlich immer im Einzelfall abzuwägen ob die höhere Belastung durch ORDER BY RAND() ins Gewicht schlägt, bzw. sich überhaupt bemerkbar macht. Auf den meisten kleineren Seiten dürfte das kein Problem darstellen und die bequemste Lösung sein.
-
naja genau genommen is ne ci-variante allein schon von der kollation her pfuscherei...
Für beispielsweise Passwörter, die nicht gerade in eine Form verschlüsselt/gehasht werden, die sowieso nur Zahlen und Kleinbuchstaben ausspuckt, sollte selbstverständlich eine case-sensitive Kollation gewählt werden.
Für beispielsweise Textfelder, über die Volltext-Suchen laufen sollen, würde ich die ci-Variante wählen.
Es hat beides seine Vor- und Nachteile, die sollte man sich bewußt machen und dann anhand der Anforderungen problembezogen entscheiden. Ich finde nicht, dass es da allgemeingültig ein richtig oder falsch, sauber oder unsauber gibt. -
also ich werd jetzt meinen beitrag nicht rezitieren, aber für jemanden der programmieren kann ist das problem ja wohl unterste tischkante...
die von mir gepostete und auch übliche herangehensweise kenne ich schon seit meiner zertifizierungs-vorbereitungen zum sun certified java programmer (das war 2005!!)
Naja... wenn man das Problem nur umgehen will ist dein Vorschlag ok. Meiner Meinung nach wäre es aber wesentlich sinnvoller herauszufinden wieso die Queries nicht korrekt bei der DB ankommen. Denn in phpmyadmin direkt funktionieren sie ja.
Deine Lösung ist praktikabel, wenn man zwangsweise mit (case-sensitiven) BIN-Kollationen arbeiten muss, aber nicht wenn man case-ignore-Kollationen verwendet.
Da ich aber für eine Ferndiagnose hier momentan auch mit meinem Latein am Ende bin, kannst du es ja mal so probieren @ naggison: