PHP confusion

Hi, I’m not a developer and have rudimentary knowledge of PHP/SQL. I was hoping there was a simple solution to this problem that someone might be able to help with…

On this page: http://phillipvanrooyen.com/ava-table/content/players_13.php

Notice the top name shows he played “4” in the “#played '15” column. However, click on his name “Franklin” and you’ll see on the next page it shows correctly that he actually played “6” (if you add up all the rows under '15)… that’s correct.

The first page showing “4” is incorrect. The PHP code is “selecting” either a date range or amount of events… and displaying that on the first page. I’m confused as to what the code is selecting here…

Any idea how to fix it that the first page actually shows:

  1. The correct amount of “played” events… in this case “6” not “4”
  2. Update the “Points '15” Column accordingly alos on the first page (players_13.php).

Any help is much appreciated… Looks like there’s these files at play here…

players.code.php looks like this…

[php]

<?php //------------------------------------------------------------------ // File: players.code.php // Author: // Date Created: 2010-03-25 // // players.php codebehind //------------------------------------------------------------------ require_once('dataAccess.php'); require_once('utility.php'); require_once('../classes/Player.class.php'); require_once('../classes/Event.class.php'); $abbreviatedSeason = "'15"; $abbreviatedYear = sprintf('%s%d', "'",date("y")); $ratingsChartLink = "?"; function GetFirstNameSelected() { return $_POST['firstName']; } function GetLastNameSelected() { return $_POST['lastName']; } function GetRatingSelected() { return $_POST['ratingsDropDownList']; } function GetGenderSelected() { if (isset($_POST['gendersDropDownList'])) return $_POST['gendersDropDownList']; else return 1; } // Create HTML options for ratings (retain selection) function GetRatingDropDownOptions() { $array = GetRatings(); foreach($array as $key => $value) { $selectedText = ($key == GetRatingSelected() ? " selected=\"selected\"" : ""); echo "$value"; } } // Create HTML options for gender (retain selection) function GetGenderDropDownOptions() { $array = GetPlayerGender(); foreach($array as $key => $value) { $selectedText = ($key == GetGenderSelected() ? " selected=\"selected\"" : ""); echo "$value"; } } // Create HTML table rows for players (based on filters) function GetPlayerTableRows() { $playerPreviewCollection = Player::GetPlayerPreviews(); $i = 0; foreach($playerPreviewCollection as $key => $value) { $playerId = $playerPreviewCollection[$key]->GetPlayerId(); $firstName = $playerPreviewCollection[$key]->GetFirstName(); $lastName = $playerPreviewCollection[$key]->GetLastName(); $name = $playerPreviewCollection[$key]->GetFullName(); $ratingName = $playerPreviewCollection[$key]->GetCurrentRatingName(); $played = $playerPreviewCollection[$key]->GetCurrentPlayed(); $points = $playerPreviewCollection[$key]->GetCurrentPoints(); $rating = $playerPreviewCollection[$key]->GetCurrentRating(); $genderId = $playerPreviewCollection[$key]->GetGenderId(); if ((GetRatingSelected() == 0 || GetRatingSelected() == $rating) && (GetGenderSelected() == 0 || GetGenderSelected() == $genderId) && (GetFirstNameSelected() == NULL || strcasecmp(GetFirstNameSelected(), $firstName) == 0) && (GetLastNameSelected() == NULL || strcasecmp(GetLastNameSelected(), $lastName) == 0)) { $playerLink = "$name"; // Alternate rows have unique css class "alternate" $cssRow = ($i & 1 ? "alternate" : ""); echo ""; echo "$playerLink"; echo "$points"; echo "$played"; echo "$ratingName"; echo ""; $i++; } } } ?>

[/php]

Any thoughts…?

The first page: players_13.php references this in the head…

[php]

<?php require_once('../lib/players.code.php'); ?>

[/php]

Then in the same file lower down references this to create the table…

[php]

<?php GetPlayerTableRows(); ?> [/php]

How this is retreiving the information could be handled a number of ways.

What does the Payer class look like? Specifically, this method, GetCurrentPlayed()?

If it is a database query, which it should be, what column does it count?

This is the Players.class.php …

[php]

<?php //------------------------------------------------------------------ // File: Player.class.php // Author: // Date Created: 2010-03-25 // // Player Management //------------------------------------------------------------------ // Lightweight Object representing player name & id. class PlayerBaseData { private $playerId; private $firstName; private $lastName; protected function setPlayerId($playerId) { $this->playerId = $playerId; } public function GetPlayerId() { return $this->playerId; } protected function setFirstName($firstName) { $this->firstName = $firstName; } public function GetFirstName() { return $this->firstName; } protected function setLastName($lastName) { $this->lastName = $lastName; } public function GetLastName() { return $this->lastName; } public function GetFullName() { return sprintf('%s %s', $this->GetFirstName(), $this->GetLastName()); } } // Extends to include all values required to display player previews. class PlayerPreviewData extends PlayerBaseData { private $genderId; private $currentPlayed; private $currentPoints; private $currentRating; private $eventsPlayedCollection; // Array of events. protected function setGenderId($genderId) { $this->genderId = $genderId; } public function GetGenderId() { return $this->genderId; } protected function setCurrentPlayed($currentPlayed) { $this->currentPlayed = $currentPlayed; } public function GetCurrentPlayed() { return $this->currentPlayed; } protected function setCurrentPoints($currentPoints) { $this->currentPoints = $currentPoints; } public function GetCurrentPoints() { return $this->currentPoints; } protected function setCurrentRating($currentRating) { $this->currentRating = $currentRating; } public function GetCurrentRating() { return $this->currentRating; } public function GetCurrentRatingName() { $ratings = GetRatings(); return $ratings[$this->currentRating]; } } // Extends to inclue all remaining player data (Player Details). class PlayerData extends PlayerPreviewData { private $profilePicture; private $hometown; private $currentTown; private $height; private $localBeach; private $college; private $isAVAVolunteer; private $currentBestFinish; private $allTimePlayed; private $allTimePoints; private $allTimeRating; private $allTimeBestFinish; private $currentOpenWins; private $allTimeOpenWins; protected function setProfilePicture($profilePicture) { $this->profilePicture = $profilePicture; } public function GetProfilePicture() { return $this->profilePicture; } protected function setHometown($hometown) { $this->hometown = $hometown; } public function GetHometown() { return $this->hometown; } protected function setCurrentTown($currentTown) { $this->currentTown = $currentTown; } public function GetCurrentTown() { return $this->currentTown; } protected function setHeight($height) { $this->height = $height; } public function GetHeight() { return $this->height; } protected function setLocalBeach($localBeach) { $this->localBeach = $localBeach; } public function GetLocalBeach() { return $this->localBeach; } protected function setCollege($college) { $this->college = $college; } public function GetCollege() { return $this->college; } protected function setIsAVAVolunteer($isAVAVolunteer) { $this->isAVAVolunteer = $isAVAVolunteer; } public function GetIsAVAVolunteer() { return $this->isAVAVolunteer; } protected function setCurrentBestFinish($currentBestFinish) { $this->currentBestFinish = $currentBestFinish; } public function GetCurrentBestFinish() { return $this->currentBestFinish; } protected function setAllTimePlayed($allTimePlayed) { $this->allTimePlayed = $allTimePlayed; } public function GetAllTimePlayed() { return $this->allTimePlayed; } protected function setAllTimePoints($allTimePoints) { $this->allTimePoints = $allTimePoints; } public function GetAllTimePoints() { return $this->allTimePoints; } protected function setAllTimeRating($allTimeRating) { $this->allTimeRating = $allTimeRating; } public function GetAllTimeRating() { return $this->allTimeRating; } protected function setAllTimeBestFinish($allTimeBestFinish) { $this->allTimeBestFinish = $allTimeBestFinish; } public function GetAllTimeBestFinish() { return $this->allTimeBestFinish; } protected function setCurrentOpenWins($currentOpenWins) { $this->currentOpenWins = $currentOpenWins; } public function GetCurrentOpenWins() { return $this->currentOpenWins; } protected function setAllTimeOpenWins($allTimeOpenWins) { $this->allTimeOpenWins = $allTimeOpenWins; } public function GetAllTimeOpenWins() { return $this->allTimeOpenWins; } public function GetLocalBeachName() { $beachNames = GetBeaches(); return $beachNames[$this->localBeach]; } public function GetAllTimeRatingName() { $ratings = GetRatings(); return $ratings[$this->allTimeRating]; } public function GetCurrentBestFinishOrdinal() { return ConvertIntegerToOrdinal($this->currentBestFinish); } public function GetAllTimeBestFinishOrdinal() { return ConvertIntegerToOrdinal($this->allTimeBestFinish); } } // Core Player logic. class Player extends PlayerData { // Collection of all PlayerPreviewData public static function GetPlayerPreviews() { $playerPreviewCollection = array(); $query = "SELECT PlayerID, FirstName, LastName, GenderID, CurrentPlayed, CurrentPoints, "; //TODO: MAKE SQL CAP RATING AT 4. $query .= "(CASE WHEN Year(CurrentUnadjustedRatingDate) > (Year(CURDATE()) - 2) THEN CurrentUnadjustedRating "; $query .= " WHEN Year(CurrentUnadjustedRatingDate) > (Year(CURDATE()) - 3) THEN (CurrentUnadjustedRating + 1) "; $query .= " WHEN Year(CurrentUnadjustedRatingDate) > (Year(CURDATE()) - 4) THEN (CurrentUnadjustedRating + 2) "; $query .= " ELSE (CurrentUnadjustedRating + 3) "; $query .= "END) AS CurrentRating "; $query .= "FROM Players "; $query .= "ORDER BY CurrentRating ASC, CurrentPoints DESC, FirstName, LastName"; $result = GetQueryResult($query); while($row = mysqli_fetch_array($result)) { $pp = new PlayerPreviewData(); $pp->setPlayerId($row['PlayerID']); $pp->setFirstName($row['FirstName']); $pp->setLastName($row['LastName']); $pp->setGenderId($row['GenderID']); $pp->setCurrentPlayed($row['CurrentPlayed']); $pp->setCurrentPoints($row['CurrentPoints']); //$pp->setCurrentRating($row['CurrentRating']); //$currentUnadjustedRating = $row['CurrentUnadjustedRating']; //$currentUnadjustedRatingYear = $row['CurrentUnadjustedRatingYear']; //$currentRating = AdjustRatingBasedOnTime($row['CurrentUnadjustedRatingYear'], $row['CurrentUnadjustedRating']); $currentRating = $row['CurrentRating']; if ($currentRating > 4) $currentRating = 4; $pp->setCurrentRating($currentRating); $playerPreviewCollection[] = $pp; } return $playerPreviewCollection; } // Return base player object (teamate). public static function GetPlayerBaseData($playerId, $firstName, $lastName) { $pbd = new PlayerBaseData(); $pbd->setPlayerId($playerId); $pbd->setFirstName($firstName); $pbd->setLastName($lastName); return $pbd; } // Get All Player Data based on Player Id. public static function GetPlayerData($playerDataId) { $pd = new PlayerData(); $query = "SELECT PlayerID, FirstName, LastName, Hometown, CurrentTown, Height, Picture, College, "; $query .= "LocalBeach, IsAVAVolunteer, CurrentPlayed, CurrentPoints, "; //TODO: MAKE SQL CAP RATING AT 4. $query .= "(CASE WHEN Year(CurrentUnadjustedRatingDate) > (Year(CURDATE()) - 2) THEN CurrentUnadjustedRating "; $query .= " WHEN Year(CurrentUnadjustedRatingDate) > (Year(CURDATE()) - 3) THEN (CurrentUnadjustedRating + 1) "; $query .= " WHEN Year(CurrentUnadjustedRatingDate) > (Year(CURDATE()) - 4) THEN (CurrentUnadjustedRating + 2) "; $query .= " ELSE (CurrentUnadjustedRating + 3) "; $query .= "END) AS CurrentRating "; // $query .= "(CASE WHEN CurrentUnadjustedRatingDate > (Year(CURDATE()) - 2) THEN CurrentUnadjustedRating "; // $query .= " WHEN CurrentUnadjustedRatingDate > (Year(CURDATE()) - 3) THEN (CurrentUnadjustedRating + 1) "; // $query .= " WHEN CurrentUnadjustedRatingDate > (Year(CURDATE()) - 4) THEN (CurrentUnadjustedRating + 2) "; // $query .= " ELSE (CurrentUnadjustedRating + 3) "; // $query .= "END) AS CurrentRating "; //GET TotalEventsPlayed $query .= ", COUNT(ResultID) AS AllTimePlayed "; //GET TotalPoints $query .= ", NumberOfTeams, Result "; $query .= "FROM Players "; $query .= "INNER JOIN Teams USING (PlayerID) "; $query .= "INNER JOIN Results USING (TeamID) "; $query .= "INNER JOIN Events USING (EventID) "; $query .= "WHERE PlayerID = $playerDataId "; $result = GetQueryResult($query); while($row = mysqli_fetch_array($result)) { $pd->setPlayerId($row['PlayerID']); $pd->setFirstName($row['FirstName']); $pd->setLastName($row['LastName']); $pd->setHometown($row['Hometown']); $pd->setCurrentTown($row['CurrentTown']); $pd->setHeight($row['Height']); $pd->setProfilePicture($row['Picture']); $pd->setCollege($row['College']); $pd->setLocalBeach($row['LocalBeach']); $pd->setIsAVAVolunteer($row['IsAVAVolunteer']); $pd->setCurrentPlayed($row['CurrentPlayed']); $pd->setCurrentPoints($row['CurrentPoints']); //$pd->setCurrentRating($row['CurrentRating']); //$currentRating = AdjustRatingBasedOnTime($row['CurrentUnadjustedRatingYear'], $row['CurrentUnadjustedRating']); $currentRating = $row['CurrentRating']; if ($currentRating > 4) $currentRating = 4; $pd->setCurrentRating($currentRating); $pd->setAllTimePlayed($row['AllTimePlayed']); //$pd->setAllTimePoints($row['AllTimePoints']); //$pd->setAllTimeRating($currentRating); //$allTimeRating = CalculateRatingEarned($row['NumberOfTeams'], $row['Result']); // $pd->setAllTimeRating($allTimeRating); } $pd->eventsPlayedCollection = Player::GetEventsPlayedComplete($playerDataId); foreach($pd->eventsPlayedCollection as $key => $value) { $eventDate = $pd->eventsPlayedCollection[$key]->eventDate; $numberOfTeams = $pd->eventsPlayedCollection[$key]->numberOfTeams; $finish = $pd->eventsPlayedCollection[$key]->finish; $allTimePoints += $pd->eventsPlayedCollection[$key]->points; // Calculate Best Rating //$rating = CalculateRatingEarned($numberOfTeams, $finish); $genderId = $pd->eventsPlayedCollection[$key]->genderId; $divisionId = $pd->eventsPlayedCollection[$key]->divisionId; //$rating = CalculateRatingEarned($genderId, $divisionId, $numberOfTeams, $finish); $rating = CalculateRatingEarned($genderId, $divisionId, $numberOfTeams, $finish); if ($allTimeRating == 0) $allTimeRating = $rating; elseif ($rating < $allTimeRating) $allTimeRating = $rating; // Calculate Best Finish if (IsDateInCurrentSeason($eventDate)) { if ($currentBestFinish == 0) { $currentBestFinish = $finish; } elseif ($finish < $currentBestFinish) { $currentBestFinish = $finish; } } if ($allTimeBestFinish == 0) { $allTimeBestFinish = $finish; } elseif ($finish < $allTimeBestFinish) { $allTimeBestFinish = $finish; } // Calculate Number of Open Wins. if(IsDateInCurrentSeason($eventDate)) { if ($finish == 1) $currentOpenWins++; } if ($finish == 1) $allTimeOpenWins++; } $pd->setAllTimePoints($allTimePoints); $pd->setAllTimeRating($allTimeRating); $pd->setCurrentBestFinish($currentBestFinish); $pd->setAllTimeBestFinish($allTimeBestFinish); $pd->setCurrentOpenWins($currentOpenWins); $pd->setAllTimeOpenWins($allTimeOpenWins); return $pd; } // // Get Collection of all played events. // private static function GetEventsPlayed($playerId) // { // $eventsPlayedCollection = array(); // // $query = "SELECT StartDate, Result, NumberOfTeams FROM Players "; // $query .= "INNER JOIN Teams T USING (PlayerID) "; // $query .= "INNER JOIN Results R USING (TeamID) "; // $query .= "INNER JOIN Events E USING (EventID) "; // $query .= "INNER JOIN Divisions D USING (DivisionID) "; // $query .= "INNER JOIN Tournaments TOUR USING (TournamentID) "; // $query .= "WHERE P.PlayerID = $playerId"; // $result = GetQueryResult($query); // // while($row = mysqli_fetch_array($result)) // { // $eventDate = $row['StartDate']; // $results = $row['Result']; // $numberOfTeams = $row['NumberOfTeams']; // //$points = CalculatePoints($numberOfTeams, $results); ////$points = CalculatePoints($numberOfTeams); // $event = PlayerEvent::GetPlayerEvent($eventDate, $results, $points, $numberOfTeams); // $eventsPlayedCollection[] = $event; // } // // return $eventsPlayedCollection; // } // Get Collection of all played events. private function GetEventsPlayedComplete($playerId) { $eventsPlayedCompleteCollection = array(); //$result = GetEventsPlayed($playerId); //$query = "SELECT * FROM Players P "; //$query = "SELECT TOUR.StartDate, R.Result, E.NumberOfTeams, E.DivisionID, E.GenderID, E.EventID, D.Division, T.TeamID, Tour.TournamentID "; $query = "SELECT PlayerID, TOUR.StartDate, E.StartDate, Result, NumberOfTeams, DivisionID, E.GenderID, EventID, Division, TeamID, Year(E.StartDate) AS Year "; $query .= "FROM Players P "; $query .= "INNER JOIN Teams T USING (PlayerID) "; $query .= "INNER JOIN Results R USING (TeamID) "; $query .= "INNER JOIN Events E USING (EventID) "; $query .= "INNER JOIN Divisions D USING (DivisionID) "; $query .= "INNER JOIN Tournaments TOUR USING (TournamentID) "; $query .= "WHERE P.PlayerID = $playerId "; //$query .= " ORDER BY Year DESC"; //$query .= " ORDER BY TOUR.StartDate DESC"; $query .= "ORDER BY Year DESC, E.GenderID, E.DivisionID"; $result = GetQueryResult($query); while($row = mysqli_fetch_array($result)) { $eventDate = $row['StartDate']; $results = $row['Result']; $numberOfTeams = $row['NumberOfTeams']; $divisionId = $row['DivisionID']; $genderId = $row['GenderID']; //$points = CalculatePoints($numberOfTeams, $results); $points = CalculatePoints($genderId, $divisionId, $numberOfTeams, $results); // Additional fields required $eventId = $row['EventID']; $division = $row['Division']; $partner = Player::GetTeamate($row['TeamID'], $playerId); //$genderId = $row['GenderID']; $tournamentId = $row['TournamentID']; // $event = PlayerEvent::GetPlayerEventComplete($tournamentId, $eventId, $eventDate, $division, $partner, $results, $points, $numberOfTeams, $genderId); //$ratingEarned = CalculateRatingEarned($numberOfTeams, $results); $ratingEarned = CalculateRatingEarned($genderId, $divisionId, $numberOfTeams, $results); // $event = PlayerEvent::GetPlayerEventComplete($tournamentId, $eventId, $eventDate, $division, $partner, $results, $points, $numberOfTeams, $genderId, $ratingEarned); $event = PlayerEvent::GetPlayerEventComplete($tournamentId, $eventId, $eventDate, $divisionId, $partner, $results, $points, $numberOfTeams, $genderId, $ratingEarned); $eventsPlayedCompleteCollection[] = $event; } return $eventsPlayedCompleteCollection; } // TODO: Refactor when we're ready to allow > 2 person teams. private function GetTeamate($teamId, $playerId) { $query = "SELECT PlayerID, FirstName, LastName "; $query .= "FROM Players INNER JOIN Teams USING(PlayerID) "; $query .= "WHERE TeamID = $teamId AND PlayerID <> $playerId"; $result = GetQueryResult($query); while($row = mysqli_fetch_array($result)) { $partner = Player::GetPlayerBaseData($row['PlayerID'], $row['FirstName'], $row['LastName']); } return $partner; } } ?>

[/php]

I’m not sure what column it counts…

Logging into PHPMyadmin I see this… does this help at all?

Run this in PHP My Admin,
[php]
SELECT PlayerID, FirstName, LastName, Hometown, CurrentPlayed
WHERE PlayerID = 1041;[/php]

See which number you get for Franklin.

what is the syntax error?

I was piecemealing the query together and forgot the table.

try this instead,

[php]SELECT PlayerID, FirstName, LastName, Hometown, CurrentPlayed FROM Players
WHERE PlayerID = 1041;[/php]

There are a few joins for the query, so it may not work, but worth a try without first.

Got the number “4”

After the I ran it i got 4… what is this telling us?


That is the actual data stored in the database… Which is a problem and says there is a flaw in the database design. But, that explains where the data comes up flawed.

Is that fixable? What I’m looking to achieve is to have all 2015 events for all players to be calculated and displayed in their Points… There were 7 events in 2015.

How can that be fixed? It seems currently the code is dropping events either by amount or date… not sure where or how.

For Franklin the total points calculation is dropping points earned for the first 2 events of the year (May 09 and June 06). Then also displays “4” instead of “6” events played.

Seems to be the same for all other players…

Is there a “date” cutoff?

That query should be pulling whatever data is there without any restrictions (minus the player). What I am not seeing, is where the data gets initially inserted.

There’s a backend PHP interface (bunch of pages) where data is entered and then writes to the database…

Here’s the PHP code for one of those pages… the Events_add.php …does it help?
[php]

<?PHP if (!session_start()) { session_start(); }; /*if (!isset($_SESSION['lgnapproved'])) { die(header('Location: login.php')); }*/ include("functions.php"); include("cnnxn.php"); connect(); if (isset($_POST['submit'])) { $combineddate=$_POST['eventdate_year'].'-'.$_POST['eventdate_month'].'-'.$_POST['eventdate_day']; $SQLadd='INSERT INTO Events (TournamentID,StartDate,GenderID,DivisionID,TeamSize,NumberOfTeams) VALUES ('.$_POST['TournamentID'].',"'.$combineddate.'",'.$_POST['GenderID'].','.$_POST['DivisionID'].','.$_POST['TeamSize'].','.$_POST['NumberOfTeams'].');'; //print $SQLadd; $sendit_add=mysqli_query($db,$SQLadd) or die(mysqli_error($db)); die(header("Location: Events_viewall.php?tid=".$_GET['tid'])); } ?>

[/php]

This is the original query, beautified:

[php]
SELECT
PlayerID,
FirstName,
LastName,
Hometown,
CurrentTown,
Height,
Picture,
College,
LocalBeach,
IsAVAVolunteer,
CurrentPlayed,
CurrentPoints,
(CASE WHEN Year(CurrentUnadjustedRatingDate) > (Year(CURDATE()) - 2) THEN CurrentUnadjustedRating
WHEN Year(CurrentUnadjustedRatingDate) > (Year(CURDATE()) - 3) THEN (CurrentUnadjustedRating + 1)
WHEN Year(CurrentUnadjustedRatingDate) > (Year(CURDATE()) - 4) THEN (CurrentUnadjustedRating + 2)
ELSE (CurrentUnadjustedRating + 3) END) AS CurrentRating,
(CASE WHEN CurrentUnadjustedRatingDate > (Year(CURDATE()) - 2) THEN CurrentUnadjustedRating
WHEN CurrentUnadjustedRatingDate > (Year(CURDATE()) - 3) THEN (CurrentUnadjustedRating + 1)
WHEN CurrentUnadjustedRatingDate > (Year(CURDATE()) - 4) THEN (CurrentUnadjustedRating + 2)
ELSE (CurrentUnadjustedRating + 3) END) AS CurrentRating,
COUNT(ResultID) AS AllTimePlayed,
NumberOfTeams,
Result
FROM
Players
INNER JOIN
Teams USING (PlayerID)
INNER JOIN
Results USING (TeamID)
INNER JOIN
Events USING (EventID)
WHERE PlayerID = $playerDataId
[/php]

Just need to replace the $playerDataId. What we need to do is count the number of events a user participated in for a specific time period (year). That is what you are after, correct?

Yes, that’s what I’m after. There were 7 events in 2015. Different number of events each year.

Ideally it should grab the Total amount of events played by each player in the current calendar year, and add the points together for all played, and also display “played x” every where.

I don’t understand the PHP language as I’m not a developer… little over my head.

Where do I make that change in this code?

Thanks for your help on this so far, but I’m still confused about how to fix it…

I’m busy now, but it needs to be done in the sql query. You need to select and count the events for a given year, by playerid.

Ok thanks. I have no idea how to do that… if you have a moment maybe you could walk me through it?

Where is the the code currently counting the amount of events a user has participated in during a year?

Sponsor our Newsletter | Privacy Policy | Terms of Service