Tippspiele synchronisieren für z.B. mehrere Bundesliga-Tippspiele

Wenn Sie unterschiedliche Tippspiele zum selben Sportereignis anbieten, können Sie sich mit Hilfe dieser Anleitung unnötigen Aufwand sparen. Betreiben Sie beispielsweise je ein Bundesliga-Tippspiel für die Familie, Arbeitskollegen und Vereinskameraden. Dann definieren Sie ein „Haupt-Tippspiel“, das zur Verwaltung von Paarungen und Ergebnisse entweder über die Werbe-Markt.de-Schnittstelle oder händisch dient. Ein Script synchronisiert die weiteren Tippspiele.

Vorarbeit: Tippspiele anlegen

3 mal das gleiche Tippspiel für unterschiedliche Teilnehmerkreise

Voraussetzung für die Synchronisierung der Tippspiele ist, dass diese vorhanden sind. Legen Sie also bitte zunächst die gewünschten Tippspiele mit Namen etc. über den Link Tippspiel hinzufügen unter der Menügruppe Tippspiele im Admin-Menü Ihres Tippspiel-Portals an.

Als einfach nachzuvollziehendes und anschauliches Beispiel verwenden wir Tippspiele mit folgenden Namen:

  • WM-Tippspiel (Familie)
  • WM-Tippspiel (Verein)
  • WM-Tippspiel (Kollegen)

Haupt-Tippspiel bestimmen

Die Bestimmung des Haupt-Tippspiels ist weniger ein technischer, als ein logischer Akt. Dabei handelt es sich um das Tippspiel, das Sie entweder zur Synchronisation mit der Werbe-Markt.de-Schnittstelle auswählen oder dessen Paarungen und Ergebnisse Sie händisch verwalten.

Die Quelle der Daten ist unerheblich. Entscheidend ist nur, dass Sie Spieltage und Ergebnisse über das gewählte Haupt-Tippspiel verwalten. Die übrigen Tippspiele übernehmen die Daten dann automatisch.

Unserem Beispiel folgend legen wir das WM-Tippspiel (Familie) als Haupt-Tippspiel fest. Die beiden weiteren Tippspiele sollen dessen Spielrunden und Ergebnisse übernehmen.

PHP-Datei für Synchronisation

tippspiel_synchronizer.php

Gehen wir nun in medias res, indem wir eine PHP-Datei namens tippspiel_synchronizer.php mit folgendem Inhalt erstellen:
<?php
chdir(__DIR__);
include ('./includes/config.php');
$tippspielMaster = 'WM-Tippspiel (Familie)';
$tippspielSlaves = ['WM-Tippspiel (Verein)', 'WM-Tippspiel (Kollegen)'];
$query = "SELECT 'slave' AS `type`,id FROM " . $dbpre . "tippspiele WHERE name IN ('" . implode("','", array_map(function ($tippspielName) use ($con) {
    return mysqli_real_escape_string($con, $tippspielName);
}, $tippspielSlaves)) . "')
UNION
SELECT 'master' AS `type`,id FROM " . $dbpre . "tippspiele WHERE name='" . mysqli_real_escape_string($con, $tippspielMaster) . "'";
$tippspielSlaveIds = [];
$res = mysqli_query($con, $query);
while ($date = mysqli_fetch_assoc($res)) {
    switch ($date['type']) {
        case 'slave':
            $tippspielSlaveIds[] = $date['id'];
        break;
        case 'master':
            $tippspielMasterId = $date['id'];
        break;
    }
}
if (!empty($tippspielMasterId) && !empty($tippspielSlaveIds)) {
    $query = "SELECT kat,runde FROM " . $dbpre . "tipprunden WHERE kat IN (" . implode(',', $tippspielSlaveIds) . ")";
    $res = mysqli_query($con, $query);
    while ($date = mysqli_fetch_assoc($res)) {
        $tipprundenBySlaveId[$date['kat']][] = $date['runde'];
    }
    foreach ($tippspielSlaveIds as $slaveId) {
        $query = "INSERT " . $dbpre . "tipprunden
(kat,runde,name,spiele,schluss,erg)
(SELECT " . $slaveId . ",runde,name,spiele,schluss,erg FROM " . $dbpre . "tipprunden WHERE kat=" . $tippspielMasterId . (!empty($tipprundenBySlaveId[$slaveId]) ? " AND runde NOT IN (" . implode(',', $tipprundenBySlaveId[$slaveId]) . ")" : '') . ")";
        echo $query . '
';
        mysqli_query($con, $query);
        if (!empty($tipprundenBySlaveId[$slaveId])) {
            $query = "UPDATE
" . $dbpre . "tipprunden p1
INNER JOIN " . $dbpre . "tipprunden p2
ON (p2.runde=p1.runde AND p2.kat=" . $tippspielMasterId . ")
SET
p1.name=p2.name,p1.spiele=p2.spiele,p1.schluss=p2.schluss,p1.erg=p2.erg
WHERE
p1.kat=" . $slaveId;
            mysqli_query($con, $query);
        }
    }
}
Sie erkennen in der Zeile

$tippspielMaster = 'WM-Tippspiel (Familie)';

den Namen des Haupt-Tippspiels wieder. Davon ausgehend, dass Ihr als Quelle dienendes Tippspiel einen anderen Namen trägt, tragen Sie diesen entsprechend ein.

Die Zeile
$tippspielSlaves = ['WM-Tippspiel (Verein)', 'WM-Tippspiel (Kollegen)'];

wiederum enthält die Namen der „kopierten“ Tippspiele, das heißt der Tippspiele, die Spieltage und Ergebnisse automatisch beziehen sollen. Auch hier gilt, dass Sie die Namen einfach derer in Ihrem Portal anpassen. Wenn nur ein einziges Tippspiel die Daten eines anderen übernehmen soll, sieht die Zeile wie folgt aus:

$tippspielSlaves = ['Name des Tippspiel-Klons'];
Weitere Anpassungen am PHP-Code sind nicht erforderlich. Das Script funktioniert außerdem, ohne dass Änderungen an der Tippspiel-Software selbst erforderlich wären.

Datei-Upload

Sie haben die PHP-Datei wie im vorangegangenen Abschnitt beschrieben erstellt und die Namen der Tippspiele angepasst? Dann laden Sie die Datei nun mittels FTP-Programm in das Wurzelverzeichnis des Tippspiel-Scripts auf Ihrem Webspace. Anschließend sollte das Script über https://ihredomain.de/ggf-pfad-zum-verzeichnis/tippspiel_synchronizer.php erreichbar sein.

Aufruf via CronJob

Die tippspiel_synchronizer.php ist sowohl für den Aufruf via HTTP, als auch CLI geeignet. Zweitgenannter ist in der Regel etwas performanter und erlaubt Ihnen, bei Bedarf den Aufruf des Scripts über das Web zu unterbinden, obwohl dieser mit keinerlei Risiko verbunden ist.

Für das Anlegen des CronJobs stehen Ihnen seitens Ihres Providers üblicherweise grafische Oberflächen zur Verfügung, z.B. Plesk (Geplante Aufgaben) oder cPanel. Entscheiden Sie selbst, ob ein stündlicher Abgleich ausreicht, oder beispielsweise die Synchronisation im 10-Minutentakt erfolgen soll.