php - 排除已注册的事件

标签 php mysql

我试图让人们能够注册事件并查看所有事件,但我想让他们在查看事件页面时不会显示他们已经注册的事件将排除它们。

我将人们注册的事件存储在名为的表中 比赛注册

在此表中存储了锦标赛 ID、用户 ID、名字、姓氏、电话号码。

以及事件详情 锦标赛

我可以从锦标赛数据库中选择所有赛事详细信息。

这就是我到目前为止所拥有的。

 <?php
$stmt = $DB_con->prepare('SELECT * FROM tournaments');
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
    ?>      

                    <!-- OVERVIEW -->

                <div class="panel panel-headline">
                                <div class="panel-heading">
                                    <h3 class="panel-title">  <? echo $row['tournament_name']; ?></h3>
                                    <p class="panel-subtitle">
                                    Event Date: <? echo $row['tournament_date'];?>
                                    <br>
                                     Event Start time: <? echo $row['tournament_time'];?>
                                     <br>
                                     Event Entry Fee: 
                                     <? echo $row['entryfee'];?>
                                    </p>
                                </div>
                                <div class="panel-body">
                                    <h4>Panel Content</h4>
                                    <p>
                                     <? echo $row['tournament_desc'];?>

                                    </p>
                                    <a href="signup.php?do=<?php echo $row['tournamentid'];?>"><button type="button" class="btn btn-primary btn-block">Register for this event </button></a>

                                </div>
                            </div>


<?
}
?> 

关于如何排除用户已注册的事件有什么想法吗?

最佳答案

我们可以排除 SQL 查询中的行。

代替SELECT * FROM锦标赛

我们可以使用带有反连接模式的查询:

SELECT t.tournament_date
     , t.tournament_time
     , t.entryfee
     , t.tournament_desc
     , t.tournamentid
  FROM tournaments t
    -- anti-join
  LEFT
  JOIN tournament_registration r
    ON r.tournamentid = t.tournamentid
   AND r.user_id = ?
 WHERE r.tournmaentid IS NULL
 ORDER
    BY ...

-或-不存在的模式

SELECT t.tournament_date
     , t.tournament_time
     , t.entryfee
     , t.tournament_desc
     , t.tournamentid
  FROM tournaments t
 WHERE NOT EXISTS ( SELECT 1 
                      FROM tournament_registration r
                     WHERE r.tournamentid = t.tournamentid
                       AND r.user_id = ?
                  )
 ORDER
    BY ...

我们需要传入 user_id 的值。

$stmt->execute($user_id);

并且该值将代替查询文本中的 ? 问号占位符。

或者我们可以在 SQL 文本中使用命名占位符

   AND r.user_id = :registered_user

在准备之后、执行之前,我们可以做一个bindValue

  $stmt->bindValue(':registered_user',$user_id);   

然后执行。

无需对代码进行其他更改。

关于php - 排除已注册的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50706330/

相关文章:

PHP foreach 循环记住最后一个循环变量

php - 方法内的数据库查询

mysql - 一张表的数据库选择查询逻辑

PHP 阻止直接访问 php 页面

php - 对所有用户使用相同的 MySQL 链接?

PHP 动态变量 (MySQL) 开关

php - 上传: IO error and HTTP error when uploading big file

php - 在数据库服务器上存储大量表

php - mysql连接错误问题

php - MySQL 存储过程 : Unknown column 'Table_Name' in 'field list'