【问题标题】:Fetching data in while loop by using left join使用左连接在while循环中获取数据
【发布时间】:2018-04-21 12:07:01
【问题描述】:

我正在使用 while 循环从 mysql 表中获取用户 cmets,并希望在评论 div 中给出的按钮上放置一些条件类。

每条评论都有两个按钮:

  1. 点赞按钮
  2. 拇指向下按钮

如果用户已经点赞了任何评论,我想给一个班级名称active,这样如果将来他点击相同评论的点赞,它将反转数字之类的。

我正在讨论这两个表

cmets

+----+--------+---------------+---------+
| id | userid |   usercom     | comname |
+----+--------+---------------+---------+
| 35 |      5 | check comment |      12 |
| 36 |      6 | comment test  |      12 |
| 37 |      6 | third comment |      12 |
| 38 |      5 | number four   |      12 |
| 39 |      7 | fifth         |      13 |
| 40 |      4 | 6th           |      13 |
| 41 |     18 | seven         |      13 |
+----+--------+---------------+---------+

喜欢或不喜欢

+----+-------+------+-------+
| id | vtype | uid  | comid |
+----+-------+------+-------+
|  1 |     0 |    5 |    35 |
|  2 |     1 |    6 |    35 |
|  3 |     1 |    7 |    35 |
|  4 |     0 |    8 |    36 |
|  5 |     1 |    5 |    36 |
|  6 |     1 |    9 |    35 |
|  7 |     1 |   10 |    36 |
|  8 |     1 |   11 |    36 |
|  9 |     1 |   20 |    35 |
| 10 |     0 |    9 |    35 |
| 11 |     1 |   21 |    37 |
+----+-------+------+-------+

我正在从这些表中获取数据并在此处回显...

.vbtn {
  display: inline-block;
  margin-bottom: 0;
  font-size: 13px;
  font-weight: 300;
  white-space: nowrap;
  vertical-align: middle;
  -ms-touch-action: manipulation;
  touch-action: manipulation;
  cursor: pointer;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
  background: none!important;
  color: inherit;
  color: #06C;
  border: none;
  padding: 0!important;
  font: inherit;
}

.like.active span {
  display: none;
}

.like.active:before {
  font-family: FontAwesome;
  content: "\f164";
  color: #009900;
}

.dislike.active span {
  display: none;
}

.dislike.active:before {
  font-family: FontAwesome;
  content: "\f165";
  color: #FF0000;
}
<?php
// ...
$sid = "18"; //session id
$c_name = "12"; //article-post id
$sel = "SELECT * FROM `likesordislikes` where `uid` = :sid AND `comid` = :comment";
if (isset($_POST['likes'])) {
  $comid = mysqli_real_escape_string($con, $_POST['comid']);
  try {
    $stmt = $DB->prepare($sel);
    $stmt->bindValue(":sid", $sid);
    $stmt->bindValue(":comment", $comid);
    $stmt->execute();
    $fetch = $stmt->fetchAll();
    if (count($fetch) == 0) {
      $insert = "INSERT INTO `likesordislikes` (`vtype` , `uid` , `comid`) VALUES " . "( :like, :likerid , :comment)";
      $stmt = $DB->prepare($insert);
      $stmt->bindValue(":like", "1");
      $stmt->bindValue(":likerid", $sid);
      $stmt->bindValue(":comment", $comid);
      $stmt->execute();
    } elseif (count($fetch) > 0)  {
      if ($fetch[0]["vtype"] == "1") {
        $delete = "DELETE FROM `likesordislikes` where `uid` = :sid AND `comid` = :commnt";
        $stmt = $DB->prepare($delete);
        $stmt->bindValue(":sid", $sid);
        $stmt->bindValue(":commnt", $comid);
        $stmt->execute();
      } elseif ($fetch[0]["vtype"] == "0") {
        $sql = "UPDATE `likesordislikes` SET  `vtype` =  '1' WHERE `uid` = :id AND `comid` = :commn";
        $stmt = $DB->prepare($sql);
        $stmt->bindValue(":id", $sid);
        $stmt->bindValue(":commn", $comid);
        $stmt->execute();
      }
    }
  }
  catch (Exception $ex) {
    echo $ex->getMessage();
  }
}
if (isset($_POST['dislikes'])) {
  $comid = mysqli_real_escape_string($con, $_POST['comid']);
  try {
    $stmt = $DB->prepare($sel);
    $stmt->bindValue(":sid", $sid);
    $stmt->bindValue(":comment", $comid);
    $stmt->execute();
    $fetch = $stmt->fetchAll();
    if (count($fetch) == 0) {
      $insert = "INSERT INTO `likesordislikes` (`vtype` , `uid` , `comid`) VALUES " . "( :unlke, :likerid , :comment);";
      $stmt = $DB->prepare($insert);
      $stmt->bindValue(":unlke", "0");
      $stmt->bindValue(":likerid", $sid);
      $stmt->bindValue(":comment", $comid);
      $stmt->execute();
    } else {
      if ($fetch[0]["vtype"] == "0") {
        $delete = "DELETE FROM `likesordislikes` where uid = :sid AND comid = :commnt";
        $stmt = $DB->prepare($delete);
        $stmt->bindValue(":sid", $sid);
        $stmt->bindValue(":commnt", $comid);
        $stmt->execute();
      } elseif ($fetch[0]["vtype"] == "1") {
        $sql = "UPDATE `likesordislikes` SET `vtype` = '0' WHERE `uid` = :id AND comid = :commn";
        $stmt = $DB->prepare($sql);
        $stmt->bindValue(":id", $sid);
        $stmt->bindValue(":commn", $comid);
        $stmt->execute();
      }
    }
  }
  catch (Exception $ex) {
    echo $ex->getMessage();
  }
}

$slt = "SELECT" .
" c.*," .
" SUM(CASE WHEN lod.vtype=1 THEN 1 ELSE 0 END) likes," .
" SUM(CASE WHEN lod.vtype=0 THEN 1 ELSE 0 END) dislikes" .
" FROM" .
" comments c LEFT JOIN likesordislikes lod ON lod.comid=c.id" .
" WHERE" .
" c.comname = '$c_name' AND c.media = '$type'" .
" GROUP BY" .
" c.id";
$res = mysqli_query($con, $slt);

while($fetc = mysqli_fetch_array($res)) {
  //$select3 = "SELECT c.* FROM comments c LEFT JOIN likesordislikes lod ON c.id=lod.comid WHERE `uid` = :sid"; (It was my question code)
  $select3 = "SELECT vtype FROM likesordislikes WHERE comid = :commentid AND `uid` = :sid LIMIT 1"; // its the solution i got in answer
  try {
    $stmtt = $DB->prepare($select3);
    $stmtt->bindValue(":commentid", $fetc['id']); //update from the answer
    $stmtt->bindValue(":sid", $sid);
    $stmtt->execute();
    $vfetch = $stmtt->fetchAll();
    if (count($vfetch) == 0) {
      $likeclass = "";
      $dislikeclass = "";
    } 
    elseif (count($vfetch) > 0) {
      if ($vfetch[0]["vtype"] == "1") {
        $likeclass = "active";
        $dislikeclass = "";
      } 
      elseif ($vfetch[0]["vtype"] == "0") {
        $likeclass = "";
        $dislikeclass = "active";
      }
    }
  }
  catch (Exception $ex) {
    echo $ex->getMessage();
  }
  ?>
  <div class="container1">
    <div class="div-right-mid">
      <span class="comment-text">
        <?php echo $fetc['usercom'] ?>  
      </span>
    </div>
    <div id="rating-votes">
      <button class="vbtn like <?php echo $likeclass; ?>" value="<?php echo $comid ?>">
        <span>
          <i class="fa fa-thumbs-o-up" aria-hidden="true">
          </i>
        </span>
      </button>
      <span class="likes">
        <font color="#6d7371">
          <?php echo $fetc['likes']; ?>
        </font>
      </span>&nbsp;
      <button class="vbtn dislike <?php echo $dislikeclass; ?>" value="<?php echo $comid ?>">
        <span>
          <i class="fa fa-thumbs-o-down" aria-hidden="true">
          </i>
        </span>
      </button>
      <span class="dislikes">
        <font color="#6d7371">
          <?php echo $fetc['dislikes']; ?>
        </font>
      </span>
    </div>
  </div>
  <?php
}
?>

更新js

<script type="text/javascript">
$('.rating-votes').likeDislike({
  reverseMode: true,
  click: function (value, l, d, event) {
    var likes = $(this.element).find('.likes');
    var dislikes = $(this.element).find('.dislikes');
    var comid = $(".vbtn").val();
    var data = {comid:comid};
    if(value === 1){
       data.likes = true;
       }else{
       data.dislikes = true;
       }
    $.ajax({
      url: '',
      type: 'POST',   
      data: data,
      success: function (data) {
        likes.text(parseInt(likes.text()) + l);
        dislikes.text(parseInt(dislikes.text()) + d);
      }
    });
  }
});
</script>
<script src="like-dislike.js"></script>

这个 php 代码没有给我所需的结果。

我面临三个问题...

  1. 当用户点赞评论时,点赞按钮未显示活动类(已解决)

  2. 只有第 1 条评论的拇指向上/拇指向下在点击时起作用,第 2 条第 3 次和所有剩余评论的按钮在点击时不起作用(已解决)

    李>
  3. Ajax 调用未向 php 发送数据(已编辑)

CSS 显示登录用户的任何特定评论的活动类的拇指向上/向下拇指按钮会发生什么

【问题讨论】:

  • fetchAll 返回一个包含所有结果集行的数组。根据$likeclass 值更改aria-hidden 属性值的代码在哪里?
  • @camelsWriteInCamelCase 我正在通过更新提供有问题的 js 代码。
  • 你有多个&lt;div id="rating-votes"&gt; 元素吗?
  • @Piyin 是的先生,因为它在while循环中,如果数据库中有5个cmets,那么将创建5个具有相同id的div,包括其中的每个评论。 抱歉 有问题,while 循环在 cmets div 开始之前关闭。现在编辑问题并在 cmets div 结束后关闭 while 循环。
  • @JavedKhan 好的,那么,这是另一个问题。我更新了我的答案以帮助您解决 23

标签: javascript php jquery ajax


【解决方案1】:

第一个问题

有几个问题:

  1. $select3 查询没有从likesordislikes 表中获取列(根据您的代码,您需要vtype 列),它只带来c.*(这是来自comments 的所有字段)桌子)。这可能是您必须使用try...catch 的原因,因为它无法找到vtype 索引。所以那行代码应该改为:

    $select3 = "SELECT c.*,lod.vtype FROM comments c LEFT JOIN likesordislikes lod ON c.id=lod.comid WHERE `uid` = :sid";
    
  2. $select3 查询始终获取所有 comments 记录,即使用户没有与这些 cmets 交互(因为您使用的是 LEFT JOIN),然后选择第一个(索引 @ 987654332@) 每次。由于您似乎并没有真正使用表 comments 中的信息(不需要 JOIN),理论上每个用户和评论应该有一条记录,我会将该行更改为:

    $select3 = "SELECT vtype FROM likesordislikes WHERE comid = :commentid AND `uid` = :sid LIMIT 1";
    

    然后当然是绑定评论id:

    $stmtt->bindValue(":commentid", $fetc['id']);
    

第二个问题

您多次打印&lt;div id="rating-votes"&gt;,这在 HTML 方面是无效的。 id 属性在整个页面中应该是唯一的,如果你有两个,像$('#id') 这样的调用总是会给你一个元素,第一个。所以你应该把while里面的HTML代码改成class而不是id,像这样:

<!-- -->
<div class="rating-votes">
  <button class="vbtn like <?php echo $likeclass; ?>" value="<?php echo $comid ?>" class="vote">
    <!-- -->
  </button>
  <!-- -->
  <button class="vbtn dislike <?php echo $dislikeclass; ?>" value="<?php echo $comid ?>" class="vote">
    <!-- -->
  </button>
  <!-- -->
</div>
<!-- -->

然后,您应该更改您的 Javascript 调用,以便它们通过 class 而不是 id 找到,如下所示:

$('.rating-votes').likeDislike({    //.likeDislike function defined in like-dislike.js
  // ...
  click: function(value, l, d, event) {
    // ...
    var comid = $(this.element).find('.vote').val();
    // ...
  }
});

第三个问题

数据未按预期到达,可能是因为您缺少与号 (&amp;),即您拥有的代码:

data: 'likes=' + likes + '&dislikes=' + dislikes + 'comid=' + comid,

会翻译成这样的:

data: 'likes=1&dislikes=2comid=3,

所以你应该把它改成:

data: 'likes=' + likes + '&dislikes=' + dislikes + '&comid=' + comid,

虽然我建议您使用对象而不是自己连接值,但这样 jQuery 将为您处理所有奇怪的东西。为此,将该行更改为:

data:{
  likes:likes,
  dislikes:dislikes,
  comid:comid
}
  • 更新

你遇到的另一个问题是你发送的是对象,而不是对象的值,所以,而不是:

data:{
  likes:likes,
  dislikes:dislikes,
  comid:comid
}

你应该有:

data:{
  likes:likes.val(),
  dislikes:dislikes.val(),
  comid:comid
}
  • 更新

前一个问题真的不是问题,我的错。你甚至不应该发送这些值,因为你只是将它们用作 PHP 中的标志,所以你应该使用类似的东西:

data:{
  likes:true,
  comid:comid
}

另一个问题是您的 PHP 代码同时接收 likesdislikes(就像用户同时点击两者一样)。由于这不可能,我将 PHP 从 if 然后 if 更改为 if 然后 else if,如下所示:

if (isset($_POST['likes'])) {
  // ...
}else if (isset($_POST['dislikes'])) {
  // ...
}

请记住,您仍在发送两个信号,因此您将始终执行第一个 if。所以你应该改变你的Javascript,让它只发送两个信号之一。我真的不知道likeDislike 是如何工作的,但您的代码应该类似于:

// ...
var data = {
  comid:comid
};
if(theUserLikesIt){
  data.likes = true;
}else{
  data.dislikes = true;
}
$.ajax({
  // ...
  data: data,
  // ...
});

【讨论】:

  • 哦,是的,它工作了$select3 = "SELECT vtype FROM likesordislikes WHERE comid = :commentid AND uid = :sid LIMIT 1"; 对于第二个问题,我正在更新有问题的 js 和 php 代码。请检查 php / js 代码,因为 ajax 调用也不会向 php 发送数据
  • 当我使用 data: 'likes=' + likes + '&amp;dislikes=' + dislikes + '&amp;comid=' + comid, 控制台显示 1 和 2 而当我使用 data:{ likes:likes, dislikes:dislikes, comid:comid } 它显示 1 并且这个错误 Uncaught TypeError: Illegal invocation at e (jquery.js:4) at Vc (jquery.js:4) 在 Vc (jquery.js:4) 在 Vc (jquery.js:4) 在 Vc (jquery.js:4) 在 Vc (jquery.js:4) 在 Function.m.param (jquery.js:4) 在 Function.ajax (jquery.js:4) 在 LikeDislike.click (result=post.php?id=12&media=facts:673) 在 HTMLButtonElement. (like-dislike.js: 125)
  • 先生,我认为我不应该将值发送到 php,因为我通过检查 if (isset($_POST['likes'])) { insert, delete or update column vtype } 插入、更新或删除 vtype 来更新它已经在 php 中的值
  • 我遇到了问题,我正在尝试获取 $comid 的值以在 php 中发送它,但另一方面,如果在点击之前发布了喜欢/不喜欢的内容,我会得到 $comid :D ,我没有得到任何 $comid
  • 这就是精神!另外,你的行应该是:var comid = $(this.element).find('.vbtn').val();,否则你总是会得到第一个而不是你想要的
猜你喜欢
  • 1970-01-01
  • 2019-04-14
  • 2019-10-30
  • 2021-01-20
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
相关资源
最近更新 更多