Доброго времени суток ![]()
Помогите мне асилить код. Не могу воткнуть внутрь одной функции другую ф-цию--инкрементатор. Вернее, воткнуть-то не проблема, а проблема в том, что в теле функции инкрементатор не даёт того результата, как если передавать его в гет-параметре в функцию. Код работает, но мне не нравится, что вместо одной функции надо описывать две, и потом их конкатенировать .
Есть ли смысл в попытках совмещения этих функций друг с другом? Или можно оставить как есть?
session_id() ?: session_start();
/**
* Устанавливает лимит на клики по временнОму интервалу
*
* @param string $href Ссылка для редиректа
* @param string $lnkname Название ссылки
* @param int $days Количество дней
* @param int $clicks Количество кликов по ссылке
* @param string $dir Название папки для файлов
* @param string $id ID пользователя (или id сессии для гостей)
*
* @return string Возвращает ссылку с лимитом кликов.
* Если лимит исчерпан - пустую строку
*/
function showLink($href, $lnkname, $days, $clicks, $dir, $id) {
$id = (isset($_GET['id']) ? trim(strip_tags($_GET['id'])) : $id);
$go = (isset($_GET['go']) ? trim(strip_tags($_GET['go'])) : '');
is_dir($dir) ?: mkdir($dir);
$fname = $dir .'/'. $id .'.txt';
$time = time();
$mTime = $time + 45; # <---Строка для теста
// $mTime = $time + 3600 * 24 * $days;
file_exists($fname) ?: file_put_contents($fname, serialize(['tm'=>$mTime, 'cnt'=>0]));
$data = unserialize(file_get_contents($fname));
if (!empty($go)) {
$data['cnt']++;
file_put_contents($fname, serialize($data));
header('Location: '. $go);
exit;
}
if ($data['tm'] < $time) { // Перезапись
file_put_contents($fname, serialize(['tm'=>$mTime, 'cnt'=>0]));
$data = unserialize(file_get_contents($fname));
}
return ($data['tm'] >= $time && $data['cnt'] < $clicks ? '<a href="?id='. $id .
'&go='. $href .'">'. $lnkname .'</a> ('. ($clicks - $data['cnt']) .')<br/>' : '');
}
/**
* Функция-инкрементатор
*/
function i() {
static $i = 0;
return ++$i;
}echo showLink(
basename(__FILE__),
'Тест',
1,
10,
'DIR',
session_id() . i()
);
echo showLink(
'http://johncms.com/',
'JohnCMS',
1,
10,
'DIR',
session_id() . i()
);
/*
Тест (10)
JohnCMS (10)
*/Понятное дело, что можно было session_id() . i() сохранить в переменную, но тогда для каждого вызова showLink придётся писать блок переменных с параметрами, и код будет громоздкий (если прописать 10 ссылок, то добавится 60 строк кода). Как сделать правильнее, и практичнее?
Спасибо.