EVE-KILL /
zKillboard
This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
| 1 | <?php |
||
| 2 | /* zKillboard |
||
| 3 | * Copyright (C) 2012-2015 EVE-KILL Team and EVSCO. |
||
| 4 | * |
||
| 5 | * This program is free software: you can redistribute it and/or modify |
||
| 6 | * it under the terms of the GNU Affero General Public License as published by |
||
| 7 | * the Free Software Foundation, either version 3 of the License, or |
||
| 8 | * (at your option) any later version. |
||
| 9 | * |
||
| 10 | * This program is distributed in the hope that it will be useful, |
||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
| 13 | * GNU Affero General Public License for more details. |
||
| 14 | * |
||
| 15 | * You should have received a copy of the GNU Affero General Public License |
||
| 16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
||
| 17 | */ |
||
| 18 | |||
| 19 | class Stats |
||
| 20 | { |
||
| 21 | |||
| 22 | public static function getTopPilots($parameters = array(), $allTime = false) |
||
| 23 | { |
||
| 24 | $parameters["cacheTime"] = 3600; |
||
| 25 | return self::getTop("characterID", $parameters, $allTime); |
||
| 26 | } |
||
| 27 | |||
| 28 | public static function getTopPointsPilot($parameters = array(), $allTime = false) |
||
| 29 | { |
||
| 30 | $parameters["cacheTime"] = 3600; |
||
| 31 | return self::getTopPoints("characterID", $parameters, $allTime); |
||
| 32 | } |
||
| 33 | |||
| 34 | public static function getTopCorps($parameters = array(), $allTime = false) |
||
| 35 | { |
||
| 36 | $parameters["cacheTime"] = 3600; |
||
| 37 | return self::getTop("corporationID", $parameters, $allTime); |
||
| 38 | } |
||
| 39 | |||
| 40 | public static function getTopPointsCorp($parameters = array(), $allTime = false) |
||
| 41 | { |
||
| 42 | $parameters["cacheTime"] = 3600; |
||
| 43 | return self::getTopPoints("corporationID", $parameters, $allTime); |
||
| 44 | } |
||
| 45 | |||
| 46 | public static function getTopAllis($parameters = array(), $allTime = false) |
||
| 47 | { |
||
| 48 | $parameters["cacheTime"] = 3600; |
||
| 49 | return self::getTop("allianceID", $parameters, $allTime); |
||
| 50 | } |
||
| 51 | |||
| 52 | public static function getTopFactions($parameters = array(), $allTime = false) |
||
| 53 | { |
||
| 54 | $parameters["cacheTime"] = 3600; |
||
| 55 | return self::getTop("factionID", $parameters, $allTime); |
||
| 56 | } |
||
| 57 | |||
| 58 | public static function getTopPointsAlli($parameters = array(), $allTime = false) |
||
| 59 | { |
||
| 60 | $parameters["cacheTime"] = 3600; |
||
| 61 | return self::getTopPoints("allianceID", $parameters, $allTime); |
||
| 62 | } |
||
| 63 | |||
| 64 | public static function getTopShips($parameters = array(), $allTime = false) |
||
| 65 | { |
||
| 66 | $parameters["cacheTime"] = 3600; |
||
| 67 | return self::getTop("shipTypeID", $parameters, $allTime); |
||
| 68 | } |
||
| 69 | |||
| 70 | public static function getTopGroups($parameters = array(), $allTime = false) |
||
| 71 | { |
||
| 72 | $parameters["cacheTime"] = 3600; |
||
| 73 | return self::getTop("groupID", $parameters, $allTime); |
||
| 74 | } |
||
| 75 | |||
| 76 | public static function getTopWeapons($parameters = array(), $allTime = false) |
||
| 77 | { |
||
| 78 | $parameters["cacheTime"] = 3600; |
||
| 79 | return self::getTop("weaponTypeID", $parameters, $allTime); |
||
| 80 | } |
||
| 81 | |||
| 82 | public static function getTopSystems($parameters = array(), $allTime = false) |
||
| 83 | { |
||
| 84 | $parameters["cacheTime"] = 3600; |
||
| 85 | return self::getTop("solarSystemID", $parameters, $allTime); |
||
| 86 | } |
||
| 87 | |||
| 88 | public static function getTopRegions($parameters = array(), $allTime = false) |
||
| 89 | { |
||
| 90 | $parameters["cacheTime"] = 3600; |
||
| 91 | return self::getTop("regionID", $parameters, $allTime); |
||
| 92 | } |
||
| 93 | |||
| 94 | /** |
||
| 95 | * @param string $groupByColumn |
||
| 96 | */ |
||
| 97 | public static function getTopPoints($groupByColumn, $parameters = array(), $allTime = false) |
||
| 98 | { |
||
| 99 | $whereClauses = array(); |
||
| 100 | $tables = array(); |
||
| 101 | Filters::buildFilters($tables, $whereClauses, $whereClauses, $parameters, $allTime); |
||
| 102 | $whereClauses[] = "characterID != 0"; |
||
| 103 | |||
| 104 | // Remove 0 values |
||
| 105 | $whereClauses[] = "$groupByColumn != 0"; |
||
| 106 | if ($groupByColumn == "corporationID") $whereClauses[] = "$groupByColumn > 6000000"; |
||
| 107 | |||
| 108 | $limit = array_key_exists("limit", $parameters) ? (int)$parameters["limit"] : 10; |
||
| 109 | |||
| 110 | $query = "select $groupByColumn, sum(kills) kills from (select killID gg, $groupByColumn, points kills from "; |
||
| 111 | if (sizeof(array_unique($tables)) > 1) die("Multiple table joins not ready in Stats just yet"); |
||
| 112 | $query .= implode(",", array_unique($tables)); |
||
| 113 | if (sizeof($whereClauses) > 0) $query .= " where " . implode(" and ", $whereClauses); |
||
| 114 | |||
| 115 | $npcFilter = $groupByColumn == "corporationID" ? "where $groupByColumn > 6000000" : ""; |
||
| 116 | $query .= " group by killID, $groupByColumn) as f $npcFilter group by $groupByColumn order by 2 desc limit $limit"; |
||
| 117 | |||
| 118 | $result = Db::query($query, array(), 3600); |
||
| 119 | $data = array(); |
||
| 120 | foreach ($result as $row) $data[] = Info::addInfo($row); |
||
| 121 | unset($result); |
||
| 122 | return $data; |
||
| 123 | } |
||
| 124 | |||
| 125 | public static function getTopIsk($parameters = array(), $allTime = false) |
||
| 126 | { |
||
| 127 | $parameters["orderBy"] = "p.total_price"; |
||
| 128 | if (!isset($parameters["limit"])) $parameters["limit"] = 5; |
||
| 129 | return Kills::getKills($parameters); |
||
| 130 | } |
||
| 131 | |||
| 132 | private static $extendedGroupColumns = array("characterID"); //, "corporationID"); //, "allianceID"); |
||
| 133 | |||
| 134 | /** |
||
| 135 | * @param string $groupByColumn |
||
| 136 | */ |
||
| 137 | private static function getTop($groupByColumn, $parameters = array(), $allTime = false) |
||
| 138 | { |
||
| 139 | $whereClauses = array(); |
||
| 140 | $tables = array(); |
||
| 141 | $tables[] = "zz_participants p"; |
||
| 142 | Filters::buildFilters($tables, $whereClauses, $whereClauses, $parameters, $allTime); |
||
| 143 | $whereClauses[] = "characterID != 0"; |
||
| 144 | |||
| 145 | // Remove 0 values |
||
| 146 | $whereClauses[] = "$groupByColumn != 0"; |
||
| 147 | if ($groupByColumn == "corporationID") $whereClauses[] = "$groupByColumn > 6000000"; |
||
| 148 | |||
| 149 | $limit = array_key_exists("limit", $parameters) ? (int)$parameters["limit"] : 10; |
||
| 150 | |||
| 151 | $tablePrefixes = array(); |
||
| 152 | if (sizeof($tables) > 1) { |
||
| 153 | foreach($tables as $table) $tablePrefixes[] = substr($table, strlen($table) - 1, 1) . ".killID"; |
||
| 154 | } |
||
| 155 | |||
| 156 | $query = "select $groupByColumn, count(distinct p.killID) kills from "; |
||
| 157 | $query .= implode(" left join ", array_unique($tables)); |
||
| 158 | if (sizeof($tables) > 1) $query .= " on (" . implode(" = ", $tablePrefixes) . ") "; |
||
| 159 | if (sizeof($whereClauses) > 0) $query .= " where " . implode(" and ", $whereClauses); |
||
| 160 | |||
| 161 | $query .= " group by 1 order by 2 desc limit $limit"; |
||
| 162 | |||
| 163 | $cacheTime = isset($parameters["cacheTime"]) ? (int)$parameters["cacheTime"] : 3600; |
||
| 164 | if ($cacheTime < 30) $cacheTime = 30; |
||
| 165 | $result = Db::query($query, array(), $cacheTime); |
||
| 166 | $data = array(); |
||
| 167 | foreach ($result as $row) $data[] = Info::addInfo($row); |
||
| 168 | unset($result); |
||
| 169 | //if (sizeof($data) <= 1) return self::getExtendedTop($groupByColumn, $parameters, $allTime); |
||
| 170 | return $data; |
||
| 171 | } |
||
| 172 | |||
| 173 | private static function getExtendedTop($groupByColumn, $parameters = array(), $allTime = false) |
||
| 174 | { |
||
| 175 | $whereClauses = array(); |
||
| 176 | $tables = array(); |
||
| 177 | $tables[] = "zz_participants p"; |
||
| 178 | Filters::buildFilters($tables, $whereClauses, $whereClauses, $parameters, $allTime); |
||
| 179 | |||
| 180 | // Remove 0 values |
||
| 181 | $whereClauses[] = "p.$groupByColumn != 0"; |
||
| 182 | $whereClauses[] = "x.$groupByColumn != 0"; |
||
| 183 | |||
| 184 | $limit = array_key_exists("limit", $parameters) ? (int)$parameters["limit"] : 10; |
||
| 185 | |||
| 186 | $query = "select x.$groupByColumn, count(distinct x.killID) kills from zz_participants x left join zz_participants p on (x.killID = p.killID)"; |
||
| 187 | $whereClauses[] = "x.killID = p.killID"; |
||
| 188 | $whereClauses[] = "x.isVictim = 'F'"; |
||
| 189 | $query .= " where " . implode(" and ", $whereClauses); |
||
| 190 | |||
| 191 | $query .= " group by 1 order by 2 desc limit $limit"; |
||
| 192 | |||
| 193 | $result = Db::query($query, array(), 3600); |
||
| 194 | $data = array(); |
||
| 195 | foreach ($result as $row) $data[] = Info::addInfo($row); |
||
| 196 | unset($result); |
||
| 197 | return $data; |
||
| 198 | } |
||
| 199 | |||
| 200 | public static function calcStats($killID, $adding = true) |
||
| 201 | { |
||
| 202 | $modifier = $adding ? 1 : -1; |
||
| 203 | |||
| 204 | $victim = Db::queryRow("select * from zz_participants where isVictim != 0 and killID = :killID", array(":killID" => $killID)); |
||
| 205 | $chars = Db::query("select characterID, shipTypeID, groupID from zz_participants where isVictim = 0 and killID = :killID", array(":killID" => $killID)); |
||
| 206 | $corps = Db::query("select distinct corporationID from zz_participants where isVictim = 0 and killID = :killID", array(":killID" => $killID)); |
||
| 207 | $allis = Db::query("select distinct allianceID from zz_participants where isVictim = 0 and killID = :killID", array(":killID" => $killID)); |
||
| 208 | $factions = Db::query("select distinct factionID from zz_participants where isVictim = 0 and killID = :killID", array(":killID" => $killID)); |
||
| 209 | |||
| 210 | $groupID = isset($victim["groupID"]) ? $victim["groupID"] : 0; |
||
| 211 | $points = isset($victim["points"]) ? $modifier * $victim["points"] : 0; |
||
| 212 | $isk = isset($victim["total_price"]) ? $modifier * $victim["total_price"] : 0; |
||
| 213 | |||
| 214 | if ($victim) { |
||
|
0 ignored issues
–
show
|
|||
| 215 | self::statLost("pilot", $victim["characterID"], $groupID, $modifier, $points, $isk); |
||
| 216 | self::statLost("corp", $victim["corporationID"], $groupID, $modifier, $points, $isk); |
||
| 217 | self::statLost("alli", $victim["allianceID"], $groupID, $modifier, $points, $isk); |
||
| 218 | self::statLost("faction", $victim["factionID"], $groupID, $modifier, $points, $isk); |
||
| 219 | self::statLost("ship", $victim["shipTypeID"], $groupID, $modifier, $points, $isk); |
||
| 220 | self::statLost("group", $victim["groupID"], $groupID, $modifier, $points, $isk); |
||
| 221 | self::statLost("system", $victim["solarSystemID"], $groupID, $modifier, $points, $isk); |
||
| 222 | self::statLost("region", $victim["regionID"], $groupID, $modifier, $points, $isk); |
||
| 223 | } |
||
| 224 | |||
| 225 | $shipTypes = array(); |
||
| 226 | $groups = array(); |
||
| 227 | foreach($chars as $char) { |
||
| 228 | self::statDestroyed("pilot", $char["characterID"], $groupID, $modifier, $points, $isk); |
||
| 229 | if (!in_array($char["shipTypeID"], $shipTypes)) { |
||
| 230 | self::statDestroyed("ship", $char["shipTypeID"], $groupID, $modifier, $points, $isk); |
||
| 231 | $shipTypes[] = $char["shipTypeID"]; |
||
| 232 | } |
||
| 233 | if (!in_array($char["groupID"], $groups)) { |
||
| 234 | self::statDestroyed("group", $char["groupID"], $groupID, $modifier, $points, $isk); |
||
| 235 | $groups[] = $char["groupID"]; |
||
| 236 | } |
||
| 237 | } |
||
| 238 | foreach($corps as $corp) self::statDestroyed("corp", $corp["corporationID"], $groupID, $modifier, $points, $isk); |
||
| 239 | foreach($allis as $alli) self::statDestroyed("alli", $alli["allianceID"], $groupID, $modifier, $points, $isk); |
||
| 240 | foreach($factions as $faction) self::statDestroyed("faction", $faction["factionID"], $groupID, $modifier, $points, $isk); |
||
| 241 | |||
| 242 | if ($modifier == -1) { |
||
| 243 | Db::execute("delete from zz_participants where killID = :killID", array(":killID" => $killID)); |
||
| 244 | } |
||
| 245 | } |
||
| 246 | |||
| 247 | /** |
||
| 248 | * @param string $type |
||
| 249 | */ |
||
| 250 | private static function statLost($type, $typeID, $groupID, $modifier, $points, $isk) |
||
| 251 | { |
||
| 252 | if ($typeID == 0) return; |
||
| 253 | Db::execute("insert into zz_stats (type, typeID, groupID, lost, pointsLost, iskLost) values (:type, :typeID, :groupID, :modifier, :points, :isk) on duplicate key update lost = lost + :modifier, pointsLost = pointsLost + :points, iskLost = iskLost + :isk", array(":type" => $type, ":typeID" => $typeID, ":groupID" => $groupID, ":modifier" => $modifier, ":points" => $points, ":isk" => $isk)); |
||
| 254 | } |
||
| 255 | |||
| 256 | /** |
||
| 257 | * @param string $type |
||
| 258 | */ |
||
| 259 | private static function statDestroyed($type, $typeID, $groupID, $modifier, $points, $isk) |
||
| 260 | { |
||
| 261 | if ($typeID == 0) return; |
||
| 262 | Db::execute("insert into zz_stats (type, typeID, groupID, destroyed, pointsDestroyed, iskDestroyed) values (:type, :typeID, :groupID, :modifier, :points, :isk) on duplicate key update destroyed = destroyed + :modifier, pointsDestroyed = pointsDestroyed + :points, iskDestroyed = iskDestroyed + :isk", array(":type" => $type, ":typeID" => $typeID, ":groupID" => $groupID, ":modifier" => $modifier, ":points" => $points, ":isk" => $isk)); |
||
| 263 | } |
||
| 264 | } |
||
| 265 |
This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.
Consider making the comparison explicit by using
empty(..)or! empty(...)instead.