anpera.net https://anpera.dyndns.org/phpbb3/ |
|
Tabelle accounts splitten https://anpera.dyndns.org/phpbb3/viewtopic.php?f=34&t=4901 |
Seite 1 von 1 |
Autor: | Yunfei [ Do 28 Mai, 2009 07:05 ] |
Betreff des Beitrags: | Tabelle accounts splitten |
Ja, ich weiß, so ähnliche Themen gab es schon, oder vielleicht auch nur eins, ich weiß es nicht mehr xD Ich habe mich vorher durchgewühlt und nichts hilfreiches bis auf Interesse und großes blabla ohne sharing im Anschluss gefunden ![]() Also wie der Titel schon sagt: Ich möchte die Tabelle accounts ausmisten. Warum? Mein Server ist doch winziger als klein, weil ich alleine drauf rumhopse? Ganz einfach: ich finde nichts mehr wieder xD Vielleicht können wir zusammen für alle etwas zusammenschustern. Viele würden sich sicher darüber freuen, vor allem die, die PHP gar nicht rallen. Ich mache an dieser Stelle natürlich KEINE Einbauanleitung, dazu ist das Ganze viel zu wackelig. Es wäre nur schön, wenn man gemeinsam drüber schauen und dann was geeignetes für alle daraus basteln könnte. Die Leute, die mit der Struktur von LoGD vertraut sind, werden wissen wo was sitzt. login.php $this->bbcode_second_pass_code('', '$sql = "SELECT accounts.*,events.* FROM accounts,events WHERE accounts.login = '$_POST[name]' AND accounts.password=MD5('$_POST[password]') AND accounts.locked=0 AND events.login = '$_POST[name]'"; $result = db_query($sql);') Hier habe ich versucht die Inhalte der Tabellen "events" (für Zeugs wie seenbard, seenlover und was man sonst noch nur begrenzt jeden Tag an "events" haben darf) und "accounts" zu lesen. Ich glaube auch, dass das klappt zumindest kommt keine Fehlermeldung mehr. Theoretisch sollte nun trotz Auslagerung der Zellchen alles in der Variable $session[user] landen. Wäre weniger Arbeit, Bzw. müsste man keine scripte umschreiben ^^ create.php $this->bbcode_second_pass_code('', '$sql = "INSERT INTO events(login) VALUES ('$shortname')"; db_query($sql) or die(db_error(LINK));') In der create.php habe ich bereits eine Zeile, die auch artig jedem neuen Char einen Eintrag in die Tabelle "events" beschert. Das ganze wäre also nur bedingt für laufende Server geeignet, da müsste man sich etwas anderes überlegen. So. Bis dahin bin ich selbst gekommen. Problem für mich ist jetzt die saveuser Funktion, die bei mir so aussieht: common.php $this->bbcode_second_pass_code('', ' function saveuser() { global $session,$userbackup,$dbqueriesthishit,$REQUEST_URI; if ($session['loggedin'] && $session['user']['acctid']!="") { //changes by Eliwood for www.silienta-logd.de geändert für das txtfilesystem $file = fopen('./cache/c'.$session['user']['acctid'].'.txt','wb'); fwrite($file,$session['output']); fclose($file); chmod('./cache/c'.$session['user']['acctid'].'.txt', 0777); $session['user']['allowednavs'] = serialize($session['allowednavs']); $session['user']['bufflist'] = serialize($session['bufflist']); $sql = 'UPDATE `accounts` SET '; reset($session['user']); while(list($key,$val) = each($session['user'])) { if(!isset($userbackup[$key]) || $val != $userbackup[$key]) { if (is_array($val)) $val = serialize($val); $val = addslashes($val); $sql.='`'.$key.'` = "'.$val.'", '; } } $sql = substr($sql,0,strlen($sql)-2); $sql.= ' WHERE `acctid` = '.$session['user']['acctid']; db_query($sql); } } ') Wie geht's dort weiter? ![]() Vielleicht hat wer von den Pros Lust mit anzufassen, wäre toll ![]() LG Yun |
Autor: | Auric [ Do 28 Mai, 2009 08:40 ] |
Betreff des Beitrags: | Re: Tabelle accounts splitten |
Öhm, wenn du dir mal eine (recht effektive) Version dessen anschauen möchtest guck mal in die DS-Version, da gibt es bereits eine Auslagerung (accunts_extra_data) oder so. Dann empfehle ich eine etwas passendere benennung der Tabellen - "events" kann auch für irgendwelche anderen Ereignisse stehen - acct_events wäre schon viel deutlicher. Des weiteren halte ich es für sinnvoller, die acctid statt dem login als Index zu verwenden. Außerdem lässt sich das ganze per JOIN-Syntax wesentlich sauberer schreiben: $this->bbcode_second_pass_code('', 'SELECT a.*,e.* FROM accounts a JOIN acct_events e USING(acctid) WHERE a.login....') Schlussendlich solltest du auch beachten, das dich jede weitere Tabelle, die bei jedem(!) eingeloggten Pagehit zusätlich verknüpft werden muss Performance kostet! Ob sich das für ein bisschen übersicht lohnt, oder ob es nicht bessere Möglichkeiten gibt sollte man sich genau überlegen. Beispielsweise könnte man die Unmengen von "events" in ein implodiertes oder serialisiertes Array stecken - wesentlich übersichtlicher, allerdings müsste da am Code einiges geändert werden oder es wird unschön: z.B. $session['user']['events']['seenbard'] oder aber das deserialisierte Array per array_merge in $session['user'] einpflanzen. Nur mal so als konstruktive Kritik. Auric |
Autor: | Eliwood [ Do 28 Mai, 2009 10:42 ] |
Betreff des Beitrags: | Re: Tabelle accounts splitten |
Alternativ kann man in der Tabelle accounts nur die wichtigsten Informationen speichern. Name, Login, Titel, Passwort, IP, allowednavs, output und sowas. Dann kann man mit Ausmisten beginnen. Zuerst sollten Waffen und Rüstungen sauber in das Item-System integriert werden (Mit zusätzlichem Feld isequipped in der Tabelle items), für Gold und Gems könnte man das genauso machen. Das ist dann auch noch konsequent: Items bleiben Items. Ein Nachteil dabei ist allerdings, dass die Verwaltung dann etwas umständlicher ist. Mit passenden Funktionen kann man das dann aber wieder vereinfachen, zum Beispiel ein user\addGold(), user\addGems(), user\switchWeapon(). Felder wie "hexe besucht", "getrunken", "heute Transfers" kann man dann in eine Tabellenstruktur auslagern, die ungefähr so aussieht: acctid | name | value. Der Primärschlüssel legt sich über die Felder acctid und name. Diese Felder kann man dann wie die Settings bearbeiten: user\saveData('transferstoday', user\getData('transferstoday') + 1). Der Vorteil ist hier, dass die Daten auch sofort gespeichert werden und nicht am Schluss alles sofort in die Datenbank gequetscht wird. Auch die Einstellungen könnte man entweder in dieser Tabelle speichern (Wenn man nur wenige hat), oder sich dafür sogar noch eine vierte Tabelle anlegen (vereinfacht etwas die Administration und wäre sauber getrennt). Edit: Man muss sich natürlich im klaren darüber sein, dass meine Vorschläge eine Inkompabilität mit fast allen Addons verursacht. Kompatibel ist wohl nur eine zweite Tabelle im gleichen Stil wie die accounts, die dann gejoint werden. Meine Methode hat aber den Vorteil, dass man dann alle Felder in den Accounts kennt - und die beim User-Laden auch erwähnen kann. Dürfte dort dann etwas Zeit sparen. |
Autor: | Harthas [ Do 28 Mai, 2009 10:45 ] |
Betreff des Beitrags: | Re: Tabelle accounts splitten |
Ich persönlich habe mir auch strikt vorgenommen, Login und Spielcharaktere zu trennen. Eine Tabelle dient zur Speicherung der Logins. login, email, navs, passwort, und nicht wirklich mehr. Erst in einer zweiten Tabelle werden dann Name, Titel, und all die anderen Charakterbezogenen Werte gespeichert. So wird man es später auch einfacher haben, wenn man einem Spieler mehrere Charaktere über denselben Account geben will. Wobei es natürlich einen gewissen Aufwand bedeutet, und es auch längst nicht alle so haben wollen. |
Autor: | Yunfei [ Do 28 Mai, 2009 15:16 ] |
Betreff des Beitrags: | Re: Tabelle accounts splitten |
Eliwood hat geschrieben: Alternativ kann man in der Tabelle accounts nur die wichtigsten Informationen speichern. Name, Login, Titel, Passwort, IP, allowednavs, output und sowas. Eliwood hat geschrieben: Kompatibel ist wohl nur eine zweite Tabelle im gleichen Stil wie die accounts, die dann gejoint werden. Und das ist genau das, was ich machen möchte. Mir stellte sich bei ersten Überlegungen - ich übe mich nur sporadisch in PHP - die Frage, wie man so einen Abruf am einfachsten hinbekommen könnte, also so, dass man nicht noch x php Seiten abklappern und abändern muss. Ich wollte die accounts in zwei tabellen splitten, eben so sortieren, beide in die Variable $session[user] speichern und dann normal weiter verwenden wie sonst. @Auric: Ich hatte zuerst acctid als Primärschlüssel. Später habe ich mir dann aber gedacht, dass es sinnvoller ist den login zu verwenden, weil ich bei der Charerstellung keine id übergebe, sondern den login und mir war es etwas zu schwammig darauf zu hoffen, dass sich da nichts ins Gehege kommt. Das war zumindest mein Gedankengang O_o vielleicht bin ich ja auch nur übervorsichtig. Alternativ könnte ich einfach eine acctid mit rein schreiben, durch auto_increment sollte die ja automatisch hochzählen, aber wo genau ist der Sinn? Ich kenne die alte DS Version und ihre DB Struktur. Fand ich toll, konnte es damals wie heute aber nicht nachvollziehen, so wie einiges andere, was an „technischem Wunderwerk“ xD drin steckt. Die Umbenennung empfielst du denke ich wg. der Sortierung? Klingt gut, mache ich direkt ^^ Ich habe mir auch die verschiedenen JOINs angesehen und versucht zu verwenden, bekam aber jedes Mal eine Fehlermeldung ala "login is ambiguous“ O_o Diese Seite hier habe ich dazu herangezogen http://www.codinghorror.com/blog/archives/000976.html und von da FULL OUTER JOIN. Sah zweckmäßig aus, war es aber scheinbar nicht O_o? Ich werde mit deiner Vorlage noch mal versuchen, ob ich damit weiter komme, Auric, vielleicht habe ich gestern auch nur einen Denkfehler gehabt. Also danke erst mal fürs lesen und Gedanken machen ![]() Ich dachte wirklich, dass es reicht wenn ich es so schlicht und einfach mache und dann noch irgendwie herausbekomme, wie man das Abspeichern entsprechend anpasst, die Funktion saveuser verwirrt mich nämlich total. Bis dahin funktioniert es schon, glaube ich ![]() LG Yun |
Autor: | Eliwood [ Do 28 Mai, 2009 15:31 ] |
Betreff des Beitrags: | Re: Tabelle accounts splitten |
Auf die neue Account-Id kannst du mit mysql_insert_id() zugreifen. Müsste auch ne db-Funktion in der dbwrapper dazu gehen. Der Rest ist dann ziemlich simpel. Zwei Queries um die Daten holen, accounts speicherst du aber in zwei verschiedenen Variablen ab ($session['user'] und $session['account'] zum Beispiel). Beim Speichern durchläufst du $session['user'], fügst, wenn ein Schlüssel in beiden Arrays vorkommt, die Informationen in accounts ein, wenn der Schlüssel nur in $session['user'] vorkommt in account_extra. Das sollte kompatibel sein. |
Autor: | Auric [ Do 28 Mai, 2009 17:54 ] |
Betreff des Beitrags: | Re: Tabelle accounts splitten |
zum thema JOINs kann ich nur die folgende Seite empfehlen - ist zwar etwas älter, aber das sollte nicht stören, ist ja alles genormt: http://www.little-idiot.de/mysql/mysql-118.html Und was die Kompatibilität angeht - so ist's eben bei 0.97: Spagetticode ohne definierte Interfaces |
Seite 1 von 1 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |