anpera.net
https://anpera.homeip.net/phpbb3/

Datenbank spinnt
https://anpera.homeip.net/phpbb3/viewtopic.php?f=34&t=3019
Seite 1 von 1

Autor:  Cybo [ Di 17 Okt, 2006 21:47 ]
Betreff des Beitrags:  Datenbank spinnt

Hi,
also mein phpAdmin schwohl zu spinnen oder so... auf jeden fall habe ich folgendes problem: Ein User kämpft und findet ein item, dies wird in der datenbank eingetragen, noch ein user findet ein item und folgender fehler kommt
$this->bbcode_second_pass_code('', 'INSERT INTO items(name,class,owner,gold,gems,value2,hvalue,description) VALUES ('Ksienmrofrucht','Beute','42','500','1','8','3','Mysteriöse Frucht aus den tiefen Schluchten des Elindrischen Gebirgszuges')

Duplicate entry '4294967295' for key 1') kurze zeit findet ein anderer user wieder ein item, mit ähnlichem/gleichem fehler$this->bbcode_second_pass_code('', 'INSERT INTO items(name,class,owner,gold,gems,value1,value2,hvalue,description,buff) VALUES ('Magiebarriere','Zauber',42,81.8181818182,0,5,10,0,'Dieser Zauber kann 10x verwendet werden und blockt jeweils einen Angriff deines Gegners komplett ab. (gebraucht)','a:5:{s:4:\"name\";s:13:\"Magiebarriere\";s:8:\"roundmsg\";s:94:\"`VEin hellblauer Energieschild blitzt auf und blockt den Angriff deines Gegners komplett ab.`0\";s:6:\"rounds\";s:1:\"1\";s:12:\"badguyatkmod\";s:1:\"0\";s:8:\"activate\";s:7:\"defense\";}')

Duplicate entry '4294967295' for key 1')
ich habe hier ein paar inserts aus dem forum genommen und dann mal irgendwelche zahlen eingetippt um items zu dublizieren und naja die zahlen wurden halt immer größer, ich habe massig item-IDs die NICHT belegt sind, wie/wo kann ich einstellen, dass in der DB einträge in einer freien zeile eingetragen werden? oder anders: woher weiss die DB, dass das letztgefundene item die ID "4294967295" hat? ich will die zahl ändern...
hilfe bitte dringend schnell!

Autor:  Cybo [ Di 17 Okt, 2006 22:00 ]
Betreff des Beitrags: 

Ich hab's nun selsbt getestet und wieder folgender Fehler:
$this->bbcode_second_pass_code('', 'INSERT INTO items(name,class,owner,gold,gems,value1,value2,hvalue,description,buff) VALUES ('Raserei','Zauber',3,500,0,2,2,3,'Dies ist mehr eine Kampftechnik, als es mit Magie zu tun hat. Dein Angriffswert steigt, deine Verteidigung leidet allerdings unter dieser blinden Raserei. Kann 3 Tage lang 2x eingesetzt werden. (gebraucht)','a:7:{s:4:\"name\";s:7:\"Raserei\";s:8:\"roundmsg\";s:70:\"`qDu führst in blinder Raserei einen besonders heftigen Angriff aus.`0\";s:6:\"rounds\";s:1:\"1\";s:6:\"atkmod\";s:3:\"1.1\";s:6:\"defmod\";s:3:\"0.9\";s:12:\"badguydefmod\";s:3:\"0.9\";s:8:\"activate\";s:10:\"roundstart\";}')

Duplicate entry '4294967295' for key 1')
Woher weiss das spiel, oder die datenbank, dass der eintrag genau mit der zahl dort weitergeht?

Autor:  Kevz [ Di 17 Okt, 2006 22:07 ]
Betreff des Beitrags: 

Die Fehlermeldung weisst dich darauf hin das dieser Eintrag bereits vorhanden ist. Bzw. die ID bezüglich des Inserts...

Autor:  Cybo [ Di 17 Okt, 2006 22:13 ]
Betreff des Beitrags: 

Ja das weiss ich, ich habe die tabelle jetzt umgeschrieben!
wo kann ich ) AUTO_INCREMENT=4294967295 ; ändern? daran lag es nämlich!

edit: schon gut, habe es unter "operationen" gefunden!

Autor:  Auric [ Di 17 Okt, 2006 22:44 ]
Betreff des Beitrags: 

Die Antwort ist in diesem Falle gar nicht so wichtig, um dem problem auf die Schliche zu kommen - viel wichtiger ist folgende Frage: Was ist ((2^32)*2)-1
[klammern sind Mathematisch unnötig..ich weiß]
1) Die mathematische Lösung ist: 4294967295
2) (und viel wichtiger) Es ist der höchste Speicherbare wert bei einem 32Bit Integer mit Unsigned-Deklaration, also dem Feldtyp, der bei den Items die IDs verwaltet.

Was bedeutet das jetzt genau?
Dein LotgD läuft wahrscheinlich schon eine Weile und du hast eventuell auch einige User, die im laufe der Zeit einige Items bekommen haben.. und nach einer weile ist eben auch dieser unglaublich hohe wert erreicht, Die Liste der Items ist soweit voll (sehr wahrscheinlich gibt es unmengen von Lücken dazwischen, aber so arbeitet die DB nun mal, das wichtigste ist der höchste wert).

Ok, und wass soll man jetzt machen?
Entweder jedes Mal wenn soetwas auftritt die Items schön durchordnen (geht per PHP & MySQL eingermaßen flink) und den Auto-Increment-Wert wieder runtersetzen oder erstmal den Speicherbereich für den Key hochsetzen. Denn bei einem Key von 64 Bit inclusive Unsigned hätten wir dann nicht mehr nur 2^32*2-1 sondern wunderbare 2^64*2-1 und das ist schon eine Zahl, die sich vereinfacht mit 3,6 * 10^19 audrücken lässt. Also genug bis zum Sanktnimmerleinstag!

Autor:  Cybo [ Mi 18 Okt, 2006 05:10 ]
Betreff des Beitrags: 

Ich hab's mir gestern Abend im Bett ausgerechnet (als ich das schon erledigt hatte...) INT^11 müsste eigentlich auf die gleiche Zahl kommen!
Aber rotzdem danke, für den Hinweis!

Autor:  Bill Tür [ Mi 18 Okt, 2006 07:41 ]
Betreff des Beitrags: 

Auric hat geschrieben:
...Entweder jedes Mal wenn soetwas auftritt die Items schön durchordnen (geht per PHP & MySQL eingermaßen flink) und den Auto-Increment-Wert wieder runtersetzen...


Könntest du einem PHP/MySQL Laien wie mir in kurzen verständlichen Sätzen erklären, wie das geht? ;)

Autor:  Auric [ Mi 18 Okt, 2006 11:29 ]
Betreff des Beitrags: 

Einfach Variante:
$this->bbcode_second_pass_code('', 'ALTER TABLE `items` CHANGE `id` `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT ')

oder ansonsten ... hm, das vernünftig hinzuordnen ist nicht ganz einfach, da die ersten Items Ja Prototypen sind usw... Ich schaue mal, ob ich mi da nicht was zu basteln kann... wenn es funzt, poste ich es dann hier.

Autor:  Cybo [ Mi 18 Okt, 2006 15:11 ]
Betreff des Beitrags: 

Das wäre gut, das nimmt einem dann eine Menge Arbeit ab! Gut die 20, 25 Datensätze, die ich da gestern Abend hatte, waren nicht so schlimm, da mal eben die ID zu ändern, aber wenn das irgendwann mal mehr sind, wäre swas mit sicherheit äusserst hilfreich!

Autor:  Auric [ Mi 18 Okt, 2006 22:58 ]
Betreff des Beitrags: 

So, hier hätten wir dann mal eine erste Version des Anordners..
aber auf jeden fall vorher ein Backup anlegen, ich übernehme keinerlei Haftung für verlorene Daten soder sonstwas!
[php]// VORHER UNBEDING EIN BACKUP ANLEGEN!!!
$offset = 50; // Wichtig - hier bitte mindestens den letzten .Prot eintrag oder hexenfluch eintragen!

$sql = "SELECT * FROM items WHERE id > $offset";
$result = db_query($sql);
$max = db_num_rows($result);

db_query("DELETE FROM items WHERE id > $offset");
db_query("ALTER TABLE `items` AUTO_INCREMENT=".$max);

for($i=0;$i<$max;$i++) {
$row = db_fetch_assoc($result);
$sql = "INSERT INTO items(id,name,class,owner,value1,value2,gold,gems,description,hvalue,buff) VALUES(
".($i+$offset).",'".$row['name']."','".$row['class']."',".$row['value1'].",".$row['value2'].",
".$row['gold'].",".$row['gems'].",'".$row['description']."',".$row['hvalue'].",'".$row['buff'].")";
db_query($sql);
}[/php]

Autor:  Cybo [ Do 19 Okt, 2006 05:10 ]
Betreff des Beitrags: 

Das sieht doch schonmal ganz gut aus, aber muss man dann immer nach jedem neuen Eintrag das Offset in dieser Anweisung ändern? Oder sagt der das der DB nur ein einziges Mal?

Autor:  Bill Tür [ Do 19 Okt, 2006 08:46 ]
Betreff des Beitrags: 

$sql = "INSERT INTO news

soll doch sicher heißen

$sql = "INSERT INTO items

oder unterlieg ich da nem Irrtum?

ansonsten schaut das echt klasse aus. ich werd das ma ausprobieren :)

Autor:  Auric [ Do 19 Okt, 2006 11:31 ]
Betreff des Beitrags: 

Jaaaah, der bill hat da nicht ganz unrecht.. wie komme ich nur auf News :???:

Na ja, das Script müsstest du immer nur dann aufrufen, wenn dein ganz oben beschriebener Fehler auftaucht, also nicht allzu häufig.

Wenn du allerdings sehr viele Items schon drinne hast, kann das ganze auch ne weie dauern, da die einzelnen Einträge ja ersteml wieder einsortert werden wollen..

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/