Пользователь
Регистрация: 10.05.2017
Сообщений: 12
|
Что я делаю не так?
Доброго времени суток, дорогие форумчане.
Нуждаюсь в Вашей помощи.
Есть такой вот код на php:
Код:
<?php
class Database
{
private $mysqli;
public function __construct()
{
$this->mysqli = new mysqli("localhost", "root", "", "newbase");
if( !$this->mysqli)
{
throw new Exception('Could not connect to DB');
}
}
public function escape($str)
{
return mysqli_escape_string($this->mysqli, $str);
}
public function query($sql)
{
if (!$this->mysqli)
{
return false;
}
$result = $this->mysqli->query($sql);
if (mysqli_error($this->mysqli) )
{
throw new Exception(mysqli_error($this->mysqli));
}
if (is_bool($result))
{
return $result;
}
$data = array();
while($row = mysqli_fetch_assoc($result))
{
$data[] = $row;
}
mysqli_free_result($result);
return $data;
}
public function getRecord($heroId)
{
if ($result = self::query("SELECT * FROM hidemonsters WHERE hero_id=$heroId"))
{
return $result[0]['last_recalculation_time'];
}
else
{
return 0;
}
}
public function getCautionValue($heroId, $time)
{
if ($result = self::query("SELECT caution_value FROM hidemonsters WHERE hero_id=$heroId"))
{
return $result[0]['caution_value'];
}
else
{
$result = self::query("INSERT INTO hidemonsters (hero_id, caution_value, last_recalculation_time) VALUES ($heroId, 0, $time)");
return $result[0]['caution_value'];
}
}
public function updateCautionValue($heroId, $value, $time)
{
if ($value < 0 )
{
$value = 0;
}
self::query("UPDATE hidemonsters SET caution_value=$value, last_recalculation_time=$time WHERE hero_id=$heroId");
return $value;
}
public function __destruct()
{
if ($this->mysqli)
{
$this->mysqli->close();
}
}
}
?>
Код:
<?php
class Caution
{
private $heroId;
private $heroLevel;
private $time;
private $value;
private $database;
private static $config = array(
array('valueFrom' => 25, 'levelDelta' => 4),
array('valueFrom' => 50, 'levelDelta' => 3),
array('valueFrom' => 75, 'levelDelta' => 2),
array('valueFrom' => 100, 'levelDelta' => 0),
);
public function __construct($heroId, $heroLevel, $time)
{
$this->heroId = $heroId;
$this->heroLevel = $heroLevel;
$this->time = $time;
$this->database = new Database();
$this->value = $this->calculateCurrentValue($this->database->getRecord($heroId));
}
public function calculateCurrentValue($record)
{
/*
Здесь у нас есть внутри $record значение предыдущего времени пересчета параметра и есть $this->time - текущее время сервера.
Разница между ними - это и есть промежуток времени, который прошел с прошлого пересчета.
В соответствии с этой разницей мы пересчитываем с точностью до секунды значение параметра и если оно изменилось - обновляем значения в базе данных.
// */
$value = $this->database->getCautionValue($this->heroId, $this->time);
$record = $this->database->getRecord($this->heroId, $this->time);
$value = $value - round(($this->time - $record)/60);
$this->database->updateCautionValue($this->heroId, $value, $this->time);
return $value;
}
public function getValue()
{
return $this->value;
}
public function filterMonsterLevels($monsterLevels)
{
$monsterLevels = array(10, 11, 12, 13, 14, 15, 16, 17, 18, 19);
$levelsResult = array();
$valuePercent = round(self::getValue() * 100 / 1500);
for($i = 0; $i < count(self::$config); $i++)
{
if($valuePercent < self::$config[$i]['valueFrom'])
{
$levelsResult = $monsterLevels;
return $levelsResult;
}
elseif ($valuePercent >= self::$config[$i]['valueFrom'] and $valuePercent < self::$config[$i+1]['valueFrom'])
{
for($j =0; $j < count($monsterLevels); $j++)
{
if($monsterLevels[$j] > $this->heroLevel - self::$config[$i]['levelDelta'] and self::$config[$i]['levelDelta'] != 0)
{
array_push($levelsResult, $monsterLevels[$j]);
}
}
return $levelsResult;
}
else
{
$levelsResult = array();
}
}
return $levelsResult;
}
public function kill($monsterLevel)
{
for ($i=0, $size = count($monsterLevel); $i <$size; $i++)
{
if ($this->heroLevel - $monsterLevel[i] + 3 < 10)
{
$this->value += $this->heroLevel - $monsterLevel[$i] + 3;
}
else{
$this->value += 10;
}
}
$this->database->updateCautionValue($this->heroId, $this->value , $this->time);
return $this->value;
}
}
?>
Код:
<?php
require('Caution.php');
require_once('Database.php');
echo "<p><b> new parametr </b></p>";
$caution = new Caution(1, 20, mktime(0, 0, 0, 6, 30, 2017));
echo $caution->getValue();// Должно быть 0
echo "<p><b> array of monsters </b></p>";
print_r($caution->filterMonsterLevels($monsterLevels)); // Все уровни должны быть доступны
echo "<br>_____________________________________________________________________________________________________<br>";
// Чтобы догнать параметр до 25%
$caution->kill(array(5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5));
echo "<p><b>Filter if >25% </b></p>";
echo $caution->getValue(); // Должно быть около 25%
echo "<br>";
print_r($caution->filterMonsterLevels($monsterLevels)); // Должны отфильтроваться по уровню - 4
echo "<br>_____________________________________________________________________________________________________<br>";
$caution = new Caution(1, 20, mktime(3, 0, 0, 6, 30, 2017)); // Прошло 3 часа
echo "<p><b>Filter after 3 hours (parametr = 14%)</b></p>";
echo $caution->getValue(); // Должно быть около 14%, если мы считаем, что в час уменьшается на 60ед.
echo "<br>";
print_r($caution->filterMonsterLevels($monsterLevels)); // Все уровни должны быть доступны
echo "<br>_____________________________________________________________________________________________________<br>";
echo "<p><b> 6.5 hours later (parametr = 0%)</b></p>";
$caution = new Caution(1, 20, mktime(6, 30, 0, 6, 30, 2017)); // Прошло 6.5 часов
echo $caution->getValue(); // Должно быть 0%*/
echo "<br>";
print_r($caution->filterMonsterLevels($monsterLevels)); // Все уровни должны быть доступны
?>
Вопрос: почему при последнем расчете не записывает данные в базу?
|