Показано с 1 по 3 из 3

Тема: h скрипт полезная доработка и настройка скрипта

  1. #1

    h скрипт полезная доработка и настройка скрипта

    Добрый день уважаемые посетители моего форума !
    В этой теме рассмотрим наиболее важные и интересные доработки скрипта для удобства пользователей и разработчиков.

    И начать эту тему я хочу с доработкой очень важной части скрипта, а именно как привести все суммы по выборкам из SQL к одной валюте.
    Имеется ввиду например Вам нужен отчет по общей сумме инвестирования определенного пользователя в проект.
    Казалось бы задача решается очень просто сделать выборку типа

    PHP код:
    $db->fetch1($db->select('Opers''SUM(oSum*'."IF(ocID=5, $btc, 1)".')''ouID=?d and oState=3 and oOper=?', array(_uid(), 'CASHOUT'))) 
    В данном случае мы получаем сумму выведенных пользователем денег из проекта, где даже учитывается курс биткоина. Вроде как все правильно, но есть одно но, выборка не учитывает курс всех валют, например если в проекте более 50 различных альткоинов подключено, тогда запрос получится очень большим и не удобным.

    Есть решение этого вопроса для этого сначала надо открыть файл _dbstru.php в корневой директории и добавить туда ниже "oSum decimal(13,6) default 0," это "oSum_USD decimal(13,2) default 0,".
    затем надо найти "wBal decimal(13,6) default 0," и ниже добавить "wBal_USD decimal(13,2) default 0," и после этого зайти в конфигуратор _cfg и там нажать на update, в результате в sql мы добавили 2 поля и изменили структуру.

    Далее открываем фал lib.php в папке balance

    и в самом низу добавляем функцию

    PHP код:
    function opSUM_USD($sum$curr)
    {
        global 
    $_cfg$_currs;
        if (
    $curr == $_currs[1]['cCurrID'])
            return 
    $sum;    
        return 
    _zr($sum $_cfg["Bal_Rate$curr"], 1);

    и сохраняем. Эта функция переводит сумму отправляемую в нее в доллары по курсу, который установлен в системе

    Далее ищем функцию "opChangeBalance" и дорабатываем ее перед TRY на строку выше вставляем
    PHP код:
    $z_usd1 opSUM_USD($sum$_currs[$cid]['cCurrID']); 
    и ниже "'wBal=' => "wBal+$z1","
    добавляем строку "'wBal_USD=' => "wBal_USD+$z_usd1","
    На этом этапе мы доработали функцию opChangeBalance
    Надо обратить внимание на то в этой функции еще обрабатывается значение uBal в таблице Users и по хорошему можно было бы добавить и туда баланс в долларах, но считаю это не нужным и никогда не применял этот параметрю

    Далее ищем функцию "opOperCreateInfo" и там вносим следующие изменения
    ниже "global $db, $_currs;" добавляем строку "$sum_USD = opSUM_USD($z1, $_currs[$cid]['cCurrID']);"
    ниже "'sum' => $sum,"
    добавляем строку "'sum_USD' => $sum_USD,"
    В результате мы изменили функцию "opOperCreateInfo"
    то же самое делаем в функции "opOperCreate"
    то есть ниже "global $db, $_cfg, $_currs;"
    вставляем строку "$sum_USD = opSUM_USD($sum, $_currs[$cid]['cCurrID']);"
    и ниже "'oSum' => $sum,"
    вставляем строку "'oSum_USD' => $sum_USD,"

    В принципе это можно сказать вся доработка
    Теперь можно делать выборку по этому полю и получать значения всех валют приведенных по курсу к доллару.

    В заключении хочу сказать, что если кому кажутся эти доработки муторными и сложными, но если Вы их примените то потом поймете что польза от этого огромная и при выборках общей статистической информации или по по всему сайту или по отдельному пользователю будет намного проще и код будет гораздо короче.
    Если в проекте нет альткоинов вообще и в Вашем проекте применяется только USD то эти доработки вообще не нужны.

  2. #2
    Очень часто меня спрашивают я зачем нужно это делать то есть приводить все суммы в $ о чем указано в теме выше.
    Ответ это нужно для статистики например рефовдам которым приходится считать сколько денег в каждой валюте, а таким образом он сразу увидит приведенную к доллару общую сумму.

  3. #3
    Продолжаем данную. тему и попробуем выполнить ТЗ которое звучит так
    Требуется вывести 20 последних входов на сайт с указанием времени и страны с которой входили на сайт.
    Казалось бы задача простая но скрипт когда записывает ip адрес и другие данные в таблицу 'Hist' не записывает туда страну с которой пользователь заходил в аккаунт
    Первое решение вопроса выглядело так
    PHP код:
    $USERSLAST_IP $db->fetchRows($db->select("Hist""*""huID=?d  and hOper='LOGIN'", array(_uid()), "hID desc"10), false'hID');

    $country_code = array();
    foreach (
    $USERSLAST_IP as $key=>$c){
       
    $ipi 'http://ipinfo.io/' $c['hIP'] . '/country';
       
    $country_code{$key} = strtolower(trim(file_get_contents($ipi)));
       
    $res[$key]['ip'] = $c['hIP'];
       
    $res[$key]['flag'] = $country_code{$key};
       
    $res[$key]['date'] = $c['hTS'];

    Суть решения задачи такая $USERSLAST_IP получает массив 10 последних входов на сайт с таблицы 'Hist' по сути там 10 строк из этой таблицы входа на сайт.
    Затем она перебирается и получает массив уже с содержанием аббревиатуры страны.
    В общем решение задачи выполнено и на самом деле данный массив выводит все что нужно на сайт.
    Но этот способ имеет большой недостаток, при каждом входе на сайт делаются много запросов в данном случае 10 на другой сайт.
    Даже если у Вас мощный сервер но при входе 1000 пользователей мы получаем 10000 не нужных запросов, что задержит работу сайта и зависание.
    Есть другое решение вопроса которое потом было принято за основу.
    1 В таблицу 'Hist' добавляем поле 'hFlag varchar(2),' для этого также открваем файл _dbstru.php, затем не забываем обновить базу данных через конфигуратор.
    Для этого надо открыть файл _dbstru.php в корне сайта.
    2. Открываем файл /module/lib.pp и вносим следующие изменения в функцию opAddHist
    PHP код:
       $country_code '';   
       if (
    $oper=='LOGIN'){
          
    $old_ip $db->fetchRows($db->select("Hist""hIP, hFlag""huID=?d", array($uid), "hID desc"1), false'hID');               
          
    $new_ip $_GS['client_ip'];
          if (
    $new_ip != $old_ip[0]['hIP'] or !$old_ip[0]['hFlag'] ){
             if (
    $mew_flag 'http://ipinfo.io/' $new_ip '/country'){
                    
    $country_code strtolower(trim(file_get_contents($mew_flag)));     
             }
             else 
    $country_code $old_ip[0]['hFlag'];
          }
          else 
    $country_code $old_ip[0]['hFlag'];
       } 
    Затем добавляем строку 'hFlag' => $country_code, в параметр добавления строки в базу данных
    Выглядеть она теперь будет так
    PHP код:
        $db->insert('Hist'
            array(
                
    'hTS' => timeToStamp(), 
                
    'hOper' => $oper,
                
    'huID' => $uid,
                
    'hIP' => $_GS['client_ip'],
                
    'hFlag' => $country_code,
                
    'hParams' => arrayToStr($params),
                
    'hTag' => $tag,
                
    'hMemo' => $memo
            
    )
        ); 
    Суть данного решения вопроса в том, что нет вообще лишних запросов на посторонний сервис, запрос осуществляется только в том случае если изменился Ip адрес, в других случаях запишутся старые значения.
    Сама запись будет происходить только при операции входа.
    Внес поправки в код для тех случаев когда страна не может быть определена по ip, такое хоть и не часто бывает. В этом случае запишется старое значение.
    Выгода данного решения очевидна, это решение вообще практически никак не ограничит работу сайта, а поставленная задача выполнена.
    После этого сохраняем и открываем файл той страницы где нужно вывести эту историю входов
    добавляем туда
    PHP код:
    $USERSLAST_IP $db->fetchRows($db->select("Hist""*""huID=?d  and hOper='LOGIN'", array(_uid()), "hID desc"10), false'hID');
    setPage('USERSLAST_IP'$USERSLAST_IP); 
    В итоге html код на этой странице будет выглядеть так
    Код HTML:
    					{foreach from=$USERSLAST_IP key=i item=c}  
    					<div>
    						<div class="hisytory-cart flat-card profile-info-card is-auto is-dark is-achievement">
    							<div class="card-body">								
    								
    								<div class="achievement-name">
    									<div class="hisytory_item fx-aic">										
    										<div>
    											<div class="fx-aic">
    												<span>{$c.hFlag}</span>
    												<img class="icon_flag mlesm" src="images/flags/{$c.hFlag}.png" height="22" width="42" alt="">
    											</div>
    											<span>Вход в аккаунт</span>
    											<span>{$c.hIP}</span>
    											<span>{timeToStr(stampToTime($c.hTS ), 2)}</span>
    										</div>
    									</div>									
    								</div>
    							</div>
    						</div>
    					</div>
    					{/foreach}
    Понятно что сами теги у Вас должны быть свои.
    Ниже приведено фото решения данного вопроса
    Screenshot_2.jpg
    Вполне возможно что перед Вами такой задачи решать и не нужно, но пример решения этой задачи может помочь Вам в решении других похожих заданий.

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  

Индекс цитирования