jquery — рейтинг системы php для фотогалереи, позволяющий 1 голос / день за каждую фотографию

Я пытаюсь создать фотогалерею только для личного использования, и я выставляю рейтинг системы, используя модифицированный скрипт, который я нашел в Интернете … все работает отлично, кроме одной вещи, я не могу помешать пользователям опубликовать несколько голосов в тот же день!!! Мне бы хотелось, чтобы пользователи голосовали за фотографии (также за несколько фотографий), но голосовали один раз в один и тот же день (один голос за каждую фотографию) … Я поместил здесь сценарий, который я изменил, если кто-то может сказать, как выполнить что я хочу, я буду очень доволен и счастлив … если у кого-то есть другие сценарии, которые используют 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. Предыдущий сценарий было очень сложно изменить в соответствии с моими потребностями, исходя из моих навыков 🙂 Теперь моя фотогалерея работает с функцией оценки. Мои друзья и моя семья / родители могут теперь сказать мне, хорошо ли сделаны мои фотографии 🙂 Спасибо большое !!!

0

Решение

Самый простой способ — уведомить в таблице данных, кто проголосовал и в какой день.

Например: Тото голосует 2014-07-04, поэтому он не может голосовать дважды сегодня.

В таблице данных пользователя вы добавляете дату столбца, чтобы уведомить последний день голосования.

Вы можете использовать куки, но это очень и очень уродливо!

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]