当前位置: 首页 > 知识库问答 >
问题:

使用左连接获取while循环中的数据

龚国源
2023-03-14

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

每个注释有两个按钮:

  1. 拇指按压按钮
  2. 拇指向下按钮

我想给一个活动的类名,如果一个用户已经在任何评论上竖起了大拇指,那么在将来,如果他在同一个评论的大拇指上点击,它将反转喜欢的数量。

我正在讨论这两张桌子

评论

+----+--------+---------------+---------+
| 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代码没有给出所需的结果。

我面临三个问题。。。

>

  • 当用户竖起一个注释,即竖起的按钮不显示活动类(已解决)

    只有第一条评论的拇指向上/向下在点击时工作,第二条第三条评论的所有剩余按钮在点击时不工作(已解决)

    Ajax调用未向php发送数据(已编辑)

    CSS显示了登录用户对任何特定评论的“向上/向下”按钮的活动类发生了什么

  • 共有1个答案

    赵英资
    2023-03-14

    你的第一个问题

    有几个问题:

    >

  • $select3查询没有从likesordislike表中带来列(根据您的代码,您需要vtype列),它只带来了c.*(这是来自注释表的所有字段)。这可能就是为什么您必须使用try... cat,因为它无法找到vtype索引。所以这行代码应该改为:

    $select3 = "SELECT c.*,lod.vtype FROM comments c LEFT JOIN likesordislikes lod ON c.id=lod.comid WHERE `uid` = :sid";
    

    $select3查询总是获取所有注释记录,即使用户没有与这些注释交互(因为您使用的是左连接),然后每次都选择第一个(索引0)。由于您似乎并不真正使用表comments(不需要连接)中的信息,而且理论上每个用户和注释都应该有一条记录,因此我将该行更改为:

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

    当然,然后绑定注释id:

    $stmtt->bindValue(":commentid", $fetc['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();
        // ...
      }
    });
    

    关于你的第三个问题

    数据没有按预期到达,可能是因为缺少了一个符号(

    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代码同时收到喜欢的不喜欢的(就像用户同时点击这两个按钮一样)。由于这不可能,我将PHP从if然后if更改为if然后否则if,如下所示:

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

    请记住,您仍然在发送这两个信号,因此这样您将始终执行第一个if。因此,您应该更改Javascript,使其只发送两个信号中的一个。我真的不知道像这样的是如何工作的,但您的代码应该是这样的:

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

  •  类似资料:
    • 我试图通过使用Kryonet进行通信来创建一个基本的IRC。我遇到的问题是,在我的代码中,我不能安全地使用允许用户键入和发送消息的main while循环,因为Scanner给出了一个错误,并且似乎跳过了对nextLine()的调用。我想做的是让扫描仪在继续之前等待用户输入。 更准确地说,程序将首先在行的开头放一个“:”,然后在用户按enter键后获取用户键入的任何内容,然后将其发送到服务器。我得

    • 我试图使用菜单循环比当我完成第一个选择一个我想在选择2中获得数据。它不能得到,这是一个错误。 线程“main”java.lang.indexoutOfboundsException:在java.base/jdk.internal.util.preconditions.outofbounds(preconditions.java:64),在java.base/jdk.internal.util.pr

    • 问题内容: 在遍历列表的Python循环中,我们可以编写: 并巧妙地遍历列表中的所有元素。有没有办法知道循环中到目前为止我循环了多少次?例如,我要列出一个清单,在处理完10个元素之后,我想对它们进行处理。 我考虑过的替代方案可能是: 要么: 是否有更好的方法(就像)来获得到目前为止的迭代次数? 问题答案: pythonic的方法是使用:

    • 我希望找到一种方法来使用while循环(而不是for循环)来通过命令行输入整数的各个数字。现在,如果输入一个四位数的整数,我有一个很难的编码,如何得到个别的数字,但如果我输入一个五位数的数字,它显然是行不通的。我想一个while循环应该可以解决这个问题,但我不确定如何... 这是我到目前为止的代码

    • 我对编码完全陌生,正在使用Python作为一个学校项目开发一个基于文本的游戏。用户必须通过键入“北”、“东”、“南”或“西”进入房间。如果方向无效,则应弹出错误消息,提示用户输入新方向。如果用户键入退出,游戏应该结束。 这个项目有一百万个问题,因为我发现我在编码方面很糟糕,但我想弄清楚的是,如果出现提示,如何让我的程序退出游戏。这是我的代码(它不是完整的代码,只是我到目前为止所拥有的代码。我试图一

    • 我需要对while或do循环进行编码,以确定用户输入的数字是否在特定范围内(30