Як показує практика, використання різних технологій у зв’язці може дати непоганий результат, і в нашому випадку цей факт не став винятком. Зробимо скрипт голосування («За» / «Проти») без перезавантаження сторінки. Для реалізації нам потрібна бібліотека 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
А з однією таблицею не можна зробити?
Відповісти
27.08.2015 в 00:00
Думаю можна, однак зберігати такі речі в різних таблицях більш кращий з точки зору зручності роботи з даними, а так само продуктивності при великому кол-ве записів в таблицях.
Відповісти
28.06.2016 в 16:15
А яка може бути проблема з великою кількістю даних, якщо мається на увазі, що один відвідувач може поставити тільки один лайк або анлайк? Тобто з кожною дією у тебе створюється однакову кількість записів в обох таблицях. Тому доцільніше зберігати IP в тій же таблиці, де і лайки, а далі вибирати по ключам post_id і IP для перевірки унікальності
Відповісти
28.06.2016 у 16:20
Прошу вибачення, вліз без діла.
Я прогледів, що posts — це таблиця постів, а не самих лайків. 🙂 Просто я представив структуру, де лайки лежать окремо для різних сутностей. Якщо дані про кол-ве лайків лежать безпосередньо в таблиці постів, то звичайно структура з другої таблицею — вірна.
Відповісти
25.02.2016 в 10:58
Спасибі! А як можна зробити для конкретних статей?
Відповісти
30.06.2016 в 10:12
Для статей потрібно додати додатковий параметр, скажімо в таблиці зі статтями буде поле show_raiting, тип INT(1). Параметр буде відповідати показувати голосування у конкретної статті або ні. На сторінці виведення статей робити перевірку. Логічно 1 — показ, 0 — немає.
Відповісти
21.11.2016 у 19:16
Підкажіть а можна буде зробити так: На стор підвантажується інфа припустимо назва пісні яке через деякий час змінюється і потрібно зробити так щоб назвою пісні видавався ід і якщо юзер натиснув на мені вдачу або не вдачу назва цієї пісні записалася в стовпець з назвою name в таблиці posts і так само видати ід саме цієї пісні в таблиці unique_likes щоб коли назва пісні змінилося і видало новій назві іншого ід можна було поставити вдачу або не вдачу. Якщо все це можливо підкажіть як заздалегідь велике спасибі!
Відповісти