Ajax调用不增加命中计数器在mysql数据库


Ajax call not incrementing hit counter in mysql database

从数据库加载视频列表的索引页代码:

<?php
   ini_set('display_errors', 1);
   mysqli_set_charset($link, 'utf8mb4');
   $query="SELECT * FROM videos";
   $result=mysqli_query($link,$query) or die (mysqli_error($link));
   while($row=mysqli_fetch_assoc($result))
        {
          echo '<div class='"3u 12u(medium)'">';
          echo '<section class='"box feature'">';
          echo '<p id="video_' . $row['v_id'] . '" class="videos">'.$row['v_url'].'</p>';
          echo '<p>'.$row['v_title'].'</p>';
          echo '<p>'.$row['v_date'].'</p>';
          echo '<p>'.$row['v_hits'].'</p>';
          echo '</section></div>';
        }
?>
<script>
    $(".videos").click(function(){
    id = this.id;
    video_id = id.substring(id.lastIndexOf('_')+1,id.length);
    //ajax call
    $.ajax({
    type: "GET",
    url: "update_video_counter.php",
    data: 'video_id=' + video_id,
    cache: false,
    success: function (html) {
    }
    });
    });
</script>

然后update_video_counter.php页面:

<?php
  $id = $_GET["video_id"];
  ini_set('display_errors', 1);
  mysqli_set_charset($link, 'utf8mb4');
  $query="UPDATE videos SET v_hits = v_hits + 1 WHERE v_id = $id";
?>

现在我对Ajax/JQuery不是很有经验,但它看起来对我很好。它不增加任何虽然,但如果我尝试手动查询在数据库中检查是否使用的查询是正确的,它的工作只是很好。

我认为你所需要做的就是执行查询。您还应该使用准备好的语句或将整数值强制转换为int,这样您就不会被注入。

$id = (int)$_GET["video_id"];
ini_set('display_errors', 1);
mysqli_set_charset($link, 'utf8mb4');
$query="UPDATE videos SET v_hits = v_hits + 1 WHERE v_id = $id";
mysqli_query($query);

SQL注入的附加信息:

如何在PHP中防止SQL注入
http://php.net/manual/en/security.database.sql-injection.php
https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet#Defense_Option_1:_Prepared_Statements_.28Parameterized_Queries.29