PHP中的喜欢/不喜欢系统

Posted

技术标签:

【中文标题】PHP中的喜欢/不喜欢系统【英文标题】:Like/unlike system in PHP 【发布时间】:2018-06-25 09:56:59 【问题描述】:

我正在用 phpmysqli 创建一个喜欢不喜欢的系统;我还通过在 uid 的帮助下加入关注者和照片表来获取用户关注者的帖子。现在我希望用户喜欢关注者的图片,但我无法获得图片的个人 ID。 这是我获取用户关注者图片的代码:

$query = "SELECT photos.image_url,photos.email,photos.username,photos.uid,photos.id FROM photos join followers on photos.uid = followers.user_id where followers.uid = '$id' ORDER BY photos.image_url DESC ";
$fire = mysqli_query($con,$query) or die("can not fetch data from database ".mysqli_error($con));
if (mysqli_num_rows($fire)>0) 

  $row = mysqli_fetch_assoc($fire);
  $follower_email = $row['email'];
  $pics_id = $row['id'];

  while ( $users = mysqli_fetch_assoc($fire)) ?>

<div class="card" >
  <div class="float">
  <div class="avatar">
    <img src="<?php echo $avatar_image; ?>" class="avatar">
  </div>
      <div class="username" style="">
      <p><?php echo $users['username']; ?></p>
  </div>
</div>

  <img src="<?php echo $users['image_url']?>"  style="width:100%">
  <div class="container">
    <h4><b><?php echo "<div><a href='users.php?id=".$users['uid']."'>
               <h3>".$users['username']."</h3>
      </div></a>";?></b></h4> 
<form action="<?php $_SERVER['PHP_SELF'] ?>" method="POST">
  <input type="submit"  name="like" value="like">

</form>



  </div>
</div>
</div><br>

  <?php 



?>

这是我插入喜欢的代码

 <?php
if (isset($_POST['like'])) 
  $query = "INSERT INTO likes(id,user_id,post_id) VALUES('','$id','$pics_id')";
  $fire = mysqli_query($con,$query)or die();





?>

这是我获取所有变量的代码

<?php
$query = "SELECT * FROM photos";
$fire = mysqli_query($con,$query) or die("can not fetch data from database ".mysqli_error($con));
if (mysqli_num_rows($fire)>0) 
  $users = mysqli_fetch_assoc($fire);
    $pic_id = $users['id'];

  
  ?>
     <?php 
$query = "SELECT * FROM users WHERE email='$email'";
$fire = mysqli_query($con,$query) or die("can not fetch data from database ".mysqli_error($con));
if (mysqli_num_rows($fire)>0) 
  $row = mysqli_fetch_assoc($fire);
  $id = $row['id'];
?>
<?php
$query = "SELECT * FROM users WHERE id='$id'";
$fire = mysqli_query($con,$query) or die("can not fetch data from database ".mysqli_error($con));
if (mysqli_num_rows($fire)>0) 
  $users = mysqli_fetch_assoc($fire);
    $id = $users['id'];
    $fullname = $users['fullname'];
    $avatar_image = $users['avatar_path'];
  
  ?>
 <?php 
$query = "SELECT * FROM photos WHERE email='$email'";
$fire = mysqli_query($con,$query) or die("can not fetch data from database ".mysqli_error($con));
if (mysqli_num_rows($fire)>0) 
  $row = mysqli_fetch_assoc($fire);
  $photos_id = $row['id'];
  $photos_uid = $row['uid'];
  $photos_email = $row['email'];

?>
  <?php
$query = "SELECT * FROM photos WHERE id='$id'";
$fire = mysqli_query($con,$query) or die("can not fetch data from database ".mysqli_error($con));
if (mysqli_num_rows($fire)>0) 
  $users = mysqli_fetch_assoc($fire);
  $username =  $users['username'];

  ?>
     <?php
     $query = "SELECT * FROM followers WHERE id='$id'";
$fire = mysqli_query($con,$query) or die("can not fetch data from database ".mysqli_error($con));
if (mysqli_num_rows($fire)>0) 
  $row = mysqli_fetch_assoc($fire);
  $user_id = $row['user_id'];
  $follower_id = $row['follower_id'];
  $uid = $row['uid'];

这些是我的餐桌照片

这是照片表:

这是关注者表:

这是用户表:

【问题讨论】:

【参考方案1】:

您的代码和查询妨碍您获得正确答案。进行以下更改,这将使您的查询更加紧凑,并使用准备好的 sql 语句或转义值来防止注入。

$query = "SELECT *
          FROM photos as 'ph'
          inner join followers as 'fol'
          on fol.user_id = ph.uid
          where fol.uid = '$id'
          ORDER BY ph.image_url DESC ";

现在去掉这三行代码

$row = mysqli_fetch_assoc($fire);
$follower_email = $row['email'];
$pics_id = $row['id'];

因为上述不是必需的,您可以在 while 循环中为每个条目获取相同的值。

在输入类型 submit 中,传递一个动态 id 来捕获 pic id,like 将像这样计数

<input type="submit" id="<?=$users['id'];?>|like" value="like">

喜欢的时候就在“|”的基础上爆一下并取分解数组的第零个值来获取图片 id。这种喜欢不喜欢的代码最好使用 JQuery / AJAX 。我曾经开发了一个类似YouTube的页面,其中喜欢,投票和基于投票的视频定位都是通过JQuery / AJAX完成的,并且视频根据投票重新排列,甚至没有刷新页面。

【讨论】:

感谢您的回复,我的主要问题是如何从照片表中获取 id 列,我无法获取 id,因为它的自动递增和主键 别担心,使用我的 sql 查询并在您将获得的值数组上编写一个 while 循环。在每次迭代中捕获将成为照片 id 的 id 并将其保留为提交按钮的 id,您的问题将得到解决。 请检查我在答案中编写的 SQL 查询,如果它解决了您的目的,请立即告知。 我尝试了您的查询,当我选择帖子的 id 时,它只选择第一个 id 并在每个帖子中循环该 id,因此每个帖子的数据库中都有相同的 id 我给出的查询是针对第一个查询的,您必须在单击按钮时传递动态 ID。【参考方案2】:

第一件事:

您的代码似乎很不安全。您既没有使用准备好的 sql 语句来防止 SQL 注入,也没有转义 html 输出中的值。例如。 &lt;h3&gt;".$users['username']."&lt;/h3&gt; 似乎对 XSS 不安全。

我的建议:

使用准备好的语句 使用默认转义的模板引擎(例如 Twig)

关于你的问题:

$query = "INSERT INTO likes(id,user_id,post_id) VALUES('','$id','$pics_id')";

你为什么在这里插入一个空的 id?这不应该至少是一些价值吗?

action="<?php $_SERVER['PHP_SELF'] ?>"

这是多余的。如果您想发布到相同的 url,只需删除该操作

$id 是从哪里来的?设置正确吗?

join followers on photos.uid = followers.user_id

这个连接条件是否正确?我无法弄清楚,哪个列是正确的加入,因为列的名称不是很清楚。 user_id和uid在followers表中基本是一回事。

很难弄清楚问题出在哪里。代码写得不是很好,有些地方我不清楚。

【讨论】:

我插入了一个空 id,因为 id 列是主键并设置为自动增量 是的,join 语句是正确的并且工作正常 如果 id 是主键并自动递增,您应该将其留在插入中:$query = "INSERT INTO likes(user_id,post_id) VALUES('$id','$pics_id')"; 好吧,我不这样做,但我在获取自动递增的照片 ID 时遇到问题我如何获取该 ID

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

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

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

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

从今以后再也不喜欢美元了

喜欢/不喜欢帖子而不刷新页面

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