Продолжаем данную. тему и попробуем выполнить ТЗ которое звучит так
Требуется вывести 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, затем не забываем обновить базу данных через конфигуратор.
2. Открываем файл /module/lib.php и вносим следующие изменения в функцию 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
Вполне возможно что перед Вами такой задачи решать и не нужно, но пример решения этой задачи может помочь Вам в решении других похожих заданий.
Социальные закладки