Login und Eingeloggt bleiben
gepostet vor 16 Jahre, 2 Monate von BlackScorp
Hi leute eventuell könnt ihr mir da weiterhelfen. Es geht darum dass sich mehrere user mit selben nick nicht einloggen können. ich habe das bis jetzt so gehandhabt dass ich beim login oder sonstige aktion die aktuelle SID in DB abgespeichert habe und davor immer geprüft ob die SID aus der db mit der session_id() übereinstimmen wenn nicht war der user ausgeloggt hat bis jetzt wunderbar funktioniert nun aber wenn ein user die checkbox nicht ausloggen aktiviert dann habe ich die prüfung mit der SID aus db deaktiviert also können sich bei mir meherere user mit selben account einloggen wenn sie nicht ausloggen checkbox aktivieren. wie könnte ich das problem lösen??
MFG
gepostet vor 16 Jahre, 2 Monate von Redrick
Original von BlackScorp
Es geht darum dass sich mehrere user mit selben nick nicht einloggen können.
....dann habe ich die prüfung mit der SID aus db deaktiviert
also können sich bei mir meherere user mit selben account einloggen
wie könnte ich das problem lösen??
was ist dann nun das eigentliche problem? dass sie nicht einloggen können(A) oder dass sie einloggen können(B)
dann entsteht gleich die frage, mit welchen daten du die "eingelogt bleiben"-user in dem spiel anmeldest und die frage der struktur von entprechenden tabellen sowieso.
gepostet vor 16 Jahre, 2 Monate von BlackScorp
also die user können sich mit gleichen daten einloggen aber NUR wenn die die checkbox eingeloggt bleiben aktivieren da ich ja die session aus der datenbank nicht mit der session des clients vergleiche und update. ich speichere das verschlüsselte passwort und die user id in cookies ab mit lebensdauer von einem monat ab wenn die user die checkbox aktiviert haben und logge mich quasi bei jedem aufruf der seite neu mit den daten aus den cookies ein somit habe ich die sicherheit dass der user sich nicht ausloggt wenn der sein browser schließt. wenn ich angenommen die session id des clients mit der session id aus der db vergleichen würde, wäre dann der user ausgeloggt wenn er zb von einem anderen pc sich einloggen würde und müsste sich dadurch neu einloggen obwohl er die checkbox aktiviert hat (verwirrend). also ich möchte dass sich mehrere user nicht einloggen können mit selben usernamen jedoch eingeloggt bleiben können. wie wird das normalerweise geregelt mit dem eingeloggt bleiben? eventuell habe ich da was falsch gemacht mit den cookies
MFG
gepostet vor 16 Jahre, 2 Monate von Redrick
Original von BlackScorp
wäre dann der user ausgeloggt wenn er zb von einem anderen pc sich einloggen würde und müsste sich dadurch neu einloggen obwohl er die checkbox aktiviert hat (verwirrend).
vielleicht erwartest du einfach zuviel vom browser und cookies im allgemeinen. die funktion eingelogt bleiben sollte eigentlich richtig: "auf diesem rechner eingelogt bleiben" heissen. Die cookies folgen einem nicht überall auf der welt, vielleicht nur solche von oma aus dem backoffen. Wie soll der fremde computer auf dem du zufällig dich überhaupt als einen spieler wiedererkennen.
lange rede kurzer sinn: Wenn ich dich nun endlich richtig verstanden hab, so lautet die Antwort: NEIN, NO, NET
gepostet vor 16 Jahre, 2 Monate von BlackScorp
achso habe das echt dann falsch verstanden also eingeloggt bleiben auf dem pc war das richtige stichwort, danke
MFG
gepostet vor 16 Jahre, 1 Monat von knalli
ich speichere das verschlüsselte passwort und die user id in cookies ab mit lebensdauer von einem monat ab wenn die user die checkbox aktiviert haben und logge mich quasi bei jedem aufruf der seite neu mit den daten aus den cookies ein somit habe ich die sicherheit dass der user sich nicht ausloggt wenn der sein browser schließt.
Nein, das willst du nicht. Beheben, unverzüglich. Nein, keine Widerrede, kein Überlosgehen. Dies ist keine Übung und kein Witz.
gepostet vor 16 Jahre, 1 Monat von Kampfhoernchen
Ich hab das also doch richtig verstanden.
Stimme Knalli natürlich zu.
gepostet vor 16 Jahre, 1 Monat von BlackScorp
Original von knalli
ich speichere das verschlüsselte passwort und die user id in cookies ab mit lebensdauer von einem monat ab wenn die user die checkbox aktiviert haben und logge mich quasi bei jedem aufruf der seite neu mit den daten aus den cookies ein somit habe ich die sicherheit dass der user sich nicht ausloggt wenn der sein browser schließt.
Nein, das willst du nicht. Beheben, unverzüglich. Nein, keine Widerrede, kein Überlosgehen. Dies ist keine Übung und kein Witz.
wieso speichert man denn keine pws in cookies? wie macht man das dann mit automatischen login??
gepostet vor 16 Jahre, 1 Monat von MrMaxx
Du erstellt ein beliebiges Hash, das du zu deinem User in die Datenbank speicherst und zusätzlich in einem Cookie ablegst.
Mittels dieser Information kannst du ihn einloggen. Allerdings würde ich accountbezogene Editiermöglichkeiten besonders bei diesem Mechanismus immer an die Angabe des realen Passwortes binden. Ein Loginmechanismus per Cookie stellt auch immer ein gewisses Sicherheitsrisike dar, da er relativ einfach geklaut werden kann.
So long...
Maxx
gepostet vor 16 Jahre, 1 Monat von BlackScorp
Original von MrMaxx
Du erstellt ein beliebiges Hash, das du zu deinem User in die Datenbank speicherst und zusätzlich in einem Cookie ablegst.
Mittels dieser Information kannst du ihn einloggen. Allerdings würde ich accountbezogene Editiermöglichkeiten besonders bei diesem Mechanismus immer an die Angabe des realen Passwortes binden. Ein Loginmechanismus per Cookie stellt auch immer ein gewisses Sicherheitsrisike dar, da er relativ einfach geklaut werden kann.
So long...
Maxx
was meinste mit einem beliebigen hash?? meinste die session_id??
gepostet vor 16 Jahre, 1 Monat von Redrick
Original von BlackScorp
Original von knalli
ich speichere das verschlüsselte passwort und die user id in cookies ab mit lebensdauer von einem monat ab wenn die user die checkbox aktiviert haben und logge mich quasi bei jedem aufruf der seite neu mit den daten aus den cookies ein somit habe ich die sicherheit dass der user sich nicht ausloggt wenn der sein browser schließt.Übung und kein Witz.
wieso speichert man denn keine pws in cookies? wie macht man das dann mit automatischen login??
wenn auch ich richtig verstanden habe (lol, wird noch zum kultspruch), dann weil er durch anmeldung in deinem spiel automatisch das paar pass->hash hat. Darüberhinaus - im fall eines schwachen hashes sich durch cookiemanipulation in fremde accounts zb über das rainbow reinhacken kann, da muss er nicht mal fremde cookies klauen
gepostet vor 16 Jahre, 1 Monat von BlackScorp
also bis jetzt habe ich das immer so gemacht:
benutzername und pw eingeben> sql query mit den daten > wenn daten stimmen trage session id ein > bei aufruf einer beliebigen seite hole id where sid_aus_db = session_id()> wenn false dann muss sich user neu einloggen. aber diese methode funktioniert nur für "normales" login für eingeloggt bleiben habe ich das wie gesagt mit cookies gemacht.
gepostet vor 16 Jahre, 1 Monat von Redrick
ist auch super soweit,
und das passwort legst du wie ab in der DB? vermutlich md5? (gesalzen oder nicht)?
jetzt angenommen du machst sowas wie md5, dabei entsteht eine art "verschlüsselung" und bevor experten hier aufschreien sage ich es entsteht ein Hash, und ich vermute diesen legst du in dem cookie ab zusammen mit der userID, oder?
gepostet vor 16 Jahre, 1 Monat von BlackScorp
Original von Redrick
(gesalzen oder nicht)?
gesalzen habe eine andere md5 verschlüsselung. ich nehme eine zufällig generierte zahl von 1 bis 10 hänge verschlüssele md5 wert dann so oft wie die zufällige zahl und hänge diese zahl an das md5 pw ran. danach beim login hole ich das pw des eingegebenen users nehme die erste stelle verschlüssele das eingegebene passwort so oft wie die erste stelle und prüfe ob es mit dem eingegbenen passwort übereinstimmen. so habe ich dann halt nicht das direkte md5 passwort in der db drin und die user id und das mehrfachverschlüsselte md5 passwort speichere ich dann in cookies ab
gepostet vor 16 Jahre, 1 Monat von Amun Ra
Lade dir mal zum Beispiel das phpBB2 runter und schau dir die Loginprozedur an unter:
includes/sessions.php
Da wirst du sicher fündig...
Die haben Datenbank-basierte Sessions und setzen eine SessionID und eine AutologinID.
Schaus dir mal an.
gepostet vor 16 Jahre, 1 Monat von BlackScorp
Original von Amun Ra
Lade dir mal zum Beispiel das phpBB2 runter und schau dir die Loginprozedur an unter:
includes/sessions.php
Da wirst du sicher fündig...
Die haben Datenbank-basierte Sessions und setzen eine SessionID und eine AutologinID.
Schaus dir mal an.
ahh genau über die autologinid habe ich gerade mit reddick besprochen. die wird ja generiert und in db + cookie abgespeichert und beim aufruf einer seite wird einfach nur die userid geholt vom user welcher die autlogid hat ohne dass da benutzernamen und pws miteinander vergliechen werden. nun verstehe ich es langsam (glaube ich)
danke für die infos
MFG
gepostet vor 16 Jahre, 1 Monat von knalli
Nochmal zum Mitschreiben für alle: Eine Hashfunktion verschlüsselt nicht. Niet. Nope. Nie.
Eine Hashfunktion generiert einen Hash, das ist "x-beliebiger" Wert aus der Menge der Hashfunktions-Endzustände. Mehr nicht. Es gibt bei endlich vielen Zeichen und unendlicher Länge von Eingabestrings deswegen auch unendlich viele Kollisionen, d.h. Werte mit gleichem Hash. Alleine aus diesem Grunde sollte es ja wohl logisch sein, das eine Hashfunktion eine reine Einwegfunktion ist (ohne Umkehrfunktion). Eine Rainbowtabelle ist quasi nur ein Memory, eine Art gespeichertes Dictionary.
Eine Verschlüsselung setzt voraus, das man die verschlüsselten Daten auch wieder entschlüsseln kann.
Selbst wenn man nur den Hash als Cookie speichert, dann würde man ja quasi den Passwort-Hash zur Datenbank schicken.. dann würde ja jeder sehen, wie der Hash aussieht. Wollen wir das aus Sicherheitsgründen wirklich? Punkt 1: Man kann sofort sehen, ob man einen Salt nutzt. Punkt 2: Vielleicht kann man durch Herumexperimentieren sogar den Salt herausfinden, wenn man ihn zu schwach ausgewählt hat.
Abgesehen davon, von MD5 werden wir uns in den nächsten Jahren eh langsam verabschieden müssen :|
Ergo: Als Cookie einen Login-Hash speichern, der also bei jedem neuen Login ungültig wird. Damit hat man als Webseitenbetreiber auch die völlige Kontrolle, ob der Login von User X (bzw. allen Usern) automatisch oder doch geforct werden soll.
gepostet vor 16 Jahre, 1 Monat von BlackScorp
mal ne andere frage. hat jeder browser unterschiedliche cookies?? weil wenn ich sage nicht ausloggen und dann browser schließe und neustarte dann bin ich eingeloggt, öffne ich aber ein anderen browser, dann bin ich ausgeloggt. liegt das am script oder am browser??
MFG
gepostet vor 16 Jahre, 1 Monat von DrakeL
Cookies sind immer auf den Browser beschränkt. Die teilen sich die Cookies nicht.
gepostet vor 16 Jahre, 1 Monat von BlackScorp
so meine account klasse ist nun fertig login etc funktioniert einwandfrei nun eine bitte. wäre jemand bereit dazu meine account klasse nach sicherheitslücken zu durchsuchen und eventuelle verbesserungen vorzuschlagen?? wäre sehr nett.
die account klasse könnt ihr hier anschauen:
http://cccpmik.wmw.cc/class.account.txt
und wie das login / register funktioniert könnt ihr hier testen:
http://cccpmik.wmw.cc/
MFG
gepostet vor 16 Jahre, 1 Monat von DrakeL
- Klassennamen schreibt man groß
- "htmlspecialchars()" nicht bei der Validierung machen sondern bei der Ausgabe auf der Seite
- "METHOD" ist nicht ersichtlich woher das kommt (Sprachvariablen auch nicht, aber ich denke die werden schon definiert)
- Statt bei einem Problem "checksum" hochzuzählen würde ich mit einem bool arbeiten
- Einrückung bei Selektionen beachten (nach Prüfung der "checksum" wird nicht eingerückt)
- Du machst bei der Validierung viele einzelne SQL Statements, vielleicht zusammen fassen
- Beim MD5 würde ich einen userbezogenen Salt dazunehmen (E-Mail Adresse oder Benutzername), damit eine Rainbowtable nur pro User erstellt werden kann
Dem Rest hab ich mir nicht mehr angeschaut aus Zeitmangel. :) Allgemein sieht es ziemlich speziell aus, vielleicht solltest etwas mehr OO verwenden und die Hauptfunktionalitäten von den spezifischen trennen. Aber das ist dann eher Geschmackssache.
gepostet vor 16 Jahre, 1 Monat von BlackScorp
Ok vielen dank für deine antworten
- Klassennamen schreibt man groß
werde ich sofort ändern
- "htmlspecialchars()" nicht bei der Validierung machen sondern bei der Ausgabe auf der Seite
das verwende ich doch nur wenn user seine daten ins eingabefeld eingibt
- "METHOD" ist nicht ersichtlich woher das kommt (Sprachvariablen auch nicht, aber ich denke die werden schon definiert)
jep die sind anderswo defeniert
- Statt bei einem Problem "checksum" hochzuzählen würde ich mit einem bool arbeiten
hm.. gute idee denn ich habe befürchtet das es mal trotz fehler mal zu einer erlaubten checksumme kommen könnte
- Einrückung bei Selektionen beachten (nach Prüfung der "checksum" wird nicht eingerückt)
liegt an der txt datei. im dreamveawer ist es ok eingestellt
- Du machst bei der Validierung viele einzelne SQL Statements, vielleicht zusammen fassen
wie kann ich die denn zusammenfassen?
- Beim MD5 würde ich einen userbezogenen Salt dazunehmen (E-Mail Adresse oder Benutzername), damit eine Rainbowtable nur pro User erstellt werden kann
aber so ist es doch auch ok oder zu unsicher??
gepostet vor 16 Jahre, 1 Monat von Fobby
DrakeL hat schon einiges angemerkt, ich will auch mal meinen Senf dazugeben. Als erstes möchte ich den Dienst pastebin empfehlen, so kann man es deutlich besser lesen: http://pastebin.com/m65b18d16
Dein Codestil ist furchtbar :) Ist natürlich alles Geschmackssache aber eskann nicht schaden wenn du z.B. mal bei Zend vorbeischaust (http://framework.zend.com/manual/en/coding-standard.html) und dich daran hälst - du hast nur Vorteile davon.
Einer meiner Profs meint, eine Methode sollte nicht mehr als 5 Zeilen Code beinhalten. Das mag eine sehr extreme Ansicht sein aber deine Methoden sind auf jeden Fall viel zu komplex. Auf jeden Fall würde ich dir raten, Berechnung von Darstellung/HTML zu trennen. Google mal nach MVC :)
gepostet vor 16 Jahre, 1 Monat von BlackScorp
naja html und php code wird ja getrennt hier habe ich nur ein paar li und uls einfach nur zur verschönerung. die pastebin seite finde ich echt genial(erstmal zu favoriten hinzufügen) mir ging es eingentlich nur darum dass ich diese klasse weitergeben kann und der benutzer der klasse dann in seine login.php/register.php hinschreibt
$account = new account();
if(isset($_POST["login_button"]))
$account->login();
if(isset($_POST["register_button"]))
$account->login();
if(!$account->loggedin())
//zeige login fenster
else
//zeige navigations menü
und schon hat ein komplettes login script drin. ist es denn nicht so dass oop dazu gedacht ist dass mehrere programmierer mehrere klassen schreiben können und dann in einer "schnittstelle" die anwenden? mir ging es um die einfachheit für den endbenutzer. und Zendframework hat zwar http://framework.zend.com/manual/en/coding-standard.coding-style.html hier nette beispiele jedoch ist es in realität schwierig umzusetzen und 5 zeilen pro methode?? oh man da muss ja noch viel lernen:D
MFG
gepostet vor 16 Jahre, 1 Monat von Fobby
Original von BlackScorp
naja html und php code wird ja getrennt hier habe ich nur ein paar li und uls einfach nur zur verschönerung.
Eben nicht. Eben nicht! ;)
"Verschönerung" hat bei der Berechnung nichts verloren. Keine Tags, keine
s - nur Text. Deine create-Methode z.B. sollte ein Array mit den Texten (und nur den!) zurückgeben, über die du im Template iterierst und dort dann die
s drumrumwrappst. Da fällt mir nebenher auf: ein
hat hinter einem nichts verloren, das bricht automatisch um ;) Wenn du mehr Abstand zwischen den Einträgen willst, nutze CSS (padding, margin).
Original von BlackScorp
Zendframework hat zwar http://framework.zend.com/manual/en/coding-standard.coding-style.html hier nette beispiele jedoch ist es in realität schwierig umzusetzen
Wus? Da geht es nur um die Formatierung deines Codes. Um das umzusetzen musst du nur deinen inneren Schweinehund überwinden und dich daran halten. Es wird dir nie irgendetwas erschweren - in den ersten Tagen fällt es dir vielleicht schwer, vom "ich schreib wie es gerade kommt"-Stil abzuweichen aber spätestens wenn du mal wieder über den Code drüberschauen musst, wirst du feststellen dass du dich dort wieder viel schneller einlesen kannst.
gepostet vor 16 Jahre, 1 Monat von rami95
gepostet vor 16 Jahre, 1 Monat von TheUndeadable
Ansonsten würde ich dir dringend empfehlen mal PDO anzuschauen.
Dann brauchst du diesen unsäglichen mysql_real_escape-Kram nicht mehr.
gepostet vor 16 Jahre, 1 Monat von DrakeL
Original von BlackScorp
- "htmlspecialchars()" nicht bei der Validierung machen sondern bei der Ausgabe auf der Seite
das verwende ich doch nur wenn user seine daten ins eingabefeld eingibt
Du verwendest es bei der Übernahme der eingegebenen Daten in die Attribute, also bei der Validierung. Die Funktion dient aber der Maskierung von Daten zur Anzeige auf der Webseite, hat also bei der Validierung nichts zu suchen. Die maskierten Strings speicherst du beispielsweise in der Datenbank ab.
- Du machst bei der Validierung viele einzelne SQL Statements, vielleicht zusammen fassen
wie kann ich die denn zusammenfassen?
Zum Beispiel hast du ein Select um zu prüfen ob der Benutzername existiert und einen für die E-Mail Adresse. Das könnte man in einem Rutsch machen. Zumal bei einem Login nicht interessiert warum dieser fehlgeschlagen ist. Ob der Benutzer nicht existiert oder das Kennwort falsch ist gibt einem Hacker nur unnötige Informationen.
- Beim MD5 würde ich einen userbezogenen Salt dazunehmen (E-Mail Adresse oder Benutzername), damit eine Rainbowtable nur pro User erstellt werden kann
aber so ist es doch auch ok oder zu unsicher??
Kommt darauf an was du unter unsicher verstehst. Ein Hacker benötigt in deiner Variante 9 Rainbowtables (eine pro Zufallszahl, glaube die gingen von 1-9) um von den Hashs wieder auf die Kennwörter zu schließen. Wenn du noch etwas Benutzerbezogenes dazu machst braucht er eine Rainbowtable pro Benutzer, was die Sache schon deutlich schwerer gestaltet. Des Weiteren würde ich nicht sagen, dass der mehrfache MD5 die Sicherheit erhöht. Ein geeigneter Salt wäre da mit Sicherheit besser.
Original von BlackScorp
naja html und php code wird ja getrennt hier habe ich nur ein paar li und uls einfach nur zur verschönerung. [...]
Und wenn ich deine Klassen benutzen wollen würde und die einzelnen Meldungen lieber in Blöcke und einer bestimmten CSS Klasse haben möchte? ;)
und schon hat ein komplettes login script drin. ist es denn nicht so dass oop dazu gedacht ist dass mehrere programmierer mehrere klassen schreiben können und dann in einer "schnittstelle" die anwenden? mir ging es um die einfachheit für den endbenutzer. [...]
Zend Framework hat vor allem eine recht schicke Authentifizierungsmöglichkeit. Würde ich dir empfehlen mal anzuschauen: http://framework.zend.com/manual/de/zend.auth.html
Bei mir Beschränkt sich die datenbankgestützte Authentifizierng (jetzt ohne Formular) auf die paar Zeilen:
PHP:
public static function login($emailaddress, $password)
{
$adapter = new Zend_Auth_Adapter_DbTable(Database::getAdapter(),
'accounts',
'emailaddress',
'password',
'MD5(?)');
$adapter->setIdentity($emailaddress)
->setCredential("$emailaddress | $password");
$result = Zend_Auth::getInstance()->authenticate($adapter);
if ($result->isValid()) {
return true;
}
return $result->getMessages();
}
gepostet vor 16 Jahre, 1 Monat von BlackScorp
ok wegen dem programmierstiel da werde ich mal alle variablen, konstanten,methoden,eigenschaften,klassen etc nach dem zend framework umbennen. die überprüfung ob username oder email exestieren sind für die registrierung da nicht fürs login in der classe account kann ich mich sowohl regestgrieren als auch einloggen. die html tags habe da echt nichts zu suchen werde die wegmachen. meine persönliche md5 verschlüsselung werde ich anpassen mit der zufallszahl ist es etwas unsicher. ansonsten danke für eure tipps und werde mein glück weiterversuchen
MFG
gepostet vor 16 Jahre, 1 Monat von knalli
Finde persönlich großgeschriebene Klassennamen auch besser, weil man das sonst auch überall macht.. aber ist nicht unbedingt falsch. Allerdings solltest du einen guten Grund haben, warum sie klein sind - zum Beispiel, weil dein gesamtes Framework so ist. Wenn die vorhandenen (auch selbst aufgestellte) Code Guidelines klein geschriebene Klassennamen vorschreiben, ist das legitim.
Ist solch ein Guideline noch nicht vorhanden, empfiehlt sich das Abgucken wie bei Zend oder anderen größeren Projekten. Tabs/Spaces ist auch so ein Thema, wo man sich am Anfang drauf einigen sollte. Wie auch immer, Hauptsache einigen.
Edit: Code-Übersicht
- Regel 5-Statements (!) pro Methode halte ich zwar nicht für universell, aber ein grober Überblick zeigt, bei dir kann man tatsächlich schnell aufräumen ;) Der untere Teil ist diesbzgl. wesentlich besser als der obere.
- Man könnte checksum++ ggf. auch durch einen entsprechenden Modifier wrappen.
- Man könnte die Memberzugriffe (inbesondere die, die auch öffentlich accessable sind) durch entsprechende Getter und Setter ersetzen.
- deine generate_code... ein md5 mit den aktuellen Millisekunden würd's auch tun, evtl. gibt es sogar eine ID-Funktion in PHP *kopfkratz*
- Anstatt mit irgendwelchen Integers zu hampeln (checksum), lieber auch dafür Konstanten (sprich private static member) einführen. An anderer Stelle hast du das ja gemacht.
- Inkonsistenz: Was passiert, wenn man login und create hintereinander ausführt? Die Daten(flüsse) sind nicht gesichert, initialisiert oder freigegeben (bswp. checksum).
- Konfiguration: Daten wie Name des Cookies, Lifetime u.ä. würde ich ebenfalls in private statics der Klasse speichern. Lässt sich so a) wesentlich einfacher nachträglich ändern und b) zu Testzwecken durch einen Testtreiber sogar dynamisch verändern.
gepostet vor 16 Jahre, 1 Monat von BlackScorp
so habe mich an eure tipps gehalten und an den code style von Zend meine methoden komprimiert html entfernt. bis jetzt habe ich nur regestration
http://pastebin.com/m72e23260
meine frage wäre jetzt. ich sollte doch den html code rausnehmen aber wie kann ich jetzt meine meldungen als array ausgeben? damit ich später zb machen kann
$account = new Account();
$html_code = '
'.$account->showMessage().'
';
echo $html_code;
dass die meldungen, die als retrun erhalten ausgeben werden und ich die einfach formatieren kann wie ich lustig bin?
gepostet vor 16 Jahre, 1 Monat von DrakeL
- Statt "startInit()" solltest den Konstruktor benutzen oder die Attribute bei der Deklaration belegen
- "$this->msg" initialisierst du mit NULL, danach machst nen .= bei "addMessage()", das dürfte dir eine Notice Meldung ausgeben wenn angeschaltet hast (dringend empfohlen)
- Statt "$this->msg .= array($msg);" (was macht dieses komische konstrukt? ^^) würde ich eher "$this->msg[] = $msg;" machen, falls du die Meldungen als Array sammeln willst
- Wenn du statt mysql lieber mysqli oder pdo nimmst und prepared statement sparst du dir die maskiererei
- Bei "generateCode()" tust du "$this->method" mit 0 vergleichen, wofür steht das? Wenn das irgendeine Methode sein soll wie etwas gemacht wird, dann verwende Konstanten mit geeigneten Namen, ebenso weiter unten in deinem "switch(METHOD)"
- Beim MD5 würde ich die E-Mail Adresse + einen Salt nehmen. Und nicht mehrfach MD5 nutzen sondern Passwort, E-Mail Adresse und Salt aneinander hängen und einmal MD5 außen rum. Mehrmals MD5 dürfte sich schlecht auf die Kollisionswahrscheinlichkeit auswirken (nur eine Vermutung)
- Statt Abkürzungen wie "$pw" und "$msg" würde ich die langschreibweise nehmen. Abkürzungen sollte man weitestgehend vermeiden (steht auch glaub im Coding Standard von Zend)
Die Frage der Formatierung der Ausgabe ist ganz einfach, statt "showMessage()" würde ich die Methode "getMessages()" nennen. Diese liefert dir ein Array mit den Meldungen zurück durch die iterieren kannst:
PHP:
print '
';
foreach($account->getMessages() as $message) {
print "- $message
";
}
print '
';
gepostet vor 16 Jahre, 1 Monat von BlackScorp
ok werde das mal so umsetzen nur wegen startInit() ich brauche diese methode denn was wenn ich nach dem createAccount gleich userLogin methode(die ich noch einbaue) verwenden will. muss ich die daten ja wieder auf 0 wert setzen.denn der construct wird ja nur beim instanzieren der klasse aufgerufen.dsa mit dem array war nur ein kleiner "test" vergessen rauszunehmen. wegen dem salt, ich habe bei wiki gelesen dass man dort einfach irgend ein "schlüssel" nehmen kann also zb:
$salt ='/V00|3';
könnte ich das auch machen oder wäre das zu unsicher??(wobei ich ehrlich gesagt md5 schon als sicher genug finde.
und wegen der METHOD das ist einfach nur admin settings um einzustellen ob ein user sich einloggen kann ohne sein passwort aktivieren muss oder sich per email aktivieren muss oder ihn erst admin freischalten kann.
ansonsten danke für eure zahlreichen tipps bin froh hier registriert zu sein
MFG
gepostet vor 16 Jahre, 1 Monat von DrakeL
Original von BlackScorp
ok werde das mal so umsetzen nur wegen startInit() ich brauche diese methode denn was wenn ich nach dem createAccount gleich userLogin methode(die ich noch einbaue) verwenden will. muss ich die daten ja wieder auf 0 wert setzen.denn der construct wird ja nur beim instanzieren der klasse
Ich würde die Methode aber nur "init()" nennen oder "reset()", etwas mit "start" klingt danach als gäbe es auch ein "stop". ;)
Und was passiert wenn jemand die Klasse instanziert ohne die Methode aufzurufen? Dann sind alle Variablen NULL. Rufe die Methode einfach im Konstruktor auf, dann hast damit kein Problem.
aufgerufen.dsa mit dem array war nur ein kleiner "test" vergessen rauszunehmen. wegen dem salt, ich habe bei wiki gelesen dass man dort einfach irgend ein "schlüssel" nehmen kann also zb:
$salt ='/V00|3';
könnte ich das auch machen oder wäre das zu unsicher??(wobei ich ehrlich gesagt md5 schon als sicher genug finde.
MD5 ohne Salt ist recht unsicher, weil es fertige Tabellen gibt die dir das Kennwort für den jeweiligen Hash geben. Die Tabellen zu erstellen ist aber recht aufwendig, weswegen diese nur bis X Zeichen nutzbar sind.
Der Salt soll einfach nur die Länge soweit erhöhen, dass diese Tabellen nutzlos werden. Solang der Salt dann auch noch unbekannt ist (Hacker bekommt nur Zugang zur Datenbank, nicht zum Source), weiß man nicht was das Kennwort ist und was der Salt.
Etwas Userbezogenes wie die E-Mail Adresse erhöht ebenfalls die Länge und im schlimmsten Falle braucht der Hacker für jeden Benutzer eine neue Tabelle, was dann sehr aufwendig wird.
Also wäre logisch betrachtet ein relativ langer Salt am besten.
und wegen der METHOD das ist einfach nur admin settings um einzustellen ob ein user sich einloggen kann ohne sein passwort aktivieren muss oder sich per email aktivieren muss oder ihn erst admin freischalten kann.
Dann definier dafür doch Konstanten (zum Beispiel const ACTIVE_AFTER_REGISTER = 0; const ACTIVE_WITH_EMAIL = 1; const ACTIVE_WITH_ADMINISTRATOR = 2). Auf diese Weise sieht man bei deinem switch sofort was wofür steht. Solche magischen Zahlen sollte man wenn möglich immer vermeiden.
ansonsten danke für eure zahlreichen tipps bin froh hier registriert zu sein
Wenn man helfen kann hilft man doch gerne. :)
gepostet vor 16 Jahre, 1 Monat von knalli
Steht in den Zend-Guide-Lines tatsächlich, man soll drauf und drüber Konstanten in seinen Klassencodes nutzen.. Respekt.
Bezgl. der startInit(): Besser ist ein reset() oder initialize(), wenn in den einzig relevanten public Methoden diese zuerst aufgerufen wird, reicht das doch (und davon gibt es nur eine, wenn ich das richtig sehe). Wenn man das in den Konstruktor zieht, dann muss a) reset/initialize public werden oder b) in jeder neuen relevanten public-Methode hinzugefügt werden, was unweigerlich zu einer mehrfachen Ausführung führen kann. Lässt sich verwaltungstechnisch dann nur mit einer Hilfsspeichervariable in Form eines Objektsattributs lösen.. uff :|
gepostet vor 16 Jahre, 1 Monat von Redrick
@blackscorp: jetzt schmeiss die ganzen sql statements raus und binde eine db class ein (kannst eh global für dein spiel gebrauchen, wird dir auch die umstellung des spiels vereinfachen wenn später zb nicht mehr mysql sondern pgsql nutzen willst) und schon glänzt das teil
gepostet vor 16 Jahre, 1 Monat von DrakeL
Wenn man die Flexibilität braucht bzw. ohne Einschränkungen erreichen kann... ;)
gepostet vor 16 Jahre, 1 Monat von BlackScorp
Original von Redrick
@blackscorp: jetzt schmeiss die ganzen sql statements raus und binde eine db class ein (kannst eh global für dein spiel gebrauchen, wird dir auch die umstellung des spiels vereinfachen wenn später zb nicht mehr mysql sondern pgsql nutzen willst) und schon glänzt das teil
das habe ich mir auch schon gedacht also ich habe eine db klasse aber zur zeit macht die nur auf ein server und db connectenten. es ist halt etwas schwieriger eine sql query zu realisieren der ich einfach so ein sql übergeben kann und er mir ein sicheres array mit daten zurückliefert. aber vllt gibts paar tipps?;)
gepostet vor 16 Jahre, 1 Monat von DrakeL
PDO nutzen... Und damit nicht alles von hand maskieren musst kannst Prepared Statements nutzen. Ich würde dir aber eher zu einem Framework raten wie Zend Framework, gerade die DB Sachen sind dort recht mächtig. Oder warum machst du deine Authentifizierung usw. selbst? Gibt es einen Grund warum du nicht die Hilfe von fertigen Frameworks in Anspruch nimmst?
gepostet vor 16 Jahre, 1 Monat von knalli
Womit wir von einer Klasse bei einem Framework angelangt wären. Wow, gerade mal knappe 2 Seiten.
gepostet vor 16 Jahre, 1 Monat von BlackScorp
Original von DrakeL
Gibt es einen Grund warum du nicht die Hilfe von fertigen Frameworks in Anspruch nimmst?
möchte es selber versuchen und möchte quasi mein eigenes framework schreiben
gepostet vor 16 Jahre, 1 Monat von DrakeL
Hab ich fast zwei Jahre lang gemacht und am Ende die Erkenntnis gelangt dass ich alles kann was Zend Framework auch kann (und ich brauche), aber längst nicht so flexible und augetestet war. ;)
Als Übung zum lernen würde ich sagen eine gute Idee. Wenn damit ein Projekt machen willst wrde ich eher erstmal die vorhandenen Frameworks anschauen und nur etwas eigenes entwickeln, wenn die die Anforderungen nicht erfüllen bzw. nicht durch kleine Anpassung erfüllen können.
gepostet vor 16 Jahre, 1 Monat von Redrick
Original von BlackScorp
es ist halt etwas schwieriger eine sql query zu realisieren der ich einfach so ein sql übergeben kann und er mir ein sicheres array mit daten zurückliefert. aber vllt gibts paar tipps?;)
ausgerechnet mit dem array ist es nicht schwierig und wie sollte ein array denn unsicher werden/sein. Die problematik an "anfang" ist halt die umstellung im kopf. Es gibt unterschiedliche lösungen, manche wurden vorgeschlagen, ich mache bewusst keine weiteren vorschläge, weil du scheinbar lieber eigene klassen schreiben mags, was auch vollkommen legitim ist und höheren lerneffekt gerade am anfang hat. Für mich persönlich war es eine bereicherung.
Ein beispiel(!) nebenbei zum dateninsert : du übergibts einfach einen tabellennamen und ein assoziatives array an die DB-Class-function. In dem Array legst du stumpf die Zuordnung von Tabellenfeld => Wert fest und lässt dann auch gleich die Werte beim Zusammenbau der Query escapen. In deiner Login-Klasse hättest dann nur noch sowas drinstehen:
$insertData = array (
'username' => $this->user,
'email' => $this->email,
.......
.......
);
$db->insertArray('user', $insertData);
fehlt nur noch die Definition der insertArray() in der DB-Klasse, viel freude dabei!
gepostet vor 16 Jahre, 1 Monat von BlackScorp
@DrakeL
ja kann schon sein aber da ein browsergame nichts anderes ist als
- hole daten aus der datenbank
- bearbeite die daten
- formatiere ausgabe
- gebe ausgabe
- aktualisiere datenbank
denke ich nicht dass ich ein framework brauche um sowas zu realisieren. habe mir mal pdo angeschaut für mich sieht es einfach nur aus als ob ich mir das eintippen dadurch verkürze aber im grunde kann ich genauso gut alles per hand escapen meiner meinung nach ist es nur die frage der faulheit. ist man zu faul jedesmal zu escapen so nimmt man PDO.aber bin ja noch ein neuling auf dem gebiet und lasse mich gern des besseren belehren
MFG
gepostet vor 16 Jahre, 1 Monat von BlackScorp
Original von Redrick
Original von BlackScorp
es ist halt etwas schwieriger eine sql query zu realisieren der ich einfach so ein sql übergeben kann und er mir ein sicheres array mit daten zurückliefert. aber vllt gibts paar tipps?;)
ausgerechnet mit dem array ist es nicht schwierig und wie sollte ein array denn unsicher werden/sein. Die problematik an "anfang" ist halt die umstellung im kopf. Es gibt unterschiedliche lösungen, manche wurden vorgeschlagen, ich mache bewusst keine weiteren vorschläge, weil du scheinbar lieber eigene klassen schreiben mags, was auch vollkommen legitim ist und höheren lerneffekt gerade am anfang hat. Für mich persönlich war es eine bereicherung.
Ein beispiel(!) nebenbei zum dateninsert : du übergibts einfach einen tabellennamen und ein assoziatives array an die DB-Class-function. In dem Array legst du stumpf die Zuordnung von Tabellenfeld => Wert fest und lässt dann auch gleich die Werte beim Zusammenbau der Query escapen. In deiner Login-Klasse hättest dann nur noch sowas drinstehen:
$insertData = array (
'username' => $this->user,
'email' => $this->email,
.......
.......
);
$db->insertArray('user', $insertData);
fehlt nur noch die Definition der insertArray() in der DB-Klasse, viel freude dabei!
nett das problem ist meiner meinung nach die daten zurück zu bekommen. früher habe ich das ja immer so gemacht:
$sql = mysql_query("SELECT * FROM blubb");
while($result = mysql_fetch_array($sql))
$user_id = $result["id"];
//usw...
das bereitet mir zz kopfschmerzen wie ich es schaffen soll wenn mehrere spalten durch die query wiedergegeben werden und dann noch in einer methode ich ein vernünftiges return wieder kriege.
EDIT: eigentlich müsste ich für jede query eine eigene methode schreiben oder wie habe ich das verstanden`? also insertArray , selectArray, updateArray,deleteArray
gepostet vor 16 Jahre, 1 Monat von DrakeL
Original von BlackScorp
ja kann schon sein aber da ein browsergame nichts anderes ist als [...]
Na dann viel Spass bei der Entwicklung. ;) Glaube mir, da steckt viel mehr Arbeit dahinter als man am Anfang denkt. Es kommt aber stark darauf an auf welcher Ebene man es entwickelt. (Grob gesagt) paar HTML Dateien mit PHP reingemischt dauert nicht lang. Aber wenn zum Beispiel nach dem MVC Pattern arbeiten willst, vielleicht noch unabhängig sein willst, Klassen für Formulare und Validierung um über die komplette Anwendung konsistente Formularverarbeitung zu haben wirds schon komplexer.
All diese Sachen nimmt dir ein Framework ab und man kann sich voll und ganz auf die Anwendung konzentrieren statt um die nötigen Hilfsmittel zur Verwaltung.
denke ich nicht dass ich ein framework brauche um sowas zu realisieren. habe mir mal pdo angeschaut für mich sieht es einfach nur aus als ob ich mir das eintippen dadurch verkürze aber im grunde kann ich genauso gut alles per hand escapen meiner meinung nach ist es nur die frage der faulheit. ist man zu faul jedesmal zu escapen so nimmt man PDO.aber bin ja noch ein neuling auf dem gebiet und lasse mich gern des besseren belehren
100 mal das Tippen für die Maskierung einsparen = 100 weniger Fälle in denen man es vergessen kann. 1 Fall in dem man es vergisst bedeutet im schlimmsten Fall schwere Sicherheitslücken. Und gerade beim Thema Sicherheit würde ich nicht darauf vertrauen dass man an jeder Stelle daran denkt die Werte zu maskieren sondern man sorgt lieber dafür dass es nicht passieren kann.
PDO hat darüber hinaus noch den Vorteil dass die Datenbankverbindung unabhängig von der verwendeten Datenbank ist. Ob du nun MySQL nimmst oder PostreSQL ist bei PDO nur eine Frage einer simplen Einstellung. Wenn du mysql (besser mysqli) Funktionen nimmst kannst die komplette Anwendung umstellen. Zend Framework bietet darüber hinaus zum Beispiel noch Klassen für SQL Statements, sodass diese unabhängig von der verwendeten Datenbank sind (für mich das größte Problem bei PDO alleine) bzw. man in normalen Fällen gar kein SQL mehr benötigt (Stichwort ORM).
Beispiel anhand meiner Registrierungsfunktion (Das ist der Quellcode den brauchst für den ORM im einfachsten Fall, Tabellenklasse definieren und danach kannst damit einfach Datensätze selektieren, verändern, einfügen und löschen ohne dabei SQL Statements zu schreiben):
PHP:
class Account_AccountModel extends Zend_Db_Table_Abstract
{
protected $_name = 'accounts';
protected $_primary = 'accountid';
public static function register($emailaddress, $password)
{
$account = new Account_AccountModel();
$account->insert(array(
'emailaddress' => $emailaddress,
'password' => md5("$emailaddress | $password")
));
}
}
PS: Gerade deinen zweiten Post gelesen. Auch wenn man es nicht einsetzen sollte, gerade wenn man ein eigenes Framework entwickelt seit dir dringend empfohlen einfach mal zu schauen, wie es die Frameworks gelöst haben:
http://framework.zend.com/manual/de/zend.db.html
Und dabei vor allem folgende Kapitel daraus:
gepostet vor 16 Jahre, 1 Monat von Redrick
Original von BlackScorp
while($result = mysql_fetch_array($sql))
$user_id = $result["id"];
//usw...
das bereitet mir zz kopfschmerzen wie ich es schaffen soll wenn mehrere spalten durch die query wiedergegeben werden und dann noch in einer methode ich ein vernünftiges return wieder kriege.
Na einfach indem du in ein array zusammenbaust, und zurückgibst
function getData($sql) { // bzw. getData($select, $table, $where, $group, $sort, $limit)
$sql = mysql_query("SELECT * FROM blubb");
$result = .....
$rows = mysql_num_rows($result);
if($rows==0) return NULL;
$data = array();
while($next = mysql_fetch_array($result))
$data[] = $next;
return $data;
$data = $db->getData($sql);
foreach($data as $k=>$dataset) {
.....
oder meisnt du was anderes?
gepostet vor 16 Jahre, 1 Monat von BlackScorp
Original von DrakeL
Original von BlackScorp
ja kann schon sein aber da ein browsergame nichts anderes ist als [...]
Na dann viel Spass bei der Entwicklung. ;) Glaube mir, da steckt viel mehr Arbeit dahinter als man am Anfang denkt. Es kommt aber stark darauf an auf welcher Ebene man es entwickelt. (Grob gesagt) paar HTML Dateien mit PHP reingemischt dauert nicht lang. Aber wenn zum Beispiel nach dem MVC Pattern arbeiten willst, vielleicht noch unabhängig sein willst, Klassen für Formulare und Validierung um über die komplette Anwendung konsistente Formularverarbeitung zu haben wirds schon komplexer.
All diese Sachen nimmt dir ein Framework ab und man kann sich voll und ganz auf die Anwendung konzentrieren statt um die nötigen Hilfsmittel zur Verwaltung.
Naja ich hatte bis jetzt ein kleines script geschrieben wo ich einfach nur gebaude auf bestimmten positionen bauen konnte und damit rohstoffe errechnet wurden. habe das sogar ohne oop gemacht und hat alles wunderbar funktioniert.gut manches war bestimmt etwas umständlich aber am ende hat es das gemacht was ich wollte. ich möchte ja kein high end browsergame programmieren. für mich reicht es schon wenn ich mich einloggen kann server auswählen. stadt gründen in der stadt bauen forschen einheiten ausbilden die einheiten über eine karte zu jagen und andere städte angreifen. das wars also 0815 browsergame nur zum üben vorerst und dann zusehen dass ich das erweitere
PDO hat darüber hinaus noch den Vorteil dass die Datenbankverbindung unabhängig von der verwendeten Datenbank ist. Ob du nun MySQL nimmst oder PostreSQL ist bei PDO nur eine Frage einer simplen Einstellung. Wenn du mysql (besser mysqli) Funktionen nimmst kannst die komplette Anwendung umstellen. Zend Framework bietet darüber hinaus zum Beispiel noch Klassen für SQL Statements, sodass diese unabhängig von der verwendeten Datenbank sind (für mich das größte Problem bei PDO alleine) bzw. man in normalen Fällen gar kein SQL mehr benötigt (Stichwort ORM).
Beispiel anhand meiner Registrierungsfunktion:
PHP:
public static function register($emailaddress, $password)
{
$account = new Account_AccountModel();
$account->insert(array(
'emailaddress' => $emailaddress,
'password' => md5("$emailaddress | $password")
));
}
sieht zwar nett aus aber wie sieht denn die insert methode aus? denn so ungefair siehts bei mir auch aus und in deinem beispiel überpfüste ja nichts sondern trägst nur ein in die datenbank.oder habe ich das richtig nicht richtig verstanden?
gepostet vor 16 Jahre, 1 Monat von DrakeL
Hab mein Posting noch bissle ergänzt gehabt. Ich mache sonst nichts weiter, die Klasse "Account_AccountModel" habe ich bei meinem Posting mal dazu geschrieben, die register Funktion gehört eigentlich zu Ihr (ändere ich gleich noch).
Das ist ja das Schöne, ich mach weiter gar nichts als das was du siehst. Alles Andere, das Zusammenbauen des SQL Statements, das Maskieren der Werte usw. übernimmt das Zend Framework für mich.
gepostet vor 16 Jahre, 1 Monat von BlackScorp
Original von DrakeL
Hab mein Posting noch bissle ergänzt gehabt. Ich mache sonst nichts weiter, die Klasse "Account_AccountModel" habe ich bei meinem Posting mal dazu geschrieben, die register Funktion gehört eigentlich zu Ihr (ändere ich gleich noch).
Das ist ja das Schöne, ich mach weiter gar nichts als das was du siehst. Alles Andere, das Zusammenbauen des SQL Statements, das Maskieren der Werte usw. übernimmt das Zend Framework für mich.
naja aber ich mache doch auch das selbe nur dass ich selbst maskieren muss ich werde mir die lösung von Zend anschauen und werde es auf meine wünsche mal umbauen aber so wie ich das sehe verwendet Zend für jeden sql typ eine eigene methode. also INSERT,SELECT,DELETE,UPDATE . und ich wollte eine Wollmilch legende Eiersau erstellen. desswegen hatt mir das ganze kopfschmerzen verbreitet ich werde mal an meine DB klasse arbeiten.
danke
@reddick
genau so wollte ich das auch machen und werde es auch so machen
gepostet vor 16 Jahre, 1 Monat von DrakeL
Original von BlackScorp
verwendet Zend für jeden sql typ eine eigene methode. also INSERT,SELECT,DELETE,UPDATE . und ich wollte eine Wollmilch legende Eiersau erstellen. desswegen hatt mir das ganze kopfschmerzen verbreitet ich werde mal an meine DB klasse arbeiten.
Es gibt eine Methode die alles zusammenfasst: query der ein SQL Statement übergibst. Zend vereinfacht einfach die verschiedenen Arten der QL. Was mir noch etwas fehlt sind sachen für die DDL... :)
gepostet vor 16 Jahre, 1 Monat von BlackScorp
hat eigentlich das Zend FW eine template klasse?? mich würde interessieren wie die so in etwa ausschaut zz sieht die bei mir so aus:
http://pastebin.com/mb282a01
und die anwendung ist dann etwas problematisch:
$return = new tpl("layout/register_form.html",
array("{input_header}","{user}","{pw}","{pw2}","{email}","{email2}","{accept}","{info_header}","{info_content}","{tou_header}","{tou_content}","{register_button}"),
array(_bes_input,_bes_user,_bes_pw,_bes_pw2,_bes_email,_bes_email2,_bes_accept,_bes_info,_t_reginfo,_bes_tou,_t_tou,_b_register));
und das muss ich noch in das main layout implementieren und und und also das layout zusammenstellen ist was unübersichtlich
gepostet vor 16 Jahre, 1 Monat von DrakeL
Selbst hat Zend Framework glücklicherweise keine Templateklasse (sonst würde ich es für mich zumindest nicht einsetzen). :)
Es wird standardmäßig PHP genutzt als Templatesprache (dafür ist es ja auch gedacht). Aber es gibt soweit ich weiß Leute im Zend Forum die Beispiele gemacht haben wie man Smarty einbinden kann oder ähnliches.
Was Zend Framework unterstützt ist die Trennung nach MVC und mit Zend_Layout dann auch mit einem zentralen Layout / Grundstruktur. Hier die Dokumentation zum Controller:
http://framework.zend.com/manual/de/zend.controller.html
Wenn oben auf Quickstart gehst siehst eine Einführung über die wichtigsten Klassen und wie man das Zend Framework nutzt, vielleicht ist das auch hilfreich.
EDIT: Deine Templateklasse verfügt über keine Möglichkeiten für Selektionen und Iterationen, das wäre allerdings recht wichtig falls ein Array formatiert ausgeben willst oder ähnliches (und der Grund warum man vielleicht lieber PHP nehmen sollte statt eine neue Sprache zu erfinden).
gepostet vor 16 Jahre, 1 Monat von Redrick
ich persönlich schwöre auf http://massassi.com/bTemplate (hat paar macken aber man kann die durch die markerauslegung umgehen), smarty ist keine echte template engine mehr-zu aufgeblasen und träge
gepostet vor 16 Jahre, 1 Monat von BlackScorp
Original von Redrick
ich persönlich schwöre auf http://massassi.com/bTemplate (hat paar macken aber man kann die durch die markerauslegung umgehen), smarty ist keine echte template engine mehr-zu aufgeblasen und träge
also echt nich schlecht was ich da gesehen habe und nicht zu kompliziert. mal sehen ob es schaffe was ähnliches und speziell für mich angepastes daraus zu machen. danke;)
gepostet vor 16 Jahre, 1 Monat von BlackScorp
hi leute ich brauche mal wieder eure hilfe:D
es geht um folgendes: ich habe eine DataBase klasse mit der methode insert die folgende parameter bekommt:
$table, $rowswithvalues
das ganze sieht etwa so aus:
$table = 'test';
$rowswithvalues = array(
'username' => 's:test',
'pw' => 's:test',
'email' => 's:[email protected]'
);
$db = new DataBase();
$db->insert($table,$rowswithvalues);
und die insert methode sieht so aus:
foreach($array as $rows => $values)
{
$rows .= $rows.$komma;
$values = explode(':',$values);
$datatype .= "'%".$values[0]."'".$komma;
$escapedvalues .= mysql_real_escape_string("'".$values[1]."'").$komma;
/*if(nicht letzter datensatz){
$komma = ",";
}
*/
}
$query = sprintf("INSERT INTO '$table'('$rows') VALUES ('$datatype')",$escapedvalues);
und nun will ich ein komma nach jedem verlauf anbinden und nur beim letzten verlauf sollte das nicht angebunden werden. wie kann ich in der foreach schleife prüfen ob jetzt der letzte durchlauf ist oder nicht?
MFG
gepostet vor 16 Jahre, 1 Monat von nOnAmE^
Schneid doch einfach nach der Schleife das letzte Komma mit substr ab?!
gepostet vor 16 Jahre, 1 Monat von Fobby
Das ist ein Problem dem ich auch mehrfach mit ekligen Workarounds wie dem Abschneiden des Kommas per substr begegnet bin. Irgendwann hab ich dann mal 2 Minuten nachgedacht und bin auf eine meines Erachtens schönere Variante gekommen, um Werte durch Kommas zu trennen:
PHP:
$someArray = array();
foreach ($data as $value) {
$someArray[] = $value;
}
$csv = implode(',', $someArray);
?>
gepostet vor 16 Jahre, 1 Monat von DrakeL
Statt "row" würde ich eher "column" sagen, weil du nur eine Zeile hast mit mehreren Spalten. Wie wäre es damit, dass du erst ab dem zweiten Durchlauf ein Komma anhängst, dann hast nur zwischen den Spaltennamen und Werten ein Komma (achtung, ungestet schnell runtergeschrieben):
PHP:
function insert($table, $datas)
{
$columns = '';
$values = '';
foreach ($datas as $column => $value) {
if ($columns != '') {
$columns .= ', ';
$values .= ', ';
}
$columns .= $column;
$values .= "'" . mysql_real_escape_string($value) . "'";
}
$statemet = "insert into $table ($columns) values ($values)";
...
}
PS zu Fobbys Idee:
Wenn man die Werte nicht maskieren müsste könnte man einfach zwei implodes machen mit array_keys($datas) und array_values($datas). Aber wenn du es eh durchlaufen musst wegen der Maskierung bringt es wenig neues Array aufzubauen und dann zu imploden. :)
gepostet vor 16 Jahre, 1 Monat von BlackScorp
ich habe mal Fobbys lösung ausprobiert(weil die einfacher ist) aber die funktioniert nicht
PHP:
$array1= array();
$array2 = array();
$array3 = array();
foreach($array as $columns => $values)
{
$array1[] = $columns;
$values = explode(':',$values);
$array2[] = "'%".$values[0]."'";
$array3[] = mysql_real_escape_string("'".$values[1]."'");
}
$columns = implode(',',$array1);
$datatypes = implode(',',$array2);
$values = implode(',',$array3);
$query = sprintf("INSERT INTO $table(".$columns.") VALUES (".$datatypes.")",$values);
echo $query;
als meldung kommt:
Warning: sprintf() [function.sprintf]: Too few arguments
ich werde mal morgen DrakeLs lösung ausprobieren hoffentlich klappt das besser.
MFG
gepostet vor 16 Jahre, 1 Monat von Fobby
Guck dir mal deinen Code genau an, du verwendest die Variable $columns doppelt.
Speziell:
PHP:
$columns[] = $columns;
Sieht ungewollt aus ;)
gepostet vor 16 Jahre, 1 Monat von DrakeL
normal wenn man $columns mehrfach verwendet. :) Funktionieren tut Fobbys Version wenn mans richtig macht auch, beide Lösungen sind in Ordnung. Bei dir Frage ich mich was $datatypes sein soll... Aber wirst schon wissen was du haben willst. ^^
gepostet vor 16 Jahre, 1 Monat von BlackScorp
Original von DrakeL
normal wenn man $columns mehrfach verwendet. :) Funktionieren tut Fobbys Version wenn mans richtig macht auch, beide Lösungen sind in Ordnung. Bei dir Frage ich mich was $datatypes sein soll... Aber wirst schon wissen was du haben willst. ^^
habe mich vertippt falsche code. habe das jetzt aktualisiert. datatypes sind die dinger bei sprintf. normalerweise sieht ja das ganze so aus:
$sql = sprintf("INSERT INTO test(username,pw,email) VALUES('%s','%s','%s')",
mysql_real_escape_string($username), usw..
desswegen habe ich die werte und die dazugehörige %s hinzugefügt so sieht mein übergabe array aus:
$table = 'test';
$array = array(
'username' => 's:test',
'pw' => 's:test2',
'email' => 's:[email protected]'
);
gepostet vor 16 Jahre, 1 Monat von DrakeL
ich würde lieber per "gettype()" schauen, was für en Datentyp deine Variable hat. Statt ein "s:" mitzugeben kannst auch einfach dafür Sorgen, dass der Datentyp stimmt. Oder einfach mal anschauen was Prepared Statements sind und die Datentypen ignorieren, das wird dir dort nämlich auch abgenommen...
Statt "sprintf()" zu nutzen würde ich lieber gleich den String zusammenbauen. Formatierte Ausgabe wirst du hier nämlich nicht brauchen oder was willst du damit bezwecken?