ДоХтор, тут либо в одном файле хранить все, либо передавать имя файла в аргументов в гет
ДоХтор, тут либо в одном файле хранить все, либо передавать имя файла в аргументов в гет
# Koenig (25.08.2016 / 23:01)Тут сейчас 1 ссылка == 1 файл. Но я её ещё не дописал, ещё нужно написать что-то типа сборщика мусора, чтоб не используемые файлы удалялись.
ДоХтор, тут либо в одном файле хранить все, либо передавать имя файла в аргументов в гет
FlySelf, я вот
if ($data['tm'] < $time) { // Перезапись
file_put_contents($fname, serialize(['tm'=>$mTime, 'cnt'=>0]));
$data = unserialize(file_get_contents($fname));
}if ($data['tm'] < $time) { // Перезапись
$data['tm'] = $mTime;
$data['cnt'] = 0;
file_put_contents($fname, serialize($data));
}ДоХтор, Так а смысл? Ты создаешь в 27 строке массив, сохраняешь его в файл и на 28 строке получаешь это же массив,но уже из файла... И про условия перечитай еще раз мой пост, в них можно просто формировать нужный массив, а уже ниже юзать 1 сохранение в файл, и туда же редирект перенести
ДоХтор, хз
<?php
class DocClick {
private $dir = 'data';
private $filename;
private $mtime;
private $clicks = 10;
public function __construct($filename, $args = array()) {
// def value
$this->mtime = time() + 60;
if (!is_dir($this->dir)) {
mkdir($this->dir, 750, true);
}
$this->filename = $filename;
if (file_exists($this->dir . DIRECTORY_SEPARATOR . $this->filename)) {
$this->loadData($this->filename);
} else {
$this->saveData();
}
$this->setArgs($args);
$this->check();
}
public function loadData($filename) {
$data = json_decode(file_get_contents($this->dir . DIRECTORY_SEPARATOR . $filename), true);
$this->filename = $filename;
$this->clicks = $data['clicks'];
$this->mtime = $data['mtime'];
}
public function saveData() {
$data = array('clicks' => $this->clicks, 'mtime' => $this->mtime);
file_put_contents($this->dir . DIRECTORY_SEPARATOR . $this->filename, json_encode($data));
}
public function setArgs($args) {
if (isset($args['filename'])) {
$this->filename = $args['filename'];
}
if (isset($args['days'])) {
$this->mtime = $this->setMtime($args['days']);
}
if (isset($args['clicks'])) {
$this->clicks = $this->setClicks($args['clicks']);
}
}
public function setFilename($filename) {
$this->filename = $filename;
}
public function setMtime($days) {
$this->mtime = time() + 3600 * 24 * $days;
}
public function setClicks($clicks) {
$this->clicks = $clicks;
}
public function getLink($linkname) {
return ($this->mtime >= time() && $this->clicks > 0 ? '<div><a href="?docclick='. $this->filename . '">'. $linkname .'</a> ('. $this->clicks .')</div>' : $linkname . '(' . $this->clicks . ')');
}
public function check() {
if (isset($_GET['docclick'])) {
$this->loadData($_GET['docclick']);
$this->clicks -= 1;
$this->saveData();
header('Location: ' . $_SERVER['HTTP_REFERER']);
exit;
}
}
}
ob_start();
$obj = new DocClick('test.txt');
$obj->saveData();
$obj2 = new DocClick('test2.txt');
$obj2->saveData();
echo $obj->getLink('test');
echo $obj2->getLink('test2');# FlySelf (26.08.2016 / 00:19)Смысл чтения из файла был в том, чтобы при запуске функции получать данные не из массива. Потому что массив при запуске кода будет хранить данные, которые были написаны при его объявлении.
ДоХтор, Так а смысл? Ты создаешь в 27 строке массив, сохраняешь его в файл и на 28 строке получаешь это же массив,но уже из файла... И про условия перечитай еще раз мой пост, в них можно просто форми
ДоХтор, ну там косяки еще есть, но смысл думаю понятен
# Koenig (26.08.2016 / 00:33)Спасибо за пример, Димон, но я не много не согласен - вроде бы не рекомендуют использовать ооп там, где можно обойтись пользовательской функцией. Да и кода получается больше. В общем, попробую перепилить свой вариант.
ДоХтор, ну там косяки еще есть, но смысл думаю понятен
FlySelf, вот что у меня получилось. Кстати, теперь число кликов обнуляется независимо (а при старом варианте клики обновлялись у всех ссылок, без учёта того, по какой из них был переход первым)
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;
if (file_exists($fname)) {
$data = unserialize(file_get_contents($fname));
} else {
$data = [
'tm' => $mTime,
'cnt' => 0
];
}
if (!empty($go)) {
$data['cnt']++;
file_put_contents($fname, serialize($data));
header('Location: '. $go);
exit;
}
if ($data['tm'] < $time) { // Перезапись
$data['tm'] = $mTime;
$data['cnt'] = 0;
file_put_contents($fname, serialize($data));
}
return ($data['tm'] >= $time && $data['cnt'] < $clicks ? '<a href="?id='. $id .
'&go='. $href .'">'. $lnkname .'</a> ('. ($clicks - $data['cnt']) .')<br/>' : '');
}ДоХтор, я просто смотрю на количество аргументов и в ужасе