我试图让人们能够注册事件并查看所有事件,但我想让他们在查看事件页面时不会显示他们已经注册的事件将排除它们。
我将人们注册的事件存储在名为的表中 比赛注册
在此表中存储了锦标赛 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/