Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2017, 15:01   #1
tooBot
Пользователь
 
Регистрация: 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)); // Все уровни должны быть доступны
?>
Вопрос: почему при последнем расчете не записывает данные в базу?
tooBot вне форума Ответить с цитированием
Старый 30.06.2017, 18:20   #2
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Как найти ошибку в своем коде?
Andkorol вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что я делаю не так? Kot070 Общие вопросы C/C++ 6 15.04.2014 13:22
Что не так делаю? ratqa Общие вопросы C/C++ 2 13.12.2012 16:54
Что не так я делаю? volha_alina Паскаль, Turbo Pascal, PascalABC.NET 2 23.05.2012 13:05
Что не так делаю? L6go1as Общие вопросы C/C++ 5 28.10.2011 07:54