Lajkování neboli karma u komentářů

 2013-06-20 00:00:00
 Dmitry Burobin

Dnes Vám ukážu, jak se přidá lajkování neboli karma ke komentářům.

Tento článek se bude navazovat na článek Systém komentářů pomocí jQuery a Ajax.

Série článků:
1) Systém komentářů pomocí jQuery a Ajax.
2) Lajkování neboli karma u komentářů.
3) Strankování.

Vytvoření nové tabulky.

Vytvoříme si tabulku comment_likes, do které budeme ukládat: identifikátor ( id ), identifikátor komentáře ( id_comment ), status, tzn. zda se člověku líbí komentář či ne ( status ), ip adresu, aby člověk mohl hlasovat jen jednou ( ip ) a datum ( date ).

CREATE TABLE `comment_likes` (
`id` INT( 5 ) NOT NULL AUTO_INCREMENT,
`id_comment` INT( 5 ) NOT NULL,
`status` VARCHAR( 10 ) NOT NULL,
`ip` VARCHAR( 15 ) NOT NULL,
`date` DATETIME NOT NULL,
PRIMARY KEY( `id` )
)ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci

comment_template.php

Do šablonu komentářů přidame linky pro líbí se a nelíbí a celkový počet hodnocení. A ten bude vypadat takto:

<?php
echo '<li id="comment'.$comment['id'].'">
    <div id="commentWrap">'
;
        

        if(
$comment['parent_id']!=0)
        {

            
$q mysql_query("SELECT `name`, DATE_FORMAT(date, '%d %M %Y %H:%i') as date_add FROM `comments_my` WHERE `id`='".$comment['parent_id']."'");
            
$r mysql_fetch_assoc($q);
            echo 
'<span class="repText">Odpověď na komentář</span> <span class="repName">
            '
.$r['name'].'
            </span> <span class="repText">from</span> <span class="repDate">
            '
.$r['date_add'].'
            </span><br>'
;
        }
        

echo    
'<span class="commentName">'.$comment['name'].'</span> - <span class="commentDate">'.$comment['date_add'].'</span>

<!--------------------------------NOVÉ------------------------------------>

<!--
    Přidal jsem linky s třídami minus a plus, při kliknutí na které se bude vyvolávát js skript, který Vám ukážu dále.
    A celkový počet lajků spočítame pomocí funkci getTotalLikes(), 
    kterou popišu v dalším paragrafu, jako parametr přijíma identifikátor komentářu
-->

        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
        <a id="'
.$comment['id'].'" href="javascript:;" class="minus"><img src="thumb_down.png" width="16" height="16" alt="minus"></a>
        <span class="totalReactions_'
.$comment['id'].'">'.getTotalLikes$comment['id'] ).'</span>
        <a id="'
.$comment['id'].'" href="javascript:;" class="plus"><img src="thumb_up.png" width="16" height="16" alt="plus"></a>


<!--------------------------------KONEC NOVÉHO------------------------------------>


        <div class="komentar">
            '
.$comment['komentar'].'
        </div>
        <a class="replay" href="javascript:;"
        onClick="document.getElementById('
parent').value='.$comment['id'].';">Odpovědět</a>
    </div>
</li>'
;
?>

Funkce getTotalLikes() a getVisitorIP()

Tyto funkce jsme přidal na konec souboru comment.php první slouží k výpočtu počtu hodnocení a druhá ke zjíštění ip adresy. První vypada takto:

<?php
// jako parametr je identifikátor komentářů
function getTotalLikes$id ) {
// proměnná, do které uložime výstup této funkce, tudiž celkový počet lajků
    
$output "";
    
// Prvním přikazem zjistíme počet negativních lajků a druhým pozitivních
    
$totalQueryMinus mysql_query(" SELECT COUNT(`id`) FROM `comment_likes` WHERE `status`='minus' AND `id_comment`='"$id ."' ");
    
$totalQueryPlus mysql_query(" SELECT COUNT(`id`) FROM `comment_likes` WHERE `status`='plus' AND `id_comment`='"$id ."' ");

// Celkový počet vlastně bude rozdíl těchto dvou hodnot
    
$output mysql_result$totalQueryPlus) - mysql_result$totalQueryMinus);
    
// Ověříme, zda počet je větší než nula a přidame mu zelenou barvu
    
if( $output ) {
        
        
$output "<span style='color:#008000;'>"$output ."</span>";
        
// Pokud je počet roven nule tak bude černý
    
} elseif( $output == ) {
        
        
$output "<span style='color:#000000;'>"$output ."</span>";
        
// A když bude záporná tak bude červený    
    
} else {
        
        
$output "<span style='color:#FF0000;'>"$output ."</span>";
        
    }

// Vrácíme výsledek
    
return $output;
}
?>
Funkci getVisitorIP() používam již nějakou dobu a není moje, ale bohužel si nepamatují kde jsem ji našel.
<?php
function getVisitorIP() {

    
$ip "0.0.0.0";

    if( ( isset( 
$_SERVER['HTTP_X_FORWARDED_FOR'] ) ) &amp;&amp; ( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) ) {

        
$ip $_SERVER['HTTP_X_FORWARDED_FOR'];

    } elseif( ( isset( 
$_SERVER['HTTP_CLIENT_IP'])) &amp;&amp; (!empty($_SERVER['HTTP_CLIENT_IP'] ) ) ) {

        
$ip explode(".",$_SERVER['HTTP_CLIENT_IP']);

        
$ip $ip[3].".".$ip[2].".".$ip[1].".".$ip[0];

    } elseif((!isset( 
$_SERVER['HTTP_X_FORWARDED_FOR'])) || (empty($_SERVER['HTTP_X_FORWARDED_FOR']))) {

        if ((!isset( 
$_SERVER['HTTP_CLIENT_IP'])) &amp;&amp; (empty($_SERVER['HTTP_CLIENT_IP']))) {

            
$ip $_SERVER['REMOTE_ADDR'];

        }

    }

    return 
$ip;

}
?>

comment.js

Tento soubor doplníme o několik prvků:

$(document).ready(function(){

// pokud člověk klikne na "ne líbí se" link, pak do proměnné 
// commentBox uložime identifikátor komentáře a status a
// pošleme to vše na zpracování do souboru ajax_status.php, který
// popíšu dále. Pokud je vše vpořádku, tak obdržíme odpověď a 
// změníme celkový počet lajků pomocí funkci totalLikes, která se 
// nacházi v tomto souboru, ale až na konci a která zobrazí nový
// celkový počet hodnocení, jako parametr zase přijíma identifikátor
 
    
$(".minus").live('click', function() {
    
    
commentBox.id = $(this).attr("id");
    
commentBox.status 'minus';
    
    $.
ajax({
            
type"POST",
            
datacommentBox,
            
url"ajax_status.php",
            
beforeSend: function() {

            },        
            
complete: function() {
                
                
totalLikescommentBox.id );
                
            },            
            
success: function(msg) {
                if( 
msg ) {
                    
alert(msg);
                }
            }
        });
    
});

// Toto je úplně to samé akorat, změníme status na plus

$(".plus").live('click', function() {
    
    
commentBox.id = $(this).attr("id");
    
commentBox.status 'plus';
    
    $.
ajax({
            
type"POST",
            
datacommentBox,
            
url"ajax_status.php",
            
beforeSend: function() {

            },        
            
complete: function() {
                
                
totalLikescommentBox.id );
                
            },            
            
success: function(msg) {
                if( 
msg ) {
                    
alert(msg);
                }
            }
        });
    
});

// Tato funkce nam zobrázi nový celkový počet hodnocení
// odešleme identifikator do souboru ajax_total.php a
// následně obdržime odpověď s počtem hodnocení.

function totalLikesid ) {
    
    $.
ajax({
            
type"POST",
            
data"id="+id,
            
url"ajax_total.php",
            
beforeSend: function() {

            },        
            
complete: function() {

            },            
            
success: function(msg) {
                $(
".totalReactions_"+id).html(msg);
            }
        });
    
}

});

ajax_status.php a ajax_total.php

Tyto soubory zpracovávájí data posílaná na server pomocá ajaxu. Soubor ajax_status.php:

<?php
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
    
    require_once 
'db.php';
    require_once 
'comment.php';

// Ověříme, zda je odeslán identifikátor, pokud ne tak zobrazíme chybné hlášení
    
if( empty( $_POST['id'] ) || $_POST['id'] == '' ) {
        
        echo 
"Špatný identifikátor. ";
        
// Jinak        
    
} else {
        
// do proměnné id uložime identifikátor komentáře
// a do proměnné status, zda je negativní nebo pozitivní

        
$id mysql_real_escape_string$_POST['id'] );
        
$status $_POST['status'];

// ověříme, zda tento člověk už nehlasovál, ke zjíštění ip adresy použíjeme funkci getVisitorIP()
        
$selectIp mysql_query(" SELECT `id` FROM `comment_likes` WHERE `ip`='"getVisitorIP() ."' AND `id_comment`='"$id ."' ");
        if( !
$selectIp ) { echo "MySQL chyba."; }
        else {

// Pokud je v databázi záznam s touto ip adresou, pak vypíšeme hlášení
            
if( mysql_num_rows$selectIp ) > ) {
        
                echo 
"Už jste hlasoval za tento komentář.";
            
            } else {

// Jinak přidame tento lajk do databáze

                
$minusQuery mysql_query(" INSERT INTO `comment_likes`( `id_comment`, `status`, `ip`, `date` ) VALUES( '"$id ."', '"$status ."', '"getVisitorIP() ."', NOW() ) ");
                if( !
$minusQuery ) { echo "MySQL chyba."; }
                else {
                    
                    exit(
false);
                    
                }
                
            }
    
        }
    }
    
} else {
    exit(
"No entry.");
}
?>
Soubor ajax_total.php, v něm asi není co popisovat:
<?php
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
    
    require_once 
'db.php';
    require_once 
'comment.php';

    if( empty( 
$_POST['id'] ) || $_POST['id'] == '' ) {
        
        echo 
"Špatný identifikátor. ";
        
    } else {
        
        
$id mysql_real_escape_string$_POST['id'] );
        
        echo 
getTotalLikes$id );
        
    }
    
} else {
    exit(
"No entry.");
}
?>

Závěr

Chtěl bych poděkovat uživateli LuisFigo1994, který mi nabídnul toto téma. V dalším článku probereme docela zajímavé téma strankování.

Systém Orphus
Napište komentář.
Celkem komenrářů(251)
Jeffpoonia - 2017-09-23  16:36:21
 Cialis Como Funciona Buy Sildalis Online Albendazole Cheap [url=http://costofcial.com ]cialis[/url] 100mg Water Pills Cephalexin And Side Effects In Children
Jeffpoonia - 2017-09-22  19:53:25
 Buy Nexium Online Pharmacy [url=http://cialtobuy.com ]cialis[/url] Which Is Better Ampicillin Or Amoxicillin
Keflex Dosage For Dental Abscess For Sale Progesterone
The Canadian Med Store buy cialis Cialis Tadalafil 20mg Lilly
Ronweix - 2017-09-21  16:53:30
 Overseas Drug Store [url=http://cialtobuy.com ]cialis[/url] Buy Colchicine Online
Clomid Et Anovulation
Solubility Propecia Finasteride cialis Work Forum Priligy
Jeffpoonia - 2017-09-19  12:16:23
 Avoid Taking Vitamin With Amoxicillin [url=http://cialtobuy.com ]cheap cialis[/url] Viagra Salud
Generic Viagra Lowest Prices
Cialis Farmacia Sin Receta cialis Levitra Professionnel
Ronweix - 2017-09-18  22:55:00
 Generic Secure Ordering Dutasteride Cash Delivery [url=http://cialtobuy.com ]cialis price[/url] Propecia Economica
Comprar Cialis 5 Mg Synthroid No Prescription
Amoxicillin And Iv online pharmacy Worldwide isotretinoin by money order in usa price
Ronweix - 2017-09-15  10:06:08
 Que Es Cialis Y Para Que Sirve [url=http://cialtobuy.com ]cialis price[/url] Cialis Pharmacie Belgique
Amoxicillin Add Water Propecia Sperm Motility
Stendra Avanafil cialis Buy Macrobid
LarExaf - 2017-09-13  23:10:17
 Famvir [url=http://cialtobuy.com ]cialis online[/url] Viagra Ipertensione Arteriosa
Cialis From Canada Fastestshiponcialis Online Kamagra
La Viagra Natural viagra cialis Cytotec Online In Usa
Thomasref - 2017-08-17  09:36:54
 viagra samples from pfizer viagra india pharmacy
Aarondut - 2017-08-12  14:48:07
 sky pharmacy review canadian pharmacy support team canadian pharmacy no prescription cheap drugs canadian pharmacies mail order first medicine online pharmacy store canada pharmacy cialis canadian pharmacy canadian pharmacy cialis canadian pharmacy cialis 20mg
Dextersculk - 2017-08-07  06:08:47
 north american pharmacy Erectile Dysfunction pills canadian pharmacy express healthy man viagra ad canadian pharmacy mall online canadian pharmacy canadianonlinepharmacy.ru
ManuelAmurl - 2017-08-07  06:08:13
 black cialis Black Cialis 800 mg Best Prices
Larryvof - 2017-08-07  04:52:58
 can you take naproxen with prednisone canada generic cialis no percription viagra no prior prescription online pharmacy canadian pharmacy no prescription meds from india
Stephencob - 2017-08-07  04:51:11
 viagra brand 100mg rhinc inc canadian pharmacy cialis 20mg cialis generic antibiotics buy amoxil uk cheap cialis canadianpharmacynoprescription.ru
Jamesbar - 2017-08-07  04:42:12
 Viagra 100 mg best price price of 100mg viagra samples of viagra and cialis retin a without a prescription online pharmacies viagra from usa pharmacy average cost of viagra 100mg
XRumerTest - 2017-07-23  11:54:54
 Hello. And Bye.
ScottKep - 2017-07-23  09:37:47
 viagra tablets price india flagyl generic form stendra cost prednisone without a prescription generic kamagra rx4u pharmacy xenical buy generic cialis online canada super generac viagra canadian pharmacy online cialis viagra tablets price india
CharlesSarry - 2017-07-17  17:51:46
 canadapharmacy Erectile Dysfunction pills canadian pharmacy mall healthy man 25 hour canadian pharmacy onlinepharmacy online pharmacies canada tadalafil nedir cialis 20 mg tadalafil commander cialis online pharmacy
Aarondut - 2017-07-17  13:53:04
 purchase prednisone generic cialis no prescription buy wellbutrin xl without prescription canada pharmacy 24 hour drug store online pharmacy medicine from mexico where to buy tretinoin cream online pharmacies generic ed medication viagra samples from pfizer
ScottCon - 2017-07-17  06:39:07
 viagra for sale cealis canadianpharmaciesmailorder.ru sildenafil tablets 100mg buy amoxicillin without prescription generic levitra for sale in us order zestril lisinopril tadalista vs cialis viagra online fast shipping cialis 5 mg best price usa
ScottKep - 2017-07-16  16:21:16
 viagra without a prescription usa canadian pharmacy 24h viagra canada no prescription Bactrim low price viagra pills for sale cialis professional vs. super active viagra super active no prescription meds online paypal online pharmacy canadian pharmacy
*v komentářich nesmíte používat sprostá slova a odkazy!!!Děkuji za pochopeni.