anpera.net

anpera.net

experimental server @home
Aktuelle Zeit: Mo 16 Sep, 2019 15:09

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa 24 Sep, 2011 15:38 
Offline
Profi
Profi

Registriert: Mo 01 Sep, 2008 10:29
Beiträge: 103
Wohnort: Niedersachsen
Geschlecht: Männlich
LoGD: https://www.sotbd.de/about.php?op=source
Hallo zusammen.

Ich habe mir ein paar Gedanken gemacht wie man den Aktualisierungsbug von LoGD beheben könnte.
z.B. bekommt ein Spieler eine Überweisung, das Gold kommt bei dem betreffenden Spieler aber niemals an, weil die Änderung vom System wieder überschrieben wurde. Mein Lösungsansatz wäre daher eine eigene Tabelle in der die anstehenden Änderungen eingetragen und nachher abgearbeitet werden.

Hierzu wird folgende Tabelle angelegt:
$this->bbcode_second_pass_code('', 'CREATE TABLE `accountvalues` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`spieler` INT NOT NULL ,
`attribut` VARCHAR( 200 ) NOT NULL ,
`aenderung` TINYINT( 1 ) NOT NULL ,
`wert` VARCHAR( 250 ) NOT NULL
);')

In der common.php wird noch eine Funktion zum eintragen der Daten hinzugefügt.
$this->bbcode_second_pass_code('', 'function accountaenderung($spieler,$attribut,$aenderung,$wert) {
$sql = "INSERT INTO accountvalues VALUES (NULL,".$spieler.",'".$sttribut."',".$aenderung.",'".$wert."')";
db_query($sql); }')

Und zum Schluss noch die Ergänzung mit der die anstehenden Änderungen abgearbeitet werden.
Suche in der common.php folgende Stelle:
$this->bbcode_second_pass_code('', '$allownonnav = array("badnav.php"=>true,"motd.php"=>true,"petition.php"=>true,"mail.php"=>true,"topwebvote.php"=>true,"chat.php"=>true,"source.php"=>true);
if ($session[loggedin]){
$sql = "SELECT * FROM accounts WHERE acctid = '".$session[user][acctid]."'";
$result = db_query($sql);
if (db_num_rows($result)==1){
$session[user]=db_fetch_assoc($result);')

Und füge danach folgenden Code ein:
$this->bbcode_second_pass_code('', ' $sql = "SELECT * FROM accountvalues WHERE spieler=".$session['user']['acctid'];
$result = db_query($sql);
for ($i=0;$i<db_num_rows($result);$i++) {
$row = db_fetch_assoc($result);
if ($row['aenderung']==0) $session['user'][$row['attribut']] -= $row['wert'];
if ($row['aenderung']==1) $session['user'][$row['attribut']] = $row['wert'];
if ($row['aenderung']==2) $session['user'][$row['attribut']] += $row['wert'];
$sql = "DELETE FROM accountvalues WHERE id=".$row['id'];
db_query($sql); }')

Das ganze ist hierbei vollkommen ungetestet. Ich wollte meinen Ansatz hier nur mal zur Diskussion stellen.
Meine Frage hierbei, was haltet ihr davon ? Kann das so ohne Probleme funktionieren oder habt ihr schon eigene Lösungen für die Problematik ?


Zuletzt geändert von Shaddar am Sa 24 Sep, 2011 20:14, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa 24 Sep, 2011 16:32 
Offline
Lehrling
Lehrling

Registriert: Mi 17 Aug, 2011 20:42
Beiträge: 37
Geschlecht: Männlich
LoGD: http://noch.nicht.online.de
welche aktualisierung meinst du? newday,setnewday,dragon(dann newday)?

mir ist fremd, das überweisungen (gold/gems) net gehen.

und..?
PHP:
function accountaenderung($spieler,$attribut,$aenderung,$wert) {
$sql = "INSERT INTO accountvalues VALUES (NULL,".$spieler.",'".$sttribut."',".$aenderung.",'".$wert."')";
db_query($sql); }

...wofür NULL?

des weiteren:
wie würdest du es in zB bank.php einbauen, das überweisung sichergestellt ist?
wann/wo wird abgerufen, ob was für spieler acctid = X gespeichert ist?
wenn es nur 1x dem spieler gutgeschrieben wird, sollte es dann nicht direkt aus `accountvalues` entfernt werden?

ich denke deine idee ist umsetzbar, aber ich wüsste für mein spiel nicht warumich es einbinden sollte.

_________________
ERROR!!!


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa 24 Sep, 2011 16:56 
Offline
Profi
Profi

Registriert: Mo 01 Sep, 2008 10:29
Beiträge: 103
Wohnort: Niedersachsen
Geschlecht: Männlich
LoGD: https://www.sotbd.de/about.php?op=source
Der Bug betrifft das Aktualisieren. Beispiel:
Spieler A überweist Spieler B einen Goldbetrag, während dieser gerade eine neue Seite lädt, daher hat er noch alte Datensätze, die im Anschluss auch wieder zurück geschrieben werden, das heißt von der Überweisung hat dieser nie etwas zu sehen bekommen. Ähnlich verhält es sich mit Gefallen die man z.B. von seltsamen Schädeln aus dem Geschenkeladen bekommt.

Das NULL ist dafür da, dass die Datenbank automatisch eine ID ermittelt, da id ja ein auto increment hat brauch ich mir hier keine Mühe mit zu machen.

Für eine Überweisung z.B. so
accountaenderung(5,"goldinbank",2,"7500");
Würde bedeuten das der Spieler mit der ID 5 eine Gutschrift von 7500 Gold bekommt.
Die Abfrage würde auf jeder Seite stattfinden. Das der betreffende Datensatz dann gelöscht werden müsste stimmt natürlich.
Wie gesagt habs nicht getestet und jetzt einfach mal so runter geschrieben, werds noch eben rein editieren.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa 24 Sep, 2011 17:08 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3922
Wohnort: Basel
Geschlecht: Männlich
Der Fehler wird "Lost Update" genannt: Verlorenes_Update.

Dein (Lösungs-)Ansatz gibts bereits schon länger in der Rabenthal(?)-Version und hab ich mal für n'Marktplatz programmiert, ist also nichts neues - ich frag mich gerade, warum ich das nicht schon selbst vorgeschlagen habe... Vielleicht Faulheit? :D
Ganz wichtig ist aber, dass du die Transaktionen nach dem Ausführen auch gleich löschen musst. LoGD ist sowieso nicht Transaktionssicher, also reicht es, die Datensätze zu holen, zu löschen und dann dem User selbst zuzuschreiben.
Das NULL im Query kannst du dir übrigens sparen, wenn du einfach die Spalten aufzählen würdest, die du füllst - sowas solltest du dir allgemein Angewöhnen, dann passiert es dir nicht, dass du beim Hinzufügen eines Feldes zur Tabelle eine Fehlermeldung beim Insert bekommst:

$this->bbcode_second_pass_code('', 'INSERT INTO accountsvalues (spieler, attribut, aenderung, wert) VALUES (?,?,?,?)')

Deine Tabelle ist aber merkwürdig. Für "aenderung" würd ich dir auf jeden Fall einen ENUM-Typ vorschlagen, damit auf keinen Fall ein Wert ungleich der erwarteten Werte auftreten kann. TINYINT(1) wird von MySQL für Booleansche Werte gebraucht - auch wenn sie theoretisch -128..127 bzw 0..256 fassen kann. Und ich würde nicht alle Attribute ändern lassen, sondern sie über eine Whitelist (die halt dann Pflege braucht!) steuern. Sonst kann man schnell mal was durch n'Bug verändern, was man nicht verändern sollte.. Eine andere Möglichkeit ist, das zusenden von Items, Geld und Edelsteine über das Itemsystem abzuwickeln - dort, wo es eigentlich auch hingehört. Beim einloggen eines Users kann man dann ja Geld- und Edelsteinitems auf die Konti dazuzählen. Das hätte den Vorteil, dass es universeller ist für richtiges Item-verschicken, dafür lassen sich andere Felder des Account-Benutzers nicht ändern (Brauchts das überhaupt irgendwo?).


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa 24 Sep, 2011 17:17 
Offline
Profi
Profi

Registriert: Mo 01 Sep, 2008 10:29
Beiträge: 103
Wohnort: Niedersachsen
Geschlecht: Männlich
LoGD: https://www.sotbd.de/about.php?op=source
Ah okay das wusste ich nicht ^^
Ich wurde nur angehalten mal endlich was gegen diesen lästigen Bug zu unternehmen ^^

Das ich die Spalten im Query aufzählen kann ist mir bekannt, da ich aber ohnehin alle Spalten bis auf die id brauche habe ich mir diese Schreibweise (kürzer) angewöhnt. Falls ich nur bestimme Spalten brauche zähle ich diese natürlich auch vorher immer auf ;)

Mit den einzelnen Dateitypen von SQL hab ich mich bisher nicht näher beschäftigt aber danke für den Tipp dann wäre der enum natürlich zu bevorzugen, wobei ich allerdings nur drei verschiedene Typen abfrage und somit alle anderen ohnehin wirkungslos wären :)
Das man Gold und Edelsteine über das Itemsystem abhandelt ist mir neu, aber durchaus interessant ^^

Das Löschen des betreffenden Änderungsantrags hab ich bereits oben rein editiert ;)
Und das mit der Whitelist wäre sicher auch nicht verkehrt, man weiß ja nie wo sich ein Fehler einschleicht ^^


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa 24 Sep, 2011 20:03 
Offline
Meister
Meister
Benutzeravatar

Registriert: Mo 05 Feb, 2007 12:33
Beiträge: 375
Wohnort: Hattingen
Geschlecht: Männlich
LoGD: http://www.alvion-logd.de/logd/
Die Idee Ist fein, ich werde sie weiter verfolgen und wohl auch übernehmen. Natürlich auch meinen Grips anstrengen und mich einbringen wenn ich was zu sagen hab. ;)

Da wäre gleich mal ein Fehlerchen zu vermelden:
if ($row['aenderung']==0) $session['user'][$row['attribut']] -= $row['wert'];
if ($row['aenderung']==1) $session['user'][$row['attribut']] = $row['wert'];
if ($row['aenderung']==2) $session['user'][$row['attribut']] += $row['wert'];

Damit das hinzu zählen und abziehen funktioniert sollte es -= bzw. += heißen. ;)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa 24 Sep, 2011 20:12 
Offline
Profi
Profi

Registriert: Mo 01 Sep, 2008 10:29
Beiträge: 103
Wohnort: Niedersachsen
Geschlecht: Männlich
LoGD: https://www.sotbd.de/about.php?op=source
Ja das wäre nicht verkehrt hatte hier auch nur meine Gedankengänge und nichts fertiges geposten ^^
Mit deiner Änderung hast du natürlich recht, ohne würde das nicht viel bringen :D
Habe es in meinem ersten Post auch noch direkt ausgebessert.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So 25 Sep, 2011 08:51 
Offline
Profi
Profi

Registriert: Mo 20 Apr, 2009 00:30
Beiträge: 124
http://dev.mysql.com/doc/refman/5.0/en/commit.html

Vllt hilft dir das :)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So 25 Sep, 2011 17:39 
Offline
Eingeweihter
Eingeweihter

Registriert: Mi 12 Aug, 2009 18:11
Beiträge: 65
Geschlecht: Männlich
LoGD: http://www.plueschdrache.de
Hallo,

es gibt ansonsten auch einen älteren relativ simplen workaround von Eliwood:
viewtopic.php?f=43&t=2590

Das ist zwar, wie im Thread schon steht, keine sichere Lösung, aber die Wahrscheinlichkeit für den Bug ist damit schon sehr deutlich verringert. Er tritt nur noch dann auf, wenn z.B. der User etwas überwiesen bekommt und mit dem Hit gerade selbst Gold ausgibt, anstatt dass das Risiko bei jedem beliebigen Hit besteht.
Im Grunde reicht es auch, nur die typischen "verdächtigen" Felder zu sichern, was auch einige so bei sich schon drin haben. Seit ich das bei mir eingebaut habe, ist jedenfalls keinem User mehr ein verlorenes Update aufgefallen. Früher kam das gerade bei Erweckungen öfter vor und war dann schon ärgerlich.

Ich gucke zur Zeit eigentlich nur auf: gold, goldinbank, gems, charme, deathpower, charisma, marriedto, jailtime, alive, lasthit, loggedin und noch wenige spezielle Dinge von uns. Wichtig ist lasthit, was wegen des irreführenden Names gerne vergessen wird, aber für die Erweckungen entscheidend ist, denn alive ist dabei nur Kosmetik.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So 25 Sep, 2011 17:45 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3922
Wohnort: Basel
Geschlecht: Männlich
Oh. Das hab ich ja ganz vergessen :pein:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di 27 Sep, 2011 21:53 
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, zugegeben - so lässt sich das Problem zumindest schon einmal an einigen Ecken eingrenzen, aber wirklich sauber und vor allem vollständig ist es so auch nicht: Spätestens wenn man vom aktuellen Wert abhängige Operationen, etwa $this->bbcode_second_pass_code('', '$user['gold'] *= 1.05') durchführt, fliegt dir alles um die Ohren.

Wie Bathory schon anregte ist die wohl "einfachste" sichere Lösung die Atomarisierung von Seitenaufrufen (also alle Daten des Nutzers werden gegen Schreibzugriffe gesperrt, bis die Seite komplett generiert ist). Dazu würde man aber wiederum eine andere Datenbankengine als MyISAM, die nur abellenweites Locking unterstützt, notwendig. Mit InnoDB wäre da eine Option...

_________________
Mehr oder minder inaktiv


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi 28 Sep, 2011 14:38 
Offline
Meister
Meister
Benutzeravatar

Registriert: Mo 05 Feb, 2007 12:33
Beiträge: 375
Wohnort: Hattingen
Geschlecht: Männlich
LoGD: http://www.alvion-logd.de/logd/
Auric hat geschrieben:
... Spätestens wenn man vom aktuellen Wert abhängige Operationen, etwa $this->bbcode_second_pass_code('', '$user['gold'] *= 1.05') durchführt, fliegt dir alles um die Ohren.

Ich denke das Ziel hier ist es wohl auch nicht Werte eines Charakters durch Rechenoperationen zu manipulieren. Es ist halt unglücklich wenn überwiesene Goldstücke, geschenkte Edelsteine oder Gefallen nicht beim Empfänger ankommen. Ebenso unglücklich sind die immer wieder fehlschlagenden Aufnahmen eines neuen Gildenmitglieds.
Um diese Unzulänglichkeiten möglichst auszuschließen und/oder zu minimieren suchen wir eine möglichst einfach umzusetzende Lösung. Und dafür bieten die hier bislang vorgestellten Ansätze doch schon mal eine Basis, auf die man vielleicht weiter aufbauen kann. So denke zumindest ich. ;)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi 28 Sep, 2011 17:18 
Offline
Profi
Profi

Registriert: Mo 01 Sep, 2008 10:29
Beiträge: 103
Wohnort: Niedersachsen
Geschlecht: Männlich
LoGD: https://www.sotbd.de/about.php?op=source
Den Post von Eliwood habe ich nicht gefunden, sonst hätte ich das vermutlich schon länger bei uns eingebaut ^^

Und Linus hat recht, was meine Idee hinter dem Vorschlag war. Davon ab könnte man solche Multiplikationen bzw. Divisionen vor dem Insert auch auf eine Addition oder eine Subtraktion herunter rechnen. Wäre zwar etwas umständlich aber prinzipiell möglich ohne das was dran geändert werden müsste.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi 28 Sep, 2011 18:32 
Offline
Großmeister
Großmeister

Registriert: Mi 15 Dez, 2004 00:41
Beiträge: 467
Wohnort: München
Das Ganze gabs damals auch bei biosLoGD (und gibts sogar immer noch).
Siehe z.B. hier - Suche nach "accounts_update" findet die relevanten Funktionen:

- updateuser: Ein neues Update für einen fremden Account wird hinterlegt.
$this->bbcode_second_pass_code('', 'function updateuser($acctid,$changes) {
$insert = '';
foreach ($changes AS $key=>$val) {
$insert .= ',('.(int)$acctid.',"'.$key.'","'.$val.'")';
}
if ($insert!='') {
$sql = 'INSERT INTO accounts_update (acctid,acctcol,chgval) VALUES '.substr($insert,1);
db_query($sql);
}
}')
- getupdates: Vorhandene Updates für den eigenen Account werden eingelesen und verarbeitet.
$this->bbcode_second_pass_code('', '$cleanupdates = '0';
function getupdates() {
global $session,$cleanupdates;
$sql = 'SELECT * FROM accounts_update WHERE acctid='.(int)$session['user']['acctid'];
$result = db_query($sql);
while ($row = db_fetch_assoc($result)) {
debuglog('got update of '.$row['chgval'].' on '.$row['acctcol']);
if ($row['chgval']{0}=='-' || $row['chgval']{0}=='+') {
$session['user'][$row['acctcol']] += $row['chgval'];
}
else {
// Spezialfall, n&ouml;tig wenn ein negativer Wert fest gesetzt werden soll
if ($row['chgval']{0}=='=') $row['chgval'] = substr($row['chgval'],1);
$session['user'][$row['acctcol']] = $row['chgval'];
}
$cleanupdates .= ','.$row['updateid'];
}
}')
- saveuser: Verarbeitete Updates des eigenen Accounts werden gelöscht.
$this->bbcode_second_pass_code('', ' if ($cleanupdates!=='0') {
$sql = 'DELETE FROM accounts_update WHERE updateid IN ('.$cleanupdates.')';
db_query($sql);
}')
- deleteuser: Ausstehende Updates für den Account werden mit gelöscht.
$this->bbcode_second_pass_code('', ' $sql = "DELETE FROM accounts_update WHERE acctid='$userid'";
db_query($sql);')

Um das zu nutzen, muss man natürlich alle Stellen finden, an denen das jeweilige zu sichernde Feld (im Optimalfall sämtliche Accountfelder) für fremde Accounts geändert wird.
Beispiel aus der bank.php (auskommentiert der vorherige Code):
$this->bbcode_second_pass_code('', ' //$sql = "UPDATE accounts SET goldinbank=goldinbank+$amt,transferredtoday=transferredtoday+1 WHERE acctid='{$row['acctid']}'";
//db_query($sql);
$sql = "UPDATE accounts SET transferredtoday=transferredtoday+1 WHERE acctid='{$row['acctid']}'";
db_query($sql);
updateuser($row['acctid'],array('goldinbank'=>"+$amt"));')

Zu beachten ist dabei, dass der Wert für "goldinbank" auf die Art übertragen wird, "transferredtoday" allerdings nicht. Letzteres hat zwei Gründe. Erstens ist das ein Feld, das man für den eigenen Account üblicherweise nicht verändert (bei biosLoGD ist es so, dass bei saveuser ausschließlich veränderte Werte gespeichert werden und nicht alle, dadurch wird transferredtoday beim Speichern nicht angerührt). Zweitens ist es auch nötig, da ansonsten das Überweisungslimit nicht funktionieren kann, da nicht verarbeitete Transfers nicht gezählt würden. ;)

Die Tabelle accounts_update dürfte wohl so aussehen (ich habs auch nur gerade aus dem Online-Code gesucht und nicht genauer nachgeschlagen):
- updateid: int(10) unsigned auto_increment not null (und natürlich primary key)
- acctid: int(10) unsigned not null (und index drauf)
- acctcol: varchar(255) not null - beinhaltet den Namen der zu verändernden Spalte
- chgval: varchar(255) not null - beinhaltet die Veränderung.
Ein chgval mit Vorzeichen bedeutet relativ zum bisherigen Wert, also z.B. +500 bei einer Überweisung oder -40 bei irgendwas negativem. Ohne Vorzeichen sind absolute Werte, z.B. 16 um irgendeinen Wert auf 16 zu setzen bzw. =-20 um ihn auf -20 zu setzen (man beachte das = am Anfang - das ist nötig, weil ansonsten durch das Vorzeichen ja eine relative Änderung angenommen würde; ein = als erstes Zeichen wird immer abgeschnitten, es ist also bei positiven Werten egal, ob ich 16 oder =16 angebe).

_________________
A bus station is where busses stop. A train station is where trains stop. On my desk there is a workstation...


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi 28 Sep, 2011 19:20 
Offline
Profi
Profi

Registriert: Mo 01 Sep, 2008 10:29
Beiträge: 103
Wohnort: Niedersachsen
Geschlecht: Männlich
LoGD: https://www.sotbd.de/about.php?op=source
Hab das jetzt nur überflogen aber scheint sich ja mit meiner Idee ja ziemlich gut zu decken ^^

Wollte im Grunde ohnehin nur Meinungen dazu einholen, ob das so funktioniert wie ich mir das vorstelle und ob es nicht Jemand gebrauchen kann ^^


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa 08 Okt, 2011 20:36 
Offline
Meister
Meister
Benutzeravatar

Registriert: Mo 05 Feb, 2007 12:33
Beiträge: 375
Wohnort: Hattingen
Geschlecht: Männlich
LoGD: http://www.alvion-logd.de/logd/
Chaosmaker hat geschrieben:
- updateuser: Ein neues Update für einen fremden Account wird hinterlegt.
$this->bbcode_second_pass_code('', 'function updateuser($acctid,$changes) {
$insert = '';
foreach ($changes AS $key=>$val) {
$insert .= ',('.(int)$acctid.',"'.$key.'","'.$val.'")';
}
if ($insert!='') {
$sql = 'INSERT INTO accounts_update (acctid,acctcol,chgval) VALUES '.substr($insert,1);
db_query($sql);
}
}')

Wenn ich mir das anschaue lese ich daraus, dass ich mehrere Transfers in einem Funktionsaufruf ausführen kann, also zb:$this->bbcode_second_pass_code('', 'updateuser($row['acctid'],array('gold'=>"+$gold", 'gems'=>"+$gems" ,'charm'=>"+$cp"));')
Cooool! :)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo 10 Okt, 2011 20:43 
Offline
Meister
Meister
Benutzeravatar

Registriert: Mo 05 Feb, 2007 12:33
Beiträge: 375
Wohnort: Hattingen
Geschlecht: Männlich
LoGD: http://www.alvion-logd.de/logd/
Vorab entschuldige ich mich schon gleich mal für den Doppelpost, aber ich denke dieses Mal muss es sein!

Nach wie vor halte ich das hier von Chaosmaker vorgestellte updateuser() für die kompletteste Lösung, für das angesprochene Problem. Sie birgt aber auch eine große Gefahr: Bei allen Specials, oder anderen Scripts bei denen ein Spieler einem Anderen etwas zukommen lässt, nie mit absoluten Werten arbeiten. Denn ist der Empfänger nicht online, häufen sich mitunter die Updates in der DB an. Zum Zuge kommt aber nur das letzte Update, alle anderen werden überschrieben! Es ist also immer die incrementelle Version zu bevorzugen. Das entsprechende Script muss darauf natürlich angepasst werden.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di 11 Okt, 2011 19:33 
Offline
Großmeister
Großmeister

Registriert: Mi 15 Dez, 2004 00:41
Beiträge: 467
Wohnort: München
Absolut richtig. Ich hab mal nachgesehen, die "absolute" Variante kam nur für Hochzeit/Scheidung (charisma, marriedto) zum Einsatz sowie in der setnewday.php bei der Enteignung von Spielern, die zu lange nicht mehr eingeloggt waren (house auf 0 gesetzt).

_________________
A bus station is where busses stop. A train station is where trains stop. On my desk there is a workstation...


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr 01 Feb, 2013 14:17 
Offline
Meister
Meister
Benutzeravatar

Registriert: Mo 05 Feb, 2007 12:33
Beiträge: 375
Wohnort: Hattingen
Geschlecht: Männlich
LoGD: http://www.alvion-logd.de/logd/
Fast 1 1/2 Jahre tut das accounts_update nun seinen Dienst in Alvion, und ich möchte darauf nicht mehr verzichten. Doch nach und nach sammeln sich Updates in der Datenbank zu denen die Accounts nicht mehr existieren.
Was ist also zu tun? Wieder ein paar Zeilen inclusive DB-Abfragen in die setnewday.php, die doch längst schon überladen ist? Nein, denn die ca. 250 unnützen Updates blähen die Datenbank nicht so doll auf, als würde ich das als notwendig empfinden.

Ich habe dann mal ein kleines Tool geschrieben, dass man hin und wieder mal starten kann um tote Updates zu entfernen.

Dateianhang:
accounts_update_1.GIF
accounts_update_1.GIF [ 10.75 KIB | 4584-mal betrachtet ]

Dateianhang:
accounts_update_2.GIF
accounts_update_2.GIF [ 7.82 KIB | 4584-mal betrachtet ]


$this->bbcode_second_pass_code('', '<?php
/*
* Version: 0.01, 01.02.2013
* Author: Linus
* Email: webmaster@alvion-logd.de
* Zweck: Admintool für das Löschen von unnützen Einträgen im accounts_update
*
*/

require_once("common.php");
require_once "func/isnewday.php";
isnewday(3);

function analyse($delete=FALSE){
$accounts=array();
$sql="SELECT `acctid` FROM `accounts`";
$result=db_query($sql);
while ($row = db_fetch_assoc($result)) {
$accounts[$i]=(int)$row['acctid'];
$i++;
}
$gut=0;
$fehl=0;
$sql="SELECT `updateid`, `acctid` FROM `accounts_update`";
$result=db_query($sql);
while ($row = db_fetch_assoc($result)) {
if(in_array((int)$row['acctid'],$accounts)){
$gut++;
}else{
$fehl++;
if($delete===TRUE) db_query("DELETE FROM `accounts_update` where `updateid`=".(int)$row['updateid'].";");
}
$j++;
}
return array($j, $gut, $fehl);
}

page_header("Einträge im accounts_update löschen");

switch($_GET['op']){
case "delete":
list($j, $gut, $fehl)=analyse(TRUE);
output("`&".$fehl." Einträge wurden gelöscht`n");
addnav('Zurück','su_account_update.php?');
break;

default:
list($j, $gut, $fehl)=analyse();
output("`@`b`cEinträge im accounts_update`c`b`n`n`7Anzahl Einträge gesamt: `@".$j."`n`7Von existierenden Accounts: `@".$gut."`n`7Von gelöschten Accounts: `@".$fehl."`n`n");
if($fehl>0) addnav('unnütze Einträge löschen','su_account_update.php?op=delete');
else output("<table align='center'><tr><td colspan=3 align='center'>`&`i`bKeine Einträge von gelöschten Accounts!`b`i`0</td></tr></table>",true);
break;
}


addnav("G?Zurück zur Grotte","superuser.php");
addnav("W?Zurück zum Weltlichen","village.php");

output("`n<div align='right'>`72013 by Linus</div>",true);
page_footer();')


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

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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