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ářů(461)
Ronweix - 2017-11-22  17:08:41
 Viagra For Women 2013 [url=http://sildenafdosage.com]viagra prescription[/url] Il Cialis Prezzo
LarExaf - 2017-11-21  08:36:46
 Amoxicillin And Bruising 100 Mg Viagra [url=http://via50mg.com]viagra[/url] Precio Cialis 20 Mg En Farmacia Amoxicillin Uses For Dogs
Ronweix - 2017-11-17  23:49:57
 Propecia Doping Finasteride Dutasteride 0.5mg Enlarged Prostate Levitra Online [url=http://lowpricecial.com]online pharmacy[/url] Buy Silagra 100 Mg
Ronweix - 2017-11-17  18:52:56
 Confezioni Viagra 100 Mg Ventolin Hfa Aer Glaxosmith Acheter Cialis Original En Ligne [url=http://tadalaf20mg.com]cialis buy online[/url] Propecia Fin De Pelo
Ronweix - 2017-11-17  18:52:55
 Confezioni Viagra 100 Mg Ventolin Hfa Aer Glaxosmith Acheter Cialis Original En Ligne [url=http://tadalaf20mg.com]cialis buy online[/url] Propecia Fin De Pelo
Ronweix - 2017-11-17  18:52:54
 Confezioni Viagra 100 Mg Ventolin Hfa Aer Glaxosmith Acheter Cialis Original En Ligne [url=http://tadalaf20mg.com]cialis buy online[/url] Propecia Fin De Pelo
Ronweix - 2017-11-17  18:52:51
 Confezioni Viagra 100 Mg Ventolin Hfa Aer Glaxosmith Acheter Cialis Original En Ligne [url=http://tadalaf20mg.com]cialis buy online[/url] Propecia Fin De Pelo
Jeffpoonia - 2017-11-17  10:53:42
 Buy Flagyl In Little Rock Online Fluxotine No Prescription [url=http://cialgeneri.com ]online pharmacy[/url] Propecia 1mg Tablets Cialis Fur Diabetiker Zithromax Dry Eye
Jeffpoonia - 2017-11-17  10:53:40
 Buy Flagyl In Little Rock Online Fluxotine No Prescription [url=http://cialgeneri.com ]online pharmacy[/url] Propecia 1mg Tablets Cialis Fur Diabetiker Zithromax Dry Eye
Ronweix - 2017-11-17  09:19:09
 Propecia Pharmacie En Ligne [url=http://cheapvia50mg.com]viagra online pharmacy[/url] Cialis Viagra Alcool Safe Way To Byi Viagra Online
Ronweix - 2017-11-17  09:19:08
 Propecia Pharmacie En Ligne [url=http://cheapvia50mg.com]viagra online pharmacy[/url] Cialis Viagra Alcool Safe Way To Byi Viagra Online
Ronweix - 2017-11-17  09:19:07
 Propecia Pharmacie En Ligne [url=http://cheapvia50mg.com]viagra online pharmacy[/url] Cialis Viagra Alcool Safe Way To Byi Viagra Online
Ronweix - 2017-11-17  09:19:06
 Propecia Pharmacie En Ligne [url=http://cheapvia50mg.com]viagra online pharmacy[/url] Cialis Viagra Alcool Safe Way To Byi Viagra Online
Jeffpoonia - 2017-11-16  18:25:16
 No Prescription Amoxicillin Cialis Vademecum Es Comment Prendre Clomid [url=http://cialtobuy.com ]cialis buy online[/url] Best Price 100mg Generic Viagra Acquisto Viagra Forum
Jeffpoonia - 2017-11-16  18:25:13
 No Prescription Amoxicillin Cialis Vademecum Es Comment Prendre Clomid [url=http://cialtobuy.com ]cialis buy online[/url] Best Price 100mg Generic Viagra Acquisto Viagra Forum
Jeffpoonia - 2017-11-16  18:25:11
 No Prescription Amoxicillin Cialis Vademecum Es Comment Prendre Clomid [url=http://cialtobuy.com ]cialis buy online[/url] Best Price 100mg Generic Viagra Acquisto Viagra Forum
Jeffpoonia - 2017-11-16  18:25:10
 No Prescription Amoxicillin Cialis Vademecum Es Comment Prendre Clomid [url=http://cialtobuy.com ]cialis buy online[/url] Best Price 100mg Generic Viagra Acquisto Viagra Forum
LarExaf - 2017-11-16  18:02:43
 Lasting Longer Bed Pregnant And Taking Amoxicillin Alli Avaibility [url=http://howtogetvia.com]viagra[/url] Canadian Pharcharmy Online Compra Cialis Foro
LarExaf - 2017-11-16  18:02:42
 Lasting Longer Bed Pregnant And Taking Amoxicillin Alli Avaibility [url=http://howtogetvia.com]viagra[/url] Canadian Pharcharmy Online Compra Cialis Foro
LarExaf - 2017-11-16  18:02:40
 Lasting Longer Bed Pregnant And Taking Amoxicillin Alli Avaibility [url=http://howtogetvia.com]viagra[/url] Canadian Pharcharmy Online Compra Cialis Foro
*v komentářich nesmíte používat sprostá slova a odkazy!!!Děkuji za pochopeni.