SQL MySQL5: Daten werden nicht abgerufen

sverebom

Vice Admiral
Registriert
Aug. 2004
Beiträge
6.644
Hallo,

ich bastel gerade ein Forum für eine "Herr der Ringe Online"-Raid-Gemeinschaft zusammen. Für die Verteilung des "Loots" (im Spiel erkämpfte Gegenstände) möchten wir das "Suicide Kings System" verwenden. Um die Listen und Tabellen, aus den hervor geht, wer berechtigt ist, einen gewünschten Gegenstand zu erhalten, möchte ich dieses Tool verwenden. Das Tool ist bereits installiert und gibt zumindest schon einmal keine Fehlermeldung aus, allerdings werden die Daten, die mit dem Tool in der Datenbank hinterlegt werden, nicht abgerufen.

Im Einzelnen läuft es wie folgt ab: Ich erstelle auf der Admin-Seite diverse Spieler, die bei den verschiedenen Raids mitmachen können. Diese sortiere ich dann in den Raids ein und speichere die Änderungen ab. Anschließend erscheinen die Veränderungen auch auf der Admin-Seite, wenn ich aber die Seite verlasse und neu aufrufe, sind alle Veränderungen verschwunden und die Spieler erscheinen alle wieder in der Liste der verfügbaren Spieler. Außerdem sollte für die Spieler eine HTML-Seite erstellt werden, auf der sie sehen können, in welchen Raids sie gemeldet sind und an welcher Position sie sich in der Vergabeliste befinden. Auch diese Seite wird nicht generiert, was eigentlich nur dann passiert, wen in der Datenbank keine Daten hinterlegt sind. Allerdings befinden sich alle Spieler und Listen in der Datenbank. Sie werden offenbar nur nicht abgerufen.

Ich sollte noch erwähnen, dass das Tool mit MySQL4 funktioniert. Allerdings brauche ich für das Tool PHP5, also musste ich die Seite, die bei All-Inkl gehostet wird, auf einen Server transferieren lassen, auf dem PHP5 läuft. Und da All-Inkl PHP5 nur in Verbindung mit MySQL5 anbietet, musste ich also auch auf MySQL5 wechseln, was laut dem Autor des Tools kein Problem sein sollte.

Ich vermute, dass der Fehler im PHP-Code steckt und die Listen schlichtweg nicht korrekt geladen werden.

Dieser Code-Schnipsel lädt die Spieler, die in der Datenbank hinterlegt sind, in die Liste der verfügbaren Spieler. Das scheint auch zu funktionieren.
PHP:
<?php
                        $query = "SELECT name FROM skapp ORDER BY name, class;";
                        $result = mysql_query($query);

                        echo mysql_error();
                        while ($a = mysql_fetch_assoc($result)) {
                          $b = $a["name"];
                          if (array_search($b, (array)$currentraid) === FALSE) {
                          echo "<OPTION value='$b'>$b</OPTION>";
                          }
                        }
?>

Dieser Code-Schnippsel lädt die verfügbaren Spieler in die Liste der Spieler, die für Raids vorgesehen sind. Das funktioniert nur solange, wie ich die Seite nicht wieder verlasse.
PHP:
<?php
                          foreach ((array)$currentraid as $a) {
                          echo "<OPTION value='$a'>$a</OPTION>";
                        }
?>

Dieser Code-Schnipsel lädt die eingeplanten Spieler in die Verteilungs-Listen der verschiedenen Raids. Auch dies scheint nur solange zu funktionieren, wie ich die Seite nicht verlasse.
PHP:
<?php
		                        if (isset($_REQUEST["loadlists"])) {
		
		                          $query = "SELECT name FROM skapp WHERE $curflat ORDER BY list_welt;";
		                          //  echo $query;
		                          $result = mysql_query($query);
		                          while ($a = mysql_fetch_assoc($result)) {
		                            $b = $a["name"];
		                            echo "<OPTION value='$b'>$b</OPTION>";
		                          }
		                        }
?>

Der folgende Code-Schnipsel könnte mit Blick auf MySQL5 auch fehlerhaft sein.
PHP:
//print_r($currentraid);
if (isset($_REQUEST["confirmlists"])) {
  $_REQUEST["loadlists"] = 1;
  $result = mysql_query("SELECT * FROM skapp WHERE $weltflat");
  $weltposlist = array();
  $spalteposlist = array();
  $helegrodposlist = array();
  $filikulposlist = array();
  $waechterposlist = array();
  $darnarbposlist = array();
        
  while ($a = mysql_fetch_assoc($result)) {
    array_push($weltposlist, $a["list_welt"]);
    array_push($spalteposlist, $a["list_spalte"]);
    array_push($helegrodposlist, $a["list_helegrod"]);
    array_push($filikulposlist, $a["list_filikul"]);
    array_push($waechterposlist, $a["list_waechter"]);
    array_push($darnarbposlist, $a["list_darnarb"]);
  }
  sort($weltposlist);
  sort($spalteposlist);
  sort($helegrodposlist);
  sort($filikulposlist);
  sort($waechterposlist);
  sort($darnarbposlist);

  $weltlist = $_REQUEST["weltlist"];
  $spaltelist = $_REQUEST["spaltelist"];
  $helegrodlist = $_REQUEST["helegrodlist"];
  $filikullist = $_REQUEST["filikullist"];
  $waechterlist = $_REQUEST["waechterlist"];
  $darnarblist = $_REQUEST["darnarblist"];
  

  $weltupd=array_combine($weltlist, $weltposlist);
  $spalteupd=array_combine($spaltelist, $spalteposlist);
  $helegrodupd=array_combine($helegrodlist, $helegrodposlist);
  $filikulupd=array_combine($filikullist, $filikulposlist);
  $waechterupd=array_combine($waechterlist, $waechterposlist);
  $darnarbupd=array_combine($darnarblist, $darnarbposlist);

  foreach($weltupd as $name => $position) {
    $resultLoop = mysql_query("UPDATE skapp SET list_welt='$position', date=NOW() WHERE name='$name';");
  }
  foreach($spalteupd as $name => $position) {
    $resultLoop = mysql_query("UPDATE skapp SET list_spalte='$position', date=NOW() WHERE name='$name';");
  }
  foreach($helegrodupd as $name => $position) {
    $resultLoop = mysql_query("UPDATE skapp SET list_helegrod='$position', date=NOW() WHERE name='$name';");
  }
  foreach($filikulupd as $name => $position) {
    $resultLoop = mysql_query("UPDATE skapp SET list_filikul='$position', date=NOW() WHERE name='$name';");
  }
  foreach($waechterupd as $name => $position) {
    $resultLoop = mysql_query("UPDATE skapp SET list_waechter='$position', date=NOW() WHERE name='$name';");
  }
  foreach($darnarbupd as $name => $position) {
    $resultLoop = mysql_query("UPDATE skapp SET list_darnarb='$position', date=NOW() WHERE name='$name';");
  }

Da der Fehler auch in der Datenbank liegen könnte hier noch der betreffende Abschnitt der Datenbank:
Code:
--
-- Tabellenstruktur für Tabelle `skapp`
--

CREATE TABLE IF NOT EXISTS `skapp` (
  `name` varchar(50) NOT NULL default '',
  `list_welt` int(11) NOT NULL default '0',
  `list_spalte` int(11) NOT NULL default '0',
  `list_helegrod` int(11) NOT NULL default '0',
  `list_filikul` int(11) NOT NULL default '0',
  `list_waechter` int(11) NOT NULL default '0',
  `list_darnarb` int(11) NOT NULL default '0',
  `isguild` tinyint(1) NOT NULL default '0',
  `class` varchar(50) NOT NULL default '',
  `date` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  PRIMARY KEY  (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='SK data table';

--
-- Daten für Tabelle `skapp`
--

INSERT INTO `skapp` (`name`, `list_welt`, `list_spalte`, `list_helegrod`, `list_filikul`, `list_waechter`, `list_darnarb`, `isguild`, `class`, `date`) VALUES
('Halvitur', 3, 1, 1, 1, 1, 1, 1, 'waechter', '2009-10-19 16:25:39'),
('Caitlyn', 1, 2, 2, 2, 2, 2, 1, 'barde', '2009-10-19 16:25:39'),
('Aldoran', 2, 3, 3, 3, 3, 3, 1, 'hauptmann', '2009-10-19 16:25:39');
 
Du hast in deinen Querys am Ende immer ein semikolon was nicht da hin gehört! Also ich hab nie ; am Ende meiner SQL Querys.

$query = "SELECT name FROM skapp ORDER BY name, class;";
 
Danke für den Hinweis. Leider wird das Prblem dadurch nicht behoben :(
 
Der Strichpunkt ist auch ok und zeigt laut SQL-Standard das Ende des aktuellen Befehls an (man kann damit mehrere Statemens voneinander trennen und hintereinander Ausführen). Es wäre sehr verwunderlich wenn das was ändern würde.

Hier mal paar Ideen meinerseits:
-Am Browser liegts nicht? Laut Autor funktionierts nur mit Firefox und man muss wohl auch Javascript an haben.
-Die skapp_log hast du auch erstellt?
-Etwas bedenklich finde ich das fehlende Escaping im SQL. Das ist zwar für den internen Gebrauch aber trotzdem. Evtl. liegts auch daran (insbesondere falls im Namen ein einfaches Anführungszeichen ist).
-Füge doch mal ein "error_reporting(E_ALL);" am Anfang des PHP-Scripts ein damit man evtl. auftretende Fehler besser sieht.
-Werden die Daten denn tatsächlich in der Datenbank gespeichert? Das sollte ja einfach überprüfbar sien mit phpmyadmin und dann könnte man immerhin eingrenzen ob der Fehler beim Schreiben oder Lesen auftritt.
 
Danke für deine Antwort:

- Ich benutze Firefox und unter MySQL4 funktioniert auch alles wunderbar. Leider kann ich auf meinem Server nur PHP5 zusammen mit mySQL5 benutzen, und PHP5 brauche ich zwingend für dieses Tool.
- Ja, alle Tabellen (sind nur zwei) sind erstellt.
- Leider reichen meine Kenntnisse nicht aus, um zu verstehen, was du mit Escaping meinst. Kannst du den angegeben Code vielleicht so modifizieren, wie er deiner Meinung nach sein sollte? Natürlich nur als Beispiel.
- Wird gemacht. Einfach ganz am Anfang des Scripts einfügen?
- Die Datenbank sind vorhanden und mit den Daten, die ich in dem Tool eingegeben habe, gefüllt (siehe Auszug aus der Datenbank).

Vielleicht kann der folgende Code-Schnipsel, der offenbar auch Datenbank-Avfragen enthält, weiterhelfen:

PHP:
function listary($output, $item) {
  $output = $output . " OR name = '". $item . "'";
  return $output;
}

$curflat = substr(array_reduce((array)$currentraid, "listary"), 4);

$weltflat = substr(array_reduce((array)$_REQUEST["weltlist"], "listary"), 4);
$spalteflat = substr(array_reduce((array)$_REQUEST["spaltelist"], "listary"), 4);
$helegrodflat = substr(array_reduce((array)$_REQUEST["helegrodlist"], "listary"), 4);
$filikulflat = substr(array_reduce((array)$_REQUEST["filikullist"], "listary"), 4);
$waechterflat = substr(array_reduce((array)$_REQUEST["waechterlist"], "listary"), 4);
$darnarbflat = substr(array_reduce((array)$_REQUEST["darnarblist"], "listary"), 4);
Ergänzung ()

Ich hab nun die Fehlermeldung erzwungen und erhalte massenhaft Fehlermeldungen dieser Art:
Code:
Notice: Undefined index: weltlist in /www/htdocs/w00bda8b/sks/main.php on line 23

Notice: Undefined index: spaltelist in /www/htdocs/w00bda8b/sks/main.php on line 24

Notice: Undefined index: helegrodlist in /www/htdocs/w00bda8b/sks/main.php on line 25

Notice: Undefined index: filikullist in /www/htdocs/w00bda8b/sks/main.php on line 26

Notice: Undefined index: waechterlist in /www/htdocs/w00bda8b/sks/main.php on line 27

Notice: Undefined index: darnarblist in /www/htdocs/w00bda8b/sks/main.php on line 28

Demzufolge ist der problematische Breich offenbar jener, den ich bereits gepostet habe:

PHP:
$curflat = substr(array_reduce((array)$currentraid, "listary"), 4);

$weltflat = substr(array_reduce((array)$_REQUEST["weltlist"], "listary"), 4);
$spalteflat = substr(array_reduce((array)$_REQUEST["spaltelist"], "listary"), 4);
$helegrodflat = substr(array_reduce((array)$_REQUEST["helegrodlist"], "listary"), 4);
$filikulflat = substr(array_reduce((array)$_REQUEST["filikullist"], "listary"), 4);
$waechterflat = substr(array_reduce((array)$_REQUEST["waechterlist"], "listary"), 4);
$darnarbflat = substr(array_reduce((array)$_REQUEST["darnarblist"], "listary"), 4);
 
Zuletzt bearbeitet:
Diese Meldungen deuten ja nur darauf hin, dass z.B. $_REQUEST["weltlist"] nicht gefüllt ist weil du gar nichts abgeschickt hast. Das ist nur ned so 100%ig sauber programmiert aber nicht wirklich ein größeres Problem.

Ich habe das jetzt mal bei mir installiert auf dem lokalen xampp mit MySQL 5.0.45 und PHP 5.2.4. Soweit ich das beurteilen kann funktioniert das. Ich bin aber kein WoW-Spieler und finde (daher?) die Bedienung nicht gerade intuitiv. Aber na gut. Man muss halt immer erst auf Speichern klicken weil er davor nur per Javascript die Änderungen vornimmt. Teilweise werden die Sachen auch gar ned gespeichert sondern nur in der Session gehalten. Ansonsten funktionierts aber wie gesagt.
 
Ich bin auch kein WoW-Spieler und ja, die Bedienung ist wirklich nicht das Wahre. Wenn das Dinge läuft, werde ich auch zumindest die Gestaltung und Strukturierung gehörig umbauen. Leider gibt es nur dieses Tool, um die SKS-Listen (eine Alternative zum üblichen DKP) zu verwalten.

Deine Erklärung des seltsamen Verhaltens macht mich etwas stutzig.
Wenn ich das Tool frisch installiere, kann sich in den Tabellen natürlich noch nichts befinden. Wenn ich aber das Formular ausfülle und abschicke, werden Daten in der Datenbank hinterlegt und dann ist sie doch gefüllt. Oder verstehe ich da etwas falsch?

Ich habe mittlerweile Verbindung mit dem Autor des Tools aufnehmen können. Vielleicht wird er mehr Licht ins Dunkel bringen können.

Edit: Mmh, möglicherweise wird doch nichts in die Datenbank geladen. Nachdem ich die User angelegt habe, sehe ich diese zwar in der Datenbank, wenn ich aber Veränderungen an den Raids vornehme und diese Veränderungen abspeicher, tut sich nichts in der Datenbank. Ich nehme aber an, dass das Fall sein sollte, und mit MySQL4 hat es auch nocht funktioniert. Langsam glaube ich aber fast, dass ich die Funktionsweise des Tools falsch verstehe.

Du sagst, es funktioniert bei dir. Wenn du dich aus- und wieder einloggst, siehst du gefüllte Listen oder befinden sich bei dir alle Spieler wieder in der Liste der verfügbaren Spieler? (ganz links)
 
Zuletzt bearbeitet:
Solange man nicht Speichern klickt wird zwar der Log und so unten gefüllt aber nichts tatsächlich geschrieben. Erst mit "Save changes" wird tatsächlich was in der Datenbank abgespeichert. Du kannst ja mal nach dem Login und "Load lists" das Netzwerkkabel ziehen (oder besser: Wireshark, LiveHTTPHeaders, TamperData oder ähnliche Programme). Dann wirst du sehen, dass alle Aktionen in der Liste ("Loot", "Suicide" usw.) auch so funktionieren.
Loggt man sich aus und wieder ein, so muss man die User erst wieder doppelklicken und dann "Load lists" klicken. Es wird dann die Reihenfolge wiederhergestellt wie sie zulezt in der Liste standen, mehr aber auch nicht (mehr gibt die sehr minimalistische Datenbankstruktur auch gar nicht her, die Log-Tabelle ist halt noch da aber die speichert eben diesen Log).
 
Ja, all das ist mir eben auch aufgefallen. Ich habe die Funktionsweise einfach falsch verstanden, was auch den minimalistischen Anleitungen geschuldet ist.

Ich habe erwartet, dass die Listen nach dem Anlegen stets verfügbar und editierbar sind. Das sind sie ja auch, aber eben erst nachdem man den "Load Lists"-Button gedrückt hat. Dann erscheinen Listen, man kann alle Spieler verschieben (mit Angabe des Loots, den die Spieler erhalten haben) und die editierten Listen abspeichern.

Verdammt, das Tool hat die ganze Zeit "tadellos" funktioniert. Ich habe einfach nicht durchschaut, wie es eigentlich funktioniert.

Vielen Dank für die Zeit, die du dir genommen hast und auch für die Mühe, das Mistding auch noch bei dir zu installieren, um es zu testen. Ohne dein Nachhaken hätte ich die Funktionsweise wahrscheinlich niemals durchschaut und das Tool in die Ecke geworfen.
 
Zurück
Oben