anpera.net

anpera.net

experimental server @home
Aktuelle Zeit: Mo 09 Jun, 2025 22:02

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Tabelle accounts splitten
BeitragVerfasst: Do 28 Mai, 2009 07:05 
Offline
Eingeweihter
Eingeweihter
Benutzeravatar

Registriert: Sa 07 Jun, 2008 10:37
Beiträge: 53
Geschlecht: Weiblich
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? :? Bin ich überhaupt auf dem richtigen Weg? geht irgendwas eleganter, besser, höher, weiter, schneller? XD
Vielleicht hat wer von den Pros Lust mit anzufassen, wäre toll :)

LG Yun

_________________
*tapfer ihren LoGD-Server alleine bastelt* :3


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tabelle accounts splitten
BeitragVerfasst: Do 28 Mai, 2009 08:40 
Offline
Freak
Freak

Registriert: So 30 Okt, 2005 17:48
Beiträge: 1408
Wohnort: PB
Geschlecht: Männlich
LoGD: http://dav.blood-reaver.de/lotgd/
Ö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

_________________
Mehr oder minder inaktiv


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tabelle accounts splitten
BeitragVerfasst: Do 28 Mai, 2009 10:42 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tabelle accounts splitten
BeitragVerfasst: Do 28 Mai, 2009 10:45 
Offline
Freak
Freak

Registriert: So 29 Jan, 2006 09:41
Beiträge: 1927
Wohnort: Schweiz
Geschlecht: Männlich
Skype: louis.huppenbauer
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tabelle accounts splitten
BeitragVerfasst: Do 28 Mai, 2009 15:16 
Offline
Eingeweihter
Eingeweihter
Benutzeravatar

Registriert: Sa 07 Jun, 2008 10:37
Beiträge: 53
Geschlecht: Weiblich
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 :) klingt auch alles überzeugend, aber so komplex kann ich wirklich nicht proggen XD und es muss alleine schaffbar bleiben.
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

_________________
*tapfer ihren LoGD-Server alleine bastelt* :3


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tabelle accounts splitten
BeitragVerfasst: Do 28 Mai, 2009 15:31 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tabelle accounts splitten
BeitragVerfasst: Do 28 Mai, 2009 17:54 
Offline
Freak
Freak

Registriert: So 30 Okt, 2005 17:48
Beiträge: 1408
Wohnort: PB
Geschlecht: Männlich
LoGD: http://dav.blood-reaver.de/lotgd/
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

_________________
Mehr oder minder inaktiv


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 19 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen
Du darfst keine Antworten zu Themen in diesem Forum erstellen
Du darfst deine Beiträge in diesem Forum nicht ändern
Du darfst deine Beiträge in diesem Forum nicht löschen
Du darfst keine Dateianhänge in diesem Forum erstellen

Suche nach:
Gehe zu:  
cron
POWERED_BY
Deutsche Übersetzung durch phpBB.de
anpera.net - Impressum