在 javascript 中发布喜欢/不喜欢系统 php

Posted

技术标签:

【中文标题】在 javascript 中发布喜欢/不喜欢系统 php【英文标题】:post in javascript for like/dislike system php 【发布时间】:2019-07-26 02:34:36 【问题描述】:

我正在尝试为用户只能投票一次的视频制作一个喜欢/不喜欢的系统。在对网络进行了一些研究之后,我最近在我的代码中实现了 Ajax(我对 Ajax 的了解有限)。当我单击喜欢或不喜欢页面刷新时,它不会更改 mysql 中喜欢/不喜欢列中的任何内容。以下是上传视频的代码。

<?php
session_start();
include "config.php";

if( !empty( $_GET['$v_id'] ) )

    $vid = $_SESSION['v_id'] = $_GET['$v_id'];

 $sql='SELECT video_name FROM video WHERE v_id=?';
    $stmt=$link->prepare( $sql );
    $stmt->bind_param('i', $vid );
    $res=$stmt->execute();
    if( $res )
        $stmt->store_result();
        $stmt->bind_result( $videoname );
        $stmt->fetch();

        printf('
            <video   style="background-color:#585858; border: 4px solid darkorange; border-radius:20px;" controls>
                <source src="uploads/%s" type="video/mp4" id="vid">
            </video>
        ', $videoname );
    
 else 
    exit('missing ID');

以下是我遇到问题的代码。

<br>
<script>
function postAjax(url, data, success) 
    var params = typeof data == 'string' ? data : Object.keys(data).map(
            function(k) return encodeURIComponent(k) + '=' + encodeURIComponent(data[k]) 
        ).join('&');

    var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
    xhr.open('POST', url);
    xhr.onreadystatechange = function() 
        if (xhr.readyState>3 && xhr.status==200)  success(xhr.responseText); 
    ;
    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.send(params);
    return xhr;

</script>

<a href="" onclick="postAjax('localhost/VarcFiles/watchScreen.php?$v_id=\'$vid\'', 'vote=1', function(data) console.log(data); );"><img src="imageStoring/like.png" style="height:30px;"/></a>
<a href="" onclick="postAjax('localhost/VarcFiles/watchScreen.php?$v_id=\'$vid\'', 'vote=-1', function(data) console.log(data); );"><img src="imageStoring/dislike.png" style="height:30px;"/></a>

下面是mySQL

CREATE TABLE video(
v_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
video_name VARCHAR(225) NOT NULL,
id INT NOT NULL,
FOREIGN KEY user_id(id)
REFERENCES users(id)
ON DELETE CASCADE,
n_views INT,
likes INT,
dislikes INT,
image_name VARCHAR(225) NOT NILL
);

【问题讨论】:

警告:使用mysqli 时,您应该使用parameterized queries 和bind_param 将任何数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了一个严重的SQL injection bug。 切勿$_POST$_GET任何类型的数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。 【参考方案1】:

在我看来,您没有任何用于实际 UPDATE 操作的代码。

SQL 应该类似于“UPDATE video SET likes = likes+1 WHERE v_id = ?”。

【讨论】:

我不确定它是否会出现在“xhr.onreadystatechange = function() ”或“return xhr;”下面。 它不会进入您的 javascript。你的 xhr 所做的只是向 localhost/VarcFiles/watchScreen.php?v_id=&vid&vote=1 发送一个 POST 请求。您必须在 watchScreen.php 中执行更新逻辑,类似于选择要观看的视频的代码。 我添加了这个 "if(xhr) mysqli_query($link, "UPDATE video SET likes = likes + 1 WHERE (v_id = '$vid')"); " 现在确实如此,但是没有限制。我需要它,以便用户只能喜欢一次。 您可以使用v_iduser_id 创建一个新表VideosLikedBy。当您点赞时,首先检查该视频是否已被该用户SELECT COUNT(*) as count FROM VideosLikedBy WHERE v_id = $vid AND user_id = $user 点赞。如果 count 大于 0,则表示用户已经点过赞,您不应增加视频表中的点赞数。否则,您会增加点赞数,但您还需要在 VideosLikedBy 中插入新行 很抱歉问晚了,但我开始注意到用户进入页面时喜欢/不喜欢按钮。

以上是关于在 javascript 中发布喜欢/不喜欢系统 php的主要内容,如果未能解决你的问题,请参考以下文章

php和MySQL中简单的喜欢/不喜欢评级系统

在喜欢/不喜欢投票系统方面需要帮助

PHP中的喜欢/不喜欢系统

MYSQL 按喜欢/不喜欢和受欢迎程度排序

如何防止用户多次喜欢评论,如“facebook或youtube喜欢/不喜欢系统”? [关闭]

Firebase - 组织排名系统。连同喜欢的历史