Yeah, Mädels, das geht runter wie Öl
Krieg ich n Pokal, wenn ich das Torschützen-Problem auch noch in den Griff kriege ?
Da ist nämlich auf jeden Fall der Wurm drin:
Code: Alles auswählen
SELECT userid from phpbb_em_torschuetzen_user u inner join phpbb_em_torschuetzen t on t.spielerid = u.spielerid where userid = (select tipp_user from phpbb_em_tipps where tipp_id = " . $em_tipps[$current_game_id][$u]['tipp_id'] . ") and tore = (Select max(tore) from phpbb_em_torschuetzen)
1. wird nach "max(tore)" selektiert, derjenige mit den meisten Toren ist also automatisch der Torschützenkönig (ob ers wirklich ist oder nicht)
2. hat der Query wieder verschachtelte SELECTs, die Leute, deren SQL das nicht kann, sind also wieder angeschmiert
Folgenden Hack kann ich anbieten (nicht komplett durchgetestet, die EM läuft ja noch und ich habe momentan kein separates Testsystem !):
erstmal eine Änderung an der Datenbank ("phpbb_em_torschuetzen" anpassen, falls man ein anderes Prefix nimmt):
Code: Alles auswählen
ALTER TABLE `phpbb_em_torschuetzen` ADD `isking` TINYINT NOT NULL DEFAULT '0';
(die Spalte "berechnet" in der
phpbb_em_torschuetzen_user wird übrigens nirgendwo benutzt !?)
dann: öffnen
includes/functions_em.php
finden
Code: Alles auswählen
//Torjäger
$torjaegerpoints = 0;
$sql = "SELECT userid from phpbb_em_torschuetzen_user u inner join phpbb_em_torschuetzen t on t.spielerid = u.spielerid where userid = (select tipp_user from phpbb_em_tipps where tipp_id = " . $em_tipps[$current_game_id][$u]['tipp_id'] . ") and tore = (Select max(tore) from phpbb_em_torschuetzen)";
if( !$result = $db->sql_query($sql) )
message_die(GENERAL_ERROR, $lang['tipp_Sql_Error'], $lang['Error'], __LINE__, __FILE__, $sql);
while($row = $db->sql_fetchrow($result))
{
$torjaegerpoints = $row['userid'];
}
if ($torjaegerpoints > 0) {
$tipp_new_points = $tipp_new_points + $em_config['points_winnerscorer'];
}
ersetzen mit
Code: Alles auswählen
//Torjäger
$sql = "SELECT userid
FROM " . EM_TJAEGERTIPPS_TABLE . " u, " . EM_TJAEGER_TABLE . " t, " . EM_TIPPS_TABLE . " v
WHERE u.spielerid = t.spielerid AND
u.userid = v.tipp_user AND
v.tipp_id = " . $em_tipps[$current_game_id][$u]['tipp_id'] . " AND
t.isking = 1";
if( !$result = $db->sql_query($sql) )
{
message_die(GENERAL_ERROR, $lang['tipp_Sql_Error'], $lang['Error'], __LINE__, __FILE__, $sql);
}
if ($db->sql_numrows($result) > 0)
{
$tipp_new_points = $tipp_new_points + $em_config['points_winnerscorer'];
}
Der Query verzichtet jetzt auf Subselects, das läuft also schonmal überall.
Ansonsten ist etwas Handarbeit angesagt: durch die DB-Änderung erhält die Tabelle em_torschuetzen eine neue Spalte ("isking"), die man - momentan MANUELL (also per phpMyAdmin !) - auf "1" setzen muß, wenn der Torschützenkönig feststeht, spätestens vor Eintrag des Final-Ergebnisses.
Das Flag wird im Query mit abgefragt, es zählt jetzt also nicht mehr die höchste Torzahl !
(wurde der Torschützenkönig von niemandem getippt, bleibt die Spalte halt bei allen Spielern auf "0", dann bekommt auch keiner die Extra-Punkte)
Damit ist schonmal verhindert, daß Punkte vergeben werden, nur weil bei einem Spieler die meisten Tore eingetragen wurde, ohne daß dieser Torschützenkönig ist.
HINWEIS: im o.a. Query habe ich die Datenbanknamen aus der config.php gezogen (da stand vorher im Klartext "phpbb-" drin !), die config.php sollte also mit allen Tabellen auf dem neusten Stand sein !
TODO: die
admin/em_config.php so abändern, daß man eine zusätzliche Checkbox bei den Torjägern hat, mit der man den König setzen kann (dann muß man nicht in der Datenbank rumhampeln).
Daran kann sich aber gerne auch mal jemand anderes versuchen
B.