Am 1.Spieltag der neuen Saison hatten wir folgenden Vorfall:
- Ein Mannschaftsleiter wollte melden über Frontend. Nach Eingabe aller Namen (je 8 x Heim und Gast) hat er die Eingabe abgesendet ohne die Partieergebnisse einzutragen. Ein durchaus möglicher Fehler.
- Er versuchte dann die Eingabe erneut und da die bereits eingegebenen Namen nicht aufgeblendet wurden, brach er die Eingabe ab und informierte seinen Staffelleiter. Eine verständliche Reaktion.
- Der Staffelleiter gab das Ergebnis über Backend ein, wobei als Voreinstellung die vom ML eingegebenen Namen erschienen.
- Anschließend waren alle Anzeigen zu dieser Paarung verfälscht.
In meinem Testsystem mit Version 1.1.14 konnte ich alles nachvollziehen!
Weitere Untersuchungen ergaben, die Probleme liegen in der source sent.php:
- allein die Eingabe von Namen führt zum Schreiben von 2 Sätzen pro Partie in die Tabelle clm_rnd_spl, die Felder ergebnis, kampflos und punkte bleiben aber NULL
- das Aufsummieren der Brettpunkte mit Belegung NULL führt dazu, dass die Variable $hmpunkte bzw. $gmpunkte nicht belegt wird, siehe
// Brettpunkte Heim summieren
$query = "SELECT SUM(punkte) as punkte "
." FROM #__clm_rnd_spl "
." WHERE sid = ".$sid
." AND lid = ".$lid
." AND runde = ".$rnd
." AND paar = ".$paarung
." AND dg = ".$dg
." AND heim = 1 "
;
$db->setQuery($query);
$man=$db->loadObjectList();
$hmpunkte=$man[0]->punkte;
- da $hmpunkte bzw. $gmpunkte nicht belegt sind, gelingt das Update von clm_rnd_man nicht, siehe
// Für Heimmannschaft updaten
$query = "UPDATE #__clm_rnd_man"
." SET gemeldet = ".$meldung
." , zeit = '$now'"
." , brettpunkte = ".$hmpunkte
." , manpunkte = ".$hman_punkte
." , wertpunkte = ".$hwpunkte
." WHERE sid = ".$sid
." AND lid = ".$lid
." AND runde = ".$rnd
." AND paar = ".$paarung
." AND dg = ".$dg
." AND heim = 1 "
;
$db->setQuery($query);
$db->query();
Nun geht es im Backend weiter, controller ergebnisse.php:
- die Voreinstellung wird aus clm_rnd_spl geholt, falls vorhanden. Korrekt.
- beim Abspeichern der Eingabe wird unterschieden, ob die entsprechende Paarung in clm_rnd_man bereits als gemeldet gilt (UPDATE der Sätze in clm_rnd_spl) oder nicht (INSERT von Sätzen in clm_rnd_spl)
- in unseren Fall wurde die Paarung fehlerhafter Weise nicht auf gemeldet in clm_rnd_man gesetzt, obwohl schon Sätze in clm_rnd_spl geschrieben wurden, siehe oben zu Frontend
--> es wird nun fehlerhafterweise eine zweite Gruppe von Sätzen in clm_rnd_spl geschrieben
- die doppelten Sätze in clm_rnd_spl führen nun zu vielerlei verfälschten Anzeigen.
Aktuelle Lösung:
durch Bereinigung der Datenbank über phpmyadmin konnte ich die fehlerhaften Anzeigen richtig stellen.
Programmtechnische Lösung:
diese scheint recht einfach. Nach Berechnung von $hmpunkte bzw. $gmpunkte muss die Belegung überprüft werden und die Variable ggf. auf 0 gesetzt werden.
$query = "SELECT SUM(punkte) as punkte "
." FROM #__clm_rnd_spl "
." WHERE sid = ".$sid
." AND lid = ".$lid
." AND runde = ".$rnd
." AND paar = ".$paarung
." AND dg = ".$dg
." AND heim = 1 "
;
$db->setQuery($query);
$man=$db->loadObjectList();
$hmpunkte=$man[0]->punkte;
if (!isset($hmpunkte)) $hmpunkte = 0;
Meine Bedenken:
Die Ergebniseingabe ist eine zentrale Funktion von CLM darf auf keinen Fall gefährdet werden. Inzwischen gibt es viele CLM-Anwendungen und mich wundert, dass dieses Problem noch nicht aufgetreten ist.
Bitte:
Ich bitte Euch insbesondere, das Ausgangsproblem in Gedanken und im System nachzuspielen. Und meine Ausführungen auf Denkfehler zu überprüfen.
Baldige Antworten erwünscht.