PHP Anzahl gleicher Tipps im Tippspielformular begrenzen

Robert.Moss

Cadet 3rd Year
Dabei seit
Juni 2002
Beiträge
55
Hallo zusammen,

wir tippen im Bekanntenkreis ein kleines Bundesligatippspiel. Leider haben wir immer wieder ein paar Tipper, die ständig die gleichen Ergebnisse tippen (9 x 2:1 z.B).

Meine Frage: Kann ich das irgendwie umgehen, sprich schon bei der Tippabgabe eine Überprüfung einbauen, die z.B. nur 3 x 2:1, 3x 1:1 und 3 x 1:2 zu lässt.

Das Tippspiel ist mit JoomLeague gemacht, leider ist es mit meinen Programmierkenntnissen nicht so weit her, ich bräuchte also "intensive" Hilfe.

Vielen Dank

P.S. Script kann ich gerne zukommen lassen, bzw. den Formularteil hier posten, ist aber relativ lang.
 

volcem

Lieutenant
Dabei seit
Dez. 2007
Beiträge
1.020
Eigentlich brauchst Du nur zu prüfen wie viele Einträge schon vorhanden sind:

PHP:
//$tipp = ist die Variable die beim Abgeben übersendet wird
$a = (mysql_fetch_row(mysql_query("select count(*) from DEINETABELLE where TIPP='$tipp'"))) or die(mysql_error());
if ($a[0] == 3) {
//Header senden, oder Fehler Direkt posten
//Header
header("LOCATION: www.deinedomain.de/script.php?error=tippspiel");
//Wenn eine Ausgabe bereits getätigt wurde
//$tipp ist die Variable die beim Abgeben übersendet wird
echo 'Leider können zu diesen Ergebnis <b>( $tipp )</b> nur drei Tipps gepeichert werden. ';
}

Wenn das Limit erreicht ist, abbrechen und Fehler senden!


So im Groben!
 

Robert.Moss

Cadet 3rd Year
Ersteller dieses Themas
Dabei seit
Juni 2002
Beiträge
55
O.K. das bedeutet aber das der Benutzer die Tipps erst abspeichern muss und dann eine Fehlermeldung kommt, oder?

Wäre auch eine Abfrage direkt bei der Eingabe möglich? Sprich Benutzer gibt seine Tipps ein und per AJAX (oder wie auch immer) wird das Formular überprüft?

Stelle mir das konkret so vor:

Benutzer gibt Tipp für Spiel 1 ein, es erscheint ein O.K. Symbol, Benutzer gibt in der zweiten Zeile den nächsten Tipp ein und es erscheint wieder das O.K.
Das ganze immer so weiter, es sei denn er hat schon 3 x den Tipp 2:1 eingegeben, dann sollte eine Fehlersymbol erscheinen und der Benutzer wäre gezwungen einen anderen Tipp zu wählen.

Ist das machbar?
 
M

Mr. Snoot

Gast
Hier mal ein ganz simples Script, was dir bei Eingabe in ein Eingabefeld (form.php; bzw. hier beim Verlassen des Feldes) eine Rückgabe anzeigt (durch check.php).

In check.php kannst du dann eine DB-Abfrage einbauen, die das Ergebnis prüft, und ein Bild o.ä. via Echo zurückgeben.


P.S. Script ggf. noch gegen Angreifer absichern.
 

Anhänge

  • Desktop.rar
    1,8 KB · Aufrufe: 93
Zuletzt bearbeitet:

Robert.Moss

Cadet 3rd Year
Ersteller dieses Themas
Dabei seit
Juni 2002
Beiträge
55
Danke, schaue ich mir heute Abend noch an, muss jetzt erst noch arbeiten.

Robert
Ergänzung ()

So, doch noch schnell rüber geschaut.

Problem was mir auffällt ist das die Tipps immer als gesamter Wert überprüft werden. Im Tippspiel sind es aber einzelne Felder die in die DB eingetragen werden.

Ich hänge das Formular mal kurz an. Vielleicht steigt da ja jemand durch...
 

Anhänge

  • tipp.zip
    3,5 KB · Aufrufe: 112
M

Mr. Snoot

Gast
Steht dir ja frei das an deine Bedürfnisse anzupassen :)

Du kannst ja ruhig zwei Felder machen und bei jedem Feld auch das jeweils andere prüfen. Und nur wenn in beide was eingegeben wurde kommt eine Rückgabe.
 

Robert.Moss

Cadet 3rd Year
Ersteller dieses Themas
Dabei seit
Juni 2002
Beiträge
55
Danke erst mal, ich hätte mich aber wahrscheinlich etwas genauer ausdrücken müssen:

Ich habe nicht wirklich den Plan von PHP geschweige den Javascript. HTML geht so, wenn ich mich in ein PHP Script einlesen, verstehe ich es einigermaßen, hier bräuchte ich aber richtig intensive Hilfe von euch.

Nicht das ihr mich jetzt falsch versteht, ich suche nicht nach einer komplett fertigen Lösung. Mit der jetzigen Antwort bin ich aber etwas überfordert. :(

Robert
 

mercsen

Lt. Commander
Dabei seit
Apr. 2010
Beiträge
1.641
Also gibt es 2 felder ?
z.b. ManschaftA und ManschaftB und dann steht in A 3 und in B 0 und gemient ist dann ein ergebnis von 3:0 ?
 

Robert.Moss

Cadet 3rd Year
Ersteller dieses Themas
Dabei seit
Juni 2002
Beiträge
55
Ja, genau.

Ich habe 9 Zeilen im Formular, jede Zeile steht für ein Spiel welches eine bestimmte ID hat. Pro Zeile gibt es dann 2 Eingabefelder (tip_home_SPIEL_ID und tip_away_SPIEL_ID).

Sichergestellt werden soll nun das die Kombination

"tip_home_SPIEL_ID" mit dem Wert 2

und

"tip_away_SPIEL_ID" mit dem Wert 1

nicht mehr als 3 mal im gesamten Formular eingetragen werden kann.
 

heldiX

Newbie
Dabei seit
Apr. 2011
Beiträge
7
Sers,

hab mal sehr zielgerichtet auf deine Variablen, Namensgebung und Vorgaben hin eine Funktion zusammengetippt, die prüft, ob jemand zu viel getippt hat.


PHP:
<?php
  // Hier gebe ich einfach ein paar Zahlen schon vor um das Skript kurz zu testen
  // Simuliere hier 4x2:1 2x1:3 2x3:1 1x 1:4
  $_POST["tip_home_SPIEL_1"] = "2";
  $_POST["tip_away_SPIEL_1"] = "1";
  $_POST["tip_home_SPIEL_2"] = "2";
  $_POST["tip_away_SPIEL_2"] = "1";
  $_POST["tip_home_SPIEL_3"] = "2";
  $_POST["tip_away_SPIEL_3"] = "1";
  $_POST["tip_home_SPIEL_4"] = "2";
  $_POST["tip_away_SPIEL_4"] = "1";
  $_POST["tip_home_SPIEL_5"] = "3";
  $_POST["tip_away_SPIEL_5"] = "1";
  $_POST["tip_home_SPIEL_6"] = "3";
  $_POST["tip_away_SPIEL_6"] = "1";
  $_POST["tip_home_SPIEL_7"] = "1";
  $_POST["tip_away_SPIEL_7"] = "3";
  $_POST["tip_home_SPIEL_8"] = "1";
  $_POST["tip_away_SPIEL_8"] = "3";
  $_POST["tip_home_SPIEL_9"] = "1";
  $_POST["tip_away_SPIEL_9"] = "4";
  
  function checkTipVerstoss()
  {
    
    // Hier sind die Vorgaben abgelegt, die nachher überprüft werden sollen. 2:1 darf max. 3 mal, 3:1 max 3 mal. etc auftreten
    $vorgabe = array(
      "2:1" => 3,
      "3:1" => 3,
      "4:1" => 3,
      "1:1" => 3);
      
    $tips = array();
    
    // Datenfelder tip_home_SPIEL_1 bis 9, gleiches für _away_
    for ($i = 1; $i < 10; $i++)
    {

      // Hier die Werte einlesen
      $tipHome = $_POST["tip_home_SPIEL_$i"];
      $tipAway = $_POST["tip_away_SPIEL_$i"];
      // Checken, ob es sich bei den beiden Eingaben überhaupt um Zahlen handelt
      if ((intval($tipHome)) and (intval($tipAway)))
      {

        $tip = $tipHome.":".$tipAway;
        // Wenn der Tip noch nicht existiert, das Feld anlegen und auf 1 setzen.
        if (!isset($tips[$tip]))
        {
          $tips[$tip] = 1;
        }
        else
        {
        // Wenn der Tip schon existiert, den Counter um 1 hochsetzen.
          $tips[$tip]++;
        }
        // Die folgenden Zeilen sorgen dafür, dass z.b. ein 1:2 genauso zählt wie 2:1. Wenn nicht gewünscht löschen.
        $tip = $tipAway.":".$tipHome;
        if (!isset($tips[$tip]))
        {
          $tips[$tip] = 1;
        }
        else
        {
          $tips[$tip]++;
        }
      }
    } 
    
    // Nun alle Vorgaben durchgehen und dann im $tips Array nachsehen, ob und wie viel die einzelnen Tips getippt wurden. Wenn > max wird eine Ausgabe ausgegeben und die Fehlervariable auf "wahr" gesetzt.
    
    $keinFehler = true;
    foreach ($vorgabe as $key => $indi)
    {
      if (isset($tips[$key]))
      {
        $anz = $tips[$key];
        if ($anz > $indi)
        {
          // Fehler ausgabe oder nicht?
          echo "Es wurde zu oft $key getippt! Erlaubt sind maximal $indi Tips, getippt wurden $anz mal!<br />";
          $keinFehler = false;
        }
      }
    }
    
    // Funktion meldet zurück ob wo zu oft getippt wurde oder nicht.
    return $keinFehler;
  }
   
?>


<?php

  if (checkTipVerstoss())
  {
    // Ablegen in Datenbank etc.
  }
  else
  {
    echo "Bitte korrigieren Sie Ihre Tips anhand obiger Fehlermeldungen.<br />Ihr Tip wurde nicht gespeichert!<br />";
  }
?>

Gibt dann halt dementsprechende Ausgabe:
Code:
Es wurde zu oft 2:1 getippt! Erlaubt sind maximal 3 Tips, getippt wurden 4 mal!
Es wurde zu oft 3:1 getippt! Erlaubt sind maximal 3 Tips, getippt wurden 4 mal!
Bitte überprüfen Sie Ihre Angaben anhand der oben ausgegebenen Fehlermeldungen!

Kannst dich ja mal melden, obs zur Anwendung kommt.

Lg,
heldiX
 
Zuletzt bearbeitet:

Robert.Moss

Cadet 3rd Year
Ersteller dieses Themas
Dabei seit
Juni 2002
Beiträge
55
Danke, werde ich heute Abend gleich mal einbauen und testen, bin aber erst gegen 23:30 wieder da.
 

heldiX

Newbie
Dabei seit
Apr. 2011
Beiträge
7
Nachtrag:

Ich hatte angenommen, deine input-Felder hätten folgende Namensgebung

tip_home_SPIEL_x (x= Zahl 1-9)

Sie haben jedoch tip_home_x (x=Zahl)

Dementsprechend wäre der Code dann:
PHP:
<?php
  
  function checkTipVerstoss()
  {
    
    // Hier sind die Vorgaben abgelegt, die nachher überprüft werden sollen. 2:1 darf max. 3 mal, 3:1 max 3 mal. etc auftreten
    $vorgabe = array(
      "2:1" => 3,
      "3:1" => 3,
      "4:1" => 3,
      "1:1" => 3);
      
    $tips = array();
    
    // Datenfelder tip_home_SPIEL_1 bis 9, gleiches für _away_
    for ($i = 1; $i < 10; $i++)
    {

      // Hier die Werte einlesen
      $tipHome = $_POST["tip_home_$i"];
      $tipAway = $_POST["tip_away_$i"];
      // Checken, ob es sich bei den beiden Eingaben überhaupt um Zahlen handelt
      if ((intval($tipHome)) and (intval($tipAway)))
      {

        $tip = $tipHome.":".$tipAway;
        // Wenn der Tip noch nicht existiert, das Feld anlegen und auf 1 setzen.
        if (!isset($tips[$tip]))
        {
          $tips[$tip] = 1;
        }
        else
        {
        // Wenn der Tip schon existiert, den Counter um 1 hochsetzen.
          $tips[$tip]++;
        }
        // Die folgenden Zeilen sorgen dafür, dass z.b. ein 1:2 genauso zählt wie 2:1. Wenn nicht gewünscht löschen.
        $tip = $tipAway.":".$tipHome;
        if (!isset($tips[$tip]))
        {
          $tips[$tip] = 1;
        }
        else
        {
          $tips[$tip]++;
        }
      }
    } 
    
    // Nun alle Vorgaben durchgehen und dann im $tips Array nachsehen, ob und wie viel die einzelnen Tips getippt wurden. Wenn > max wird eine Ausgabe ausgegeben und die Fehlervariable auf "wahr" gesetzt.
    
    $keinFehler = true;
    foreach ($vorgabe as $key => $indi)
    {
      if (isset($tips[$key]))
      {
        $anz = $tips[$key];
        if ($anz > $indi)
        {
          // Fehler ausgabe oder nicht?
          echo "Es wurde zu oft $key getippt! Erlaubt sind maximal $indi Tips, getippt wurden $anz mal!<br />";
          $keinFehler = false;
        }
      }
    }
    
    // Funktion meldet zurück ob wo zu oft getippt wurde oder nicht.
    return $keinFehler;
  }
   
?>


<?php

  if (checkTipVerstoss())
  {
    // Ablegen in Datenbank etc.
  }
  else
  {
    echo "Bitte korrigieren Sie Ihre Tips anhand obiger Fehlermeldungen.<br />Ihr Tip wurde nicht gespeichert!<br />";
  }
?>

Kannst mich auch gerne per PM Fragen, wenn du z.B. Hilfe brauchst, das einzubauen.

Lg,
heldiX
 
Zuletzt bearbeitet:

Robert.Moss

Cadet 3rd Year
Ersteller dieses Themas
Dabei seit
Juni 2002
Beiträge
55
So ganz haut das noch nicht hin.

Die input Felder haben auch den Wert tip_home_ID und tip_away_ID. Wobei die ID die Spiel ID ist und nicht nur von 1-9 geht.
Die ID ist also fortlaufend, momentan sind wir bei 1600, wir spielen ja schon ein paar Jährchen.

Gebe ich in Deinem Script eine aktuell gültige ID ein und setze die Anzahl der möglichen 2:1 Tipps auf 1, funktioniert es auch. Aber logischerweise nur in dem einen Feld.
 

heldiX

Newbie
Dabei seit
Apr. 2011
Beiträge
7
Morgen,

ok jetzt wirds langsam.

Kannst du mir mal eine Ausgabe von

var_dump($_POST);

zukommen lassen?

Damit ich genau seh, wie die Namensgebung der input felder ist.

Lg,
heldiX
 

Robert.Moss

Cadet 3rd Year
Ersteller dieses Themas
Dabei seit
Juni 2002
Beiträge
55
Klar, kein Problem.

Folgende Tipps habe ich testweise für den 31. Spieltag eingegeben:

SC Freiburg - Hannover 96 2:1
Eintracht Frankfurt - FC Bayern München 3:2
FC St. Pauli - Werder Bremen 2:2
VfB Stuttgart - Hamburger SV 3:0
Bayer 04 Leverkusen - 1899 Hoffenheim 1:0
FC Schalke 04 - 1. FC Kaiserslautern 2:1
Borussia Mönchengladbach - Borussia Dortmund 3:0
VfL Wolfsburg - 1. FC Köln 0:3
1. FC Nürnberg - 1. FSV Mainz 05 3:3

im POST habe ich dann folgendes:

Code:
array(33) { ["p"]=> string(1) "7" ["r"]=> string(2) "31" ["user_id"]=> string(2) "62" ["cids"]=> array(9) { [0]=> string(4) "1602" [1]=> string(4) "1595" [2]=> string(4) "1596" [3]=> string(4) "1598" [4]=> string(4) "1600" [5]=> string(4) "1603" [6]=> string(4) "1597" [7]=> string(4) "1601" [8]=> string(4) "1599" } ["id_1602"]=> string(0) "" ["tip_home_1602"]=> string(1) "2" ["tip_away_1602"]=> string(1) "1" ["id_1595"]=> string(0) "" ["tip_home_1595"]=> string(1) "3" ["tip_away_1595"]=> string(1) "2" ["id_1596"]=> string(0) "" ["tip_home_1596"]=> string(1) "2" ["tip_away_1596"]=> string(1) "2" ["id_1598"]=> string(0) "" ["tip_home_1598"]=> string(1) "3" ["tip_away_1598"]=> string(1) "0" ["id_1600"]=> string(0) "" ["tip_home_1600"]=> string(1) "1" ["tip_away_1600"]=> string(1) "0" ["id_1603"]=> string(0) "" ["tip_home_1603"]=> string(1) "2" ["tip_away_1603"]=> string(1) "1" ["id_1597"]=> string(0) "" ["tip_home_1597"]=> string(1) "3" ["tip_away_1597"]=> string(1) "0" ["id_1601"]=> string(0) "" ["tip_home_1601"]=> string(1) "0" ["tip_away_1601"]=> string(1) "3" ["id_1599"]=> string(0) "" ["tip_home_1599"]=> string(1) "3" ["tip_away_1599"]=> string(1) "3" ["joker"]=> string(7) "nojoker" ["saveTips"]=> string(10) "speichern " }
 

heldiX

Newbie
Dabei seit
Apr. 2011
Beiträge
7
Ok habs kurz umgesetzt und getestet.

Fertiger Code:

PHP:
<?php
  // Hier gebe ich einfach ein paar Tips vor um das Skript kurz zu testen
  $_POST["cids"] =array(0 => "1602", 1 => "1595", 2 => "1596", 3 => "1598", 4 => "1600", 5 => "1603", 6 => "1597", 7 => "1601", 8 => "1599");
  $_POST["tip_home_1602"] ="2";
  $_POST["tip_away_1602"] ="1"; 

  $_POST["tip_home_1595"] ="2"; 
  $_POST["tip_away_1595"] ="1"; 

  $_POST["tip_home_1596"] ="1"; 
  $_POST["tip_away_1596"] ="2"; 
 
  $_POST["tip_home_1598"] ="1"; 
  $_POST["tip_away_1598"] ="2"; 

  $_POST["tip_home_1600"] ="1"; 
  $_POST["tip_away_1600"] ="0"; 

  $_POST["tip_home_1603"] ="2"; 
  $_POST["tip_away_1603"] ="1"; 

  $_POST["tip_home_1597"] ="3"; 
  $_POST["tip_away_1597"] ="0"; 

  $_POST["tip_home_1601"] ="0"; 
  $_POST["tip_away_1601"] ="3"; 

  $_POST["tip_home_1599"] ="3"; 
  $_POST["tip_away_1599"] ="3"; 
  
  function checkTipVerstoss()
  {
    
    // Hier sind die Vorgaben abgelegt, die nachher überprüft werden sollen. 2:1 darf max. 3 mal, 3:1 max 3 mal. etc auftreten
    $vorgabe = array(
      "2:1" => 3,
      "3:1" => 3,
      "4:1" => 3,
      "1:1" => 3);
      
    $tips = array();
    
    // In dem Array $_POST["cids"] stecken alle IDs der getippten Spiele
    // Einmal array_unique drüberlaufen lassen, damit keine ID doppelt vorkommt und Tips doppelt gezählt würden
    $_POST["cids"] = array_unique($_POST["cids"]);
    foreach ($_POST["cids"] as $spielId)
    {
      // Hier die Werte einlesen
      $tipHome = intval($_POST["tip_home_$spielId"]);
      $tipAway = intval($_POST["tip_away_$spielId"]);
      
      // Checken, ob es sich bei den beiden Eingaben überhaupt um Zahlen handelt
      if (($tipHome) and ($tipAway))
      {
        // Jetzt den jeweiligen Tip in die Sammlung hinzufügen
        $tip = $tipHome.":".$tipAway;
        // Wenn der Tip noch nicht existiert, das Feld anlegen und auf 1 setzen.
        if (!isset($tips[$tip]))
        {
          $tips[$tip] = 1;
        }
        else
        {
        // Wenn der Tip schon existiert, den Counter um 1 hochsetzen.
          $tips[$tip]++;
        }
        // Die folgenden Zeilen sorgen dafür, dass z.b. ein 1:2 genauso zählt wie 2:1. Wenn nicht gewünscht löschen.
        $tip = $tipAway.":".$tipHome;
        if (!isset($tips[$tip]))
        {
          $tips[$tip] = 1;
        }
        else
        {
          $tips[$tip]++;
        }
      }
    } 
    
    // Nun alle Vorgaben durchgehen und dann im $tips Array nachsehen, ob und wie viel die einzelnen Tips getippt wurden. Wenn > max wird eine Ausgabe ausgegeben und die Fehlervariable auf "wahr" gesetzt.
    
    $keinFehler = true;
    foreach ($vorgabe as $key => $indi)
    {
      if (isset($tips[$key]))
      {
        $anz = $tips[$key];
        if ($anz > $indi)
        {
          // Fehler ausgabe oder nicht?
          echo "Es wurde zu oft $key getippt! Erlaubt sind maximal $indi Tips, getippt wurden $anz mal!<br />";
          $keinFehler = false;
        }
      }
    }
    
    // Funktion meldet zurück ob wo zu oft getippt wurde oder nicht.
    return $keinFehler;
  }
   
?>


<?php

  if (checkTipVerstoss())
  {
    // Ablegen in Datenbank etc.
  }
  else
  {
    echo "Bitte korrigieren Sie Ihre Tips anhand obiger Fehlermeldungen.<br />Ihr Tip wurde nicht gespeichert!<br />";
  }
?>

Aktuell sind halt die Vorgaben max 3x 1:1 2:1 3:1 (und umgedreht also 1:2 und 2:1 zählen gleich) eingestellt.
Ist denke ich selbsterklärend wie du die Vorgaben änderst.

Lg,
heldiX
 

Kju

Cadet 4th Year
Dabei seit
Nov. 2001
Beiträge
74
Hallo,

nur ein kleiner Hinweis:
Ergebnisse zu Null können so nicht gefilter werden.
Die Funktion "intval" liefert auf jeden Fall einen Integer zurück. Aber "0" ist für das if ein false, somit wird die Abfrage immer fehlschlagen.

PHP:
// Hier die Werte einlesen 
$tipHome = intval($_POST["tip_home_$spielId"]); 
$tipAway = intval($_POST["tip_away_$spielId"]); 
       
// Checken, ob es sich bei den beiden Eingaben überhaupt um Zahlen handelt 
if (($tipHome) and ($tipAway)) {
Ich denke mal, dass es an dieser Stelle eher darum geht, zu überprüfen, dass nicht jemand -5:-1 getippt hat.
PHP:
if ($tipHome >= 0 && $tipAway >= 0) {
Hier komplett:
PHP:
<?php
  // Hier gebe ich einfach ein paar Tipps vor um das Skript kurz zu testen
  $_POST["cids"] =array("1602", "1595", "1596", "1598", "1600", "1603", "1597", "1601", "1599", 1799, 1899, 1999);
  $_POST["tip_home_1602"] ="2";
  $_POST["tip_away_1602"] ="1"; 

  $_POST["tip_home_1595"] ="2"; 
  $_POST["tip_away_1595"] ="1"; 

  $_POST["tip_home_1596"] ="1"; 
  $_POST["tip_away_1596"] ="2"; 
 
  $_POST["tip_home_1598"] ="1"; 
  $_POST["tip_away_1598"] ="2"; 

  $_POST["tip_home_1600"] ="1"; 
  $_POST["tip_away_1600"] ="0"; 

  $_POST["tip_home_1603"] ="2"; 
  $_POST["tip_away_1603"] ="1"; 

  $_POST["tip_home_1597"] ="3"; 
  $_POST["tip_away_1597"] ="0"; 

  $_POST["tip_home_1601"] ="0"; 
  $_POST["tip_away_1601"] ="3"; 

  $_POST["tip_home_1599"] ="3"; 
  $_POST["tip_away_1599"] ="3"; 
  
  $_POST["tip_home_1799"] ="3"; 
  $_POST["tip_away_1799"] ="0"; 
  
  $_POST["tip_home_1899"] ="3"; 
  $_POST["tip_away_1899"] ="0"; 
  
  $_POST["tip_home_1999"] ="3"; 
  $_POST["tip_away_1999"] ="0"; 
  
  
  function checkTipVerstoss()
  {
    
    // Hier sind die Vorgaben abgelegt, die nachher überprüft werden sollen. 2:1 darf max. 3 mal, 3:1 max 3 mal. etc auftreten
    $vorgabe = array(
      "2:1" => 3,
      "3:1" => 3,
      "4:1" => 3,
      "1:1" => 3,
      "3:0" => 3,
    );
      
    $tips = array();
    
    // In dem Array $_POST["cids"] stecken alle IDs der getippten Spiele
    // Einmal array_unique drüberlaufen lassen, damit keine ID doppelt vorkommt und Tipps doppelt gezählt würden
    $_POST["cids"] = array_unique($_POST["cids"]);
    foreach ($_POST["cids"] as $spielId)
    {
      // Hier die Werte einlesen
      $tipHome = intval($_POST["tip_home_$spielId"]);
      $tipAway = intval($_POST["tip_away_$spielId"]);
      
      // Checken, ob es sich bei den beiden Eingaben überhaupt um Zahlen handelt
      if ($tipHome >= 0 && $tipAway >= 0)
      {
        // Jetzt den jeweiligen Tipp in die Sammlung hinzufügen
        $tip = $tipHome.":".$tipAway;
        // Wenn der Tipp noch nicht existiert, das Feld anlegen und auf 1 setzen.
        if (!isset($tips[$tip]))
        {
          $tips[$tip] = 1;
        }
        else
        {
        // Wenn der Tipp schon existiert, den Counter um 1 hochsetzen.
          $tips[$tip]++;
        }
        // Die folgenden Zeilen sorgen dafür, dass z.b. ein 1:2 genauso zählt wie 2:1. Wenn nicht gewünscht löschen.
        $tip = $tipAway.":".$tipHome;
        if (!isset($tips[$tip]))
        {
          $tips[$tip] = 1;
        }
        else
        {
          $tips[$tip]++;
        }
      }
    } 

    // Nun alle Vorgaben durchgehen und dann im $tips Array nachsehen, ob und wie viel die einzelnen Tipps getippt wurden. Wenn > max wird eine Ausgabe ausgegeben und die Fehlervariable auf "wahr" gesetzt.
    
    $keinFehler = true;
    foreach ($vorgabe as $key => $indi)
    {
      if (isset($tips[$key]))
      {
        $anz = $tips[$key];
        if ($anz > $indi)
        {
          // Fehler ausgabe oder nicht?
          echo "Es wurde zu oft $key getippt! Erlaubt sind maximal $indi Tipps, getippt wurden $anz mal!<br />";
          $keinFehler = false;
        }
      }
    }
    
    // Funktion meldet zurück ob wo zu oft getippt wurde oder nicht.
    return $keinFehler;
  }
   
?>


<?php

  if (checkTipVerstoss())
  {
    // Ablegen in Datenbank etc.
  }
  else
  {
    echo "Bitte korrigieren Sie Ihre Tipps anhand obiger Fehlermeldungen.<br />Ihr Tipp wurde nicht gespeichert!<br />";
  }
 

Robert.Moss

Cadet 3rd Year
Ersteller dieses Themas
Dabei seit
Juni 2002
Beiträge
55
Grandios! Das funktioniert wie Gift...

Herzlichen Dank an euch Beiden.

2 Kleine Probleme habe ich aber noch:

1. Beim speichern der Tipps bekomme ich nun immer PHP Notices: "Notice: Undefined index: id_1600 in /www/htdocs/---/www.---.de/administrator/components/com_joomleague/classes/TipResult.class.php on line 117"

2. Wie kann ich die Variablen aus der Funktion im weiteren Verlauf nutzen? Habe es jetzt so eingebaut, das nach dem Speichern eine Erfolgsmeldung ausgegeben wird und wenn das Speichern nicht erfolgreich war, eine Fehlermeldung kommt.

Die Erfolgsmeldung/Fehlermeldung wird über dem Formular per echo $fehlermeldung ausgegeben. Die Variable $fehlermeldung lasse ich bei "checkTipVerstoss" füllen.

Nochmals Danke, Danke, Danke!
Ergänzung ()

die PHP Meldung kommt nur, wenn man bei einem Spiel nichts eingetragen hat. Das kann aber durchaus mal vorkommen, wir haben ein paar Spieler die z.B. das Freitagsspiel tippen und erst am Samstag die anderen.
 
Zuletzt bearbeitet:

heldiX

Newbie
Dabei seit
Apr. 2011
Beiträge
7
Danke an Kju, man lernt immer gerne dazu :)

E_Notices sind keine schwerwiegenden Fehler. In dem Fall will er in der Funktion ja alle Inhalte des "cids"-Array durchgehen. Die Notice teilt mit, dass kein Element im Array ist.

Mit der u.g. Lösung sollte keine E_NOTICE mehr ausgegeben werden, da er kurz prüft, ob Elemente in CIDS stecken, oder nicht. Wenn nicht, wird die Funktion direkt als "true" beendet, da ja auch kein Tipfehler aufgetreten ist. Zumindest keine zuviel getippen Spiele.

PHP:
// In dem Array $_POST["cids"] stecken alle IDs der getippten Spiele
    // Einmal array_unique drüberlaufen lassen, damit keine ID doppelt vorkommt und Tipps doppelt gezählt würden
    if (!is_array($_POST["cids"]))
    {
      return true;
    }
    $_POST["cids"] = array_unique($_POST["cids"]);
    foreach ($_POST["cids"] as $spielId)

Wenn du Variablen aus der Funktion im weiteren Verlauf nutzen willst, musst die die entsprechenden Variablen als GLOBAL definieren, sonst gelten sie nur innerhalb der Funktion.

PHP:
function checkTipVerstoss()
  {
    global $vorgabe; // Beispiel
    // Hier sind die Vorgaben abgelegt, die nachher überprüft werden sollen. 2:1 darf max. 3 mal, 3:1 max 3 mal. etc auftreten
    $vorgabe = array(
      "2:1" => 3,
      "3:1" => 3,
      "4:1" => 3,
      "1:1" => 3);

Du wirst wissen, dass aber $_POST["cids"] etc. generell schon global und von überall aufrufbar ist.

Probier mal noch aus, ob dein Tipscript auch funktioniert, wenn jemand nur einen Tip abgibt. Weiß nicht, wie das technisch von dem Tipscript umgesetzt ist, ob $_POST["cids"] dann weiter ein Array ist mit einem Element, oder kein Array sondern nur eine Variable mit der einen ID.
Dann müsste man da noch eine 3 zeilige Weiche vorschalten, wenn jemand nur 1 Tip abgegeben hat.

Lg,
heldiX
 

Robert.Moss

Cadet 3rd Year
Ersteller dieses Themas
Dabei seit
Juni 2002
Beiträge
55
Oh Mann, auf global hätte ich auch selber kommen können, sorry!

Die Notices habe ich immer noch, sie verweisen auch auf eine andere Datei. Der bemängelte Bereich sieht so aus:

Code:
			if ($post["id_$match_id"]!="") {
				$query = sprintf("DELETE FROM %s WHERE (id=%s)", $this->_tbl, $post["id_$match_id"]);
	            $this->_db->setQuery($query);
                $this->_db->query();
                $query = sprintf( "DELETE FROM #__joomleague_predictiongame_points WHERE tipp_id=%s",$post["id_$match_id"]);
	            $this->_db->setQuery($query);
                $this->_db->query();
			}

Hier werden Tipps wieder gelöscht, wenn man die Fehler leer lässt bzw. die bereits abgegebenen Tipps wieder entfernt.

Ein einzelner Tipp ist übrigens möglich.
 
Top