Як показує практика, використання різних технологій у зв’язці може дати непоганий результат, і в нашому випадку цей факт не став винятком. Зробимо скрипт голосування («За» / «Проти») без перезавантаження сторінки. Для реалізації нам потрібна бібліотека JQuery.

Для зберігання наших даних використовується MySQL, тому попередньо створюємо таблиці в нашій базі:
1. Таблиця posts – містить дані постів. Необхідні поля таблиці id, like, unlike, name.
id – унікальний ключ поста;
like – сума голосів «за»;
unlike – сума голосів «проти»;
name — ім’я поста;

2. Таблиця unique_likes – необхідна для перевірки унікальності голосів.
post_id – ключ поста (id таблиці posts).
ip_v4 – ip адресу від дублювання голосів.

Далі створюємо файл, який буде містити клас для підключення до сервера MySQL,
дамо йому ім’я mysql.php
Код:

connect();
}
# підключення до бази
private function connect(){
if (@$db = mysql_connect(DB_HOST, DB_USER, DB_PASS)){
if (mysql_select_db (DB_NAME,$db)){
mysql_query(“SET NAMES ‘UTF8′”);
$this->DBConnect = $db;
return true;
} else {
echo ‘Не вдалося відкрити базу даних MySQL: ‘.mysql_error();
return false;
}
} else {
echo ‘Не вдалося з’єднатися з базою даних MySQL: ‘.mysql_error();
return false;
}
}
# виконання SQL-запиту
# $resType – зворотний результат, може бути array/resource
function query($sql,$resType=’array’){
$res = mysql_query($sql,$this->DBConnect);
if ($resType == ‘resource’){
return $res; # ресурс
} else {
if ($res){
if (mysql_num_rows($res) > 0){
while($arr = mysql_fetch_assoc($res)){
$arRes[] = $arr;
}
return $arRes; # масив
} else {
return false;
}
} else {
echo ‘Помилка виконання запиту: ‘.$sql.mysql_error();
return false;
}
}
}
}
?>

Створюємо сторінку, яка буде відображатись користувачу, назвемо її index.php
Код:

query(“SELECT * FROM posts”);
?>
0){?>
function doAction(id type){
$.post(‘doAjax.php’, {id:id, type:type}, function(data){
if(isNaN(parseFloat(data))){
alert(data);
}else{
$(‘#’+id+’_’+type+’s’).text(data);
}
});
}

Подобається ()
Не подобається ()

Створюємо обробник, який власне і буде виконувати всю основну роботу, назвемо файл doAJAX.php.
Код:

query(‘
SELECT * FROM unique_likes
WHERE post_id=”‘.(int)$_POST[‘id’].'”
AND ip_v4=”‘.$_SERVER[‘REMOTE_ADDR’].'”‘);
if(!$arULike){
if ($_POST[‘type’]==’like’){
$dbObj->query(‘
UPDATE posts
SET `like`=`like`+1
WHERE id=”‘.(int)$_POST[‘id’].'”‘,’resource’);
$arSNum = $dbObj->query(‘
SELECT `like`
FROM posts
WHERE id=”‘.(int)$_POST[‘id’].'”
LIMIT 1′);
echo $arSNum[0][‘like’];
} elseif($_POST[‘type’]==’unlike’){
$dbObj->query(‘
UPDATE posts
SET `unlike`=`unlike`+1
WHERE id=”‘.(int)$_POST[‘id’].'”‘,’resource’);
$arSNum = $dbObj->query(‘
SELECT `unlike`
FROM posts
WHERE id=”‘.(int)$_POST[‘id’].'”
LIMIT 1′);
echo $arSNum[0][‘unlike’];
}
$dbObj->query(‘INSERT INTO unique_likes (`post_id`,`ip_v4`)
VALUES (“‘.(int)$_POST[‘id’].'”,”‘.$_SERVER[‘REMOTE_ADDR’].'”)’,’resource’);
} else {
echo ‘Ви вже проголосували’;
}
}
?>

Отже, в результаті у нас повинні вийти такі файли:
mysql.php – файл підключення до БД MySQL.
doAJAX.php – обробник AJAX запитів.
index.php – сторінка, що показується користувачеві.

Вихідні матеріали в архіві:
http://yournet.kz/example/like-unlike/files.rar

Робочий приклад:
http://yournet.kz/example/like-unlike/

Додав: htmaker, 07.02.2013 р.
(15 голосів, середній: 4,33 з 5)

Завантаження…

Діліться з друзями:

См. також:


Мета тег robots, приклади використання
Рубрика: Html, CSS, Javascript, SEO

Stimed – задаємо CSS-стилі по часу
Рубрика: Html, CSS, Javascript

Небезпека використання атрибуту target=”_blank”
Рубрика: Html, CSS, Javascript, Інф. безпека

Нескінченна анімація обертання на CSS
Рубрика: Html, CSS, Javascript

Анімація обертання при наведенні курсору
Рубрика: Html, CSS, Javascript

Стилізація виділення номера телефону до мобільних браузерах
Рубрика: Html, CSS, Javascript

Список вибору на JQuery
Рубрика: Html, CSS, Javascript

Фіксований заголовок таблиці HTML
Рубрика: Html, CSS, Javascript

Ефекти кнопок для сайту
Рубрика: Html, CSS, Javascript

Коментарі

  • Андрій пише:
    26.08.2015 в 23:43

    А з однією таблицею не можна зробити?

    Відповісти

  • htmaker пише:
    27.08.2015 в 00:00

    Думаю можна, однак зберігати такі речі в різних таблицях більш кращий з точки зору зручності роботи з даними, а так само продуктивності при великому кол-ве записів в таблицях.

    Відповісти

  • vital пише:
    28.06.2016 в 16:15

    А яка може бути проблема з великою кількістю даних, якщо мається на увазі, що один відвідувач може поставити тільки один лайк або анлайк? Тобто з кожною дією у тебе створюється однакову кількість записів в обох таблицях. Тому доцільніше зберігати IP в тій же таблиці, де і лайки, а далі вибирати по ключам post_id і IP для перевірки унікальності

    Відповісти

  • vital пише:
    28.06.2016 у 16:20

    Прошу вибачення, вліз без діла.
    Я прогледів, що posts — це таблиця постів, а не самих лайків. 🙂 Просто я представив структуру, де лайки лежать окремо для різних сутностей. Якщо дані про кол-ве лайків лежать безпосередньо в таблиці постів, то звичайно структура з другої таблицею — вірна.

    Відповісти

  • Абай пише:
    25.02.2016 в 10:58

    Спасибі! А як можна зробити для конкретних статей?

    Відповісти

  • htmaker пише:
    30.06.2016 в 10:12

    Для статей потрібно додати додатковий параметр, скажімо в таблиці зі статтями буде поле show_raiting, тип INT(1). Параметр буде відповідати показувати голосування у конкретної статті або ні. На сторінці виведення статей робити перевірку. Логічно 1 — показ, 0 — немає.

    Відповісти

  • Денис пише:
    21.11.2016 у 19:16

    Підкажіть а можна буде зробити так: На стор підвантажується інфа припустимо назва пісні яке через деякий час змінюється і потрібно зробити так щоб назвою пісні видавався ід і якщо юзер натиснув на мені вдачу або не вдачу назва цієї пісні записалася в стовпець з назвою name в таблиці posts і так само видати ід саме цієї пісні в таблиці unique_likes щоб коли назва пісні змінилося і видало новій назві іншого ід можна було поставити вдачу або не вдачу. Якщо все це можливо підкажіть як заздалегідь велике спасибі!

    Відповісти