Я пытаюсь создать фотогалерею только для личного использования, и я выставляю рейтинг системы, используя модифицированный скрипт, который я нашел в Интернете … все работает отлично, кроме одной вещи, я не могу помешать пользователям опубликовать несколько голосов в тот же день!!! Мне бы хотелось, чтобы пользователи голосовали за фотографии (также за несколько фотографий), но голосовали один раз в один и тот же день (один голос за каждую фотографию) … Я поместил здесь сценарий, который я изменил, если кто-то может сказать, как выполнить что я хочу, я буду очень доволен и счастлив … если у кого-то есть другие сценарии, которые используют txt вместо mysql db, добро пожаловать … спасибо.
Здесь размещаем скрипт php (ratings.php):
<?php
$rating = new ratings($_POST['widget_id']);
isset($_POST['fetch']) ? $rating->get_ratings() : $rating->vote();
class ratings {
var $data_file = './ratings.data.txt';
private $widget_id;
private $data = array();
function __construct($wid) {
$this->widget_id = $wid;
$all = file_get_contents($this->data_file);
if ($all) {
$this->data = unserialize($all);
}
}
public function get_ratings() {
if ($this->data[$this->widget_id]) {
echo json_encode($this->data[$this->widget_id]);
} else {
$data['widget_id'] = $this->widget_id;
$data['number_votes'] = 0;
$data['total_points'] = 0;
$data['dec_avg'] = 0;
$data['whole_avg'] = 0;
echo json_encode($data);
}
}
public function vote() {
# Get the value of the vote
preg_match('/star_([1-5]{1})/', $_POST['clicked_on'], $match);
$vote = $match[1];
$ID = $this->widget_id;
# Update the record if it exists
if ($this->data[$ID]) {
$this->data[$ID]['number_votes'] += 1;
$this->data[$ID]['total_points'] += $vote;
} else { # Create a new one if it doesn't
$this->data[$ID]['number_votes'] = 1;
$this->data[$ID]['total_points'] = $vote;
}
$this->data[$ID]['dec_avg'] = round($this->data[$ID]['total_points'] / $this->data[$ID]['number_votes'], 1);
$this->data[$ID]['whole_avg'] = round($this->data[$ID]['dec_avg']);
file_put_contents($this->data_file, serialize($this->data));
$this->get_ratings();
}
# ---
# end class
}
?>
и вот javascript (ratings.js):
$(document).ready(function() {
$('.rate_widget').each(function(i) {
var widget = this;
var out_data = {
widget_id : $(widget).attr('id'),
fetch: 1
};
$.post(
'ratings/ratings.php',
out_data,
function(INFO) {
$(widget).data('fsr', INFO);
set_votes(widget);
},
'json'
);
});
$('.ratings_stars').hover(
function() {
$(this).prevAll().andSelf().addClass('ratings_over');
$(this).nextAll().removeClass('ratings_vote');
},
function() {
$(this).prevAll().andSelf().removeClass('ratings_over');
set_votes($(this).parent());
}
);
$('.ratings_stars').bind('click', function() {
var star = this;
var widget = $(this).parent();
var clicked_data = {
clicked_on : $(star).attr('class'),
widget_id : $(star).parent().attr('id')
};
$.post(
'ratings/ratings.php',
clicked_data,
function(INFO) {
widget.data('fsr', INFO);
set_votes(widget);
},
'json'
);
});
});
function set_votes(widget) {
var avg = $(widget).data('fsr').whole_avg;
var votes = $(widget).data('fsr').number_votes;
var exact = $(widget).data('fsr').dec_avg;
window.console && console.log('and now in set_votes, it thinks the fsr is ' + $(widget).data('fsr').number_votes);
$(widget).find('.star_' + avg).prevAll().andSelf().addClass('ratings_vote');
$(widget).find('.star_' + avg).nextAll().removeClass('ratings_vote');
$(widget).find('.total_votes').text( votes + ' votes (' + exact + ' rating)' );
}
Я попытался изменить ratings.php, как показано ниже:
Сначала я попытался добавить в класс новый элемент remote_ip, на этом этапе я не могу голосовать, даже если это мой первый голос … Я хотел бы использовать cookie, поскольку обычный пользователь не может их удалить … поправьте меня, если я неправильно…
<?php
$rating = new ratings($_POST['widget_id']);
isset($_POST['fetch']) ? $rating->get_ratings() : $rating->vote();
class ratings {
var $data_file = './ratings.data.txt';
private $widget_id;
private $data = array();
function __construct($wid) {
$this->widget_id = $wid;
$all = file_get_contents($this->data_file);
if ($all) {
$this->data = unserialize($all);
}
}
public function get_ratings() {
if ($this->data[$this->widget_id]) {
echo json_encode($this->data[$this->widget_id]);
} else {
$data['widget_id'] = $this->widget_id;
$data['number_votes'] = 0;
$data['total_points'] = 0;
$data['dec_avg'] = 0;
$data['whole_avg'] = 0;
echo json_encode($data);
}
}
public function vote() {
# Get the value of the vote
preg_match('/star_([1-5]{1})/', $_POST['clicked_on'], $match);
$vote = $match[1];
$ID = $this->widget_id;
# Update the record if it exists
if ($this->data[$ID]) {
$this->data[$ID]['number_votes'] += 1;
$this->data[$ID]['total_points'] += $vote;
$this->data[$ID]['remote_ip'] = $_SERVER['REMOTE_ADDR'];
} else { # Create a new one if it doesn't
$this->data[$ID]['number_votes'] = 1;
$this->data[$ID]['total_points'] = $vote;
$this->data[$ID]['remote_ip'] = $_SERVER['REMOTE_ADDR'];
}
if ($this->data[$ID]['remote_ip'] != $_SERVER['REMOTE_ADDR']) {
$this->data[$ID]['dec_avg'] = round($this->data[$ID]['total_points'] / $this->data[$ID]['number_votes'], 1);
$this->data[$ID]['whole_avg'] = round($this->data[$ID]['dec_avg']);
file_put_contents($this->data_file, serialize($this->data));
$this->get_ratings();
}
}
# ---
# end class
}
?>
Это мой тест, который блокирует меня для голосования, и я не могу голосовать, даже если я не голосовал … кто-то может сказать мне, где я не прав? Другие тесты, которые я провалил, я не знаю, как решить проблему, это мой маленький проект только для того, чтобы делиться своими фотографиями с семьей и друзьями, и это самый простой способ узнать, что они думают о моих фотографиях. Ничего захватывающего, но было бы полезно для меня 🙂 Моя фотогалерея и так хорошо сценарий оценки должен работать под Linux и Windows, у меня есть веб-пространство на aruba.it, где на самом деле работает только галерея без сценария оценки и, конечно, мой сайт … Я под Apache 2.2.4 и PHP 5.4, если эта информация может помочь …
Я интегрировал другой скрипт, способный хранить ip / timestamp / cookie как в db, так и в txt
Вот скрипт рейтинга ajax / php, который я нашел:
http://coursesweb.net/php-mysql/rating-stars-script-ajax-php_s2
Вот скриншот моей фотогалереи:
http://i.stack.imgur.com/Anlln.jpg
Поскольку вы сказали мне, что мне нужна временная метка / ip / cookie, я искал другой скрипт и, наконец, интегрировал другой скрипт, способный хранить ip / timestamp / cookie как в db, так и в txt. Предыдущий сценарий было очень сложно изменить в соответствии с моими потребностями, исходя из моих навыков 🙂 Теперь моя фотогалерея работает с функцией оценки. Мои друзья и моя семья / родители могут теперь сказать мне, хорошо ли сделаны мои фотографии 🙂 Спасибо большое !!!
Самый простой способ — уведомить в таблице данных, кто проголосовал и в какой день.
Например: Тото голосует 2014-07-04, поэтому он не может голосовать дважды сегодня.
В таблице данных пользователя вы добавляете дату столбца, чтобы уведомить последний день голосования.
Вы можете использовать куки, но это очень и очень уродливо!
Других решений пока нет …