Исключить событие, если оно уже зарегистрировано

bigfella спросил: 12 мая 2018 в 04:23 в: php

Я пытаюсь сделать это там, где люди могут регистрироваться для событий и просматривать все события, но я хочу сделать это, если они просмотрят страницу события, он не покажет события, которые они уже зарегистрировали для него будет исключать их.

Я храню события, за которые зарегистрированы люди, в таблице namedtournament_registration

в этой таблице хранятся турниры, их имя пользователя, имя, фамилия, номер телефона.

и информация о событиях intournament

Я могу выбрать все детали событий из базы данных турниров.

Это то, что у меня есть до сих пор.

/ p>

 <?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><?
}
?> 

Любые идеи о том, как я могу исключить события, для которых пользователь уже зарегистрирован?

2 ответа

Есть решение
spencer7593 ответил: 12 мая 2018 в 04:58

Мы можем исключить строки в запросе SQL.

Вместо SELECT * FROM tournaments

Мы можем использовать запрос с шаблоном антисоединения:

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 ...

-or- a не существует шаблон

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);

, и это значение будет предоставлено вместо заполнителя вопроса ? в тексте запроса.

Или мы можем использовать именованный placeholder в текст SQL

   AND r.user_id = :registered_user

И после подготовленного и перед выполнением мы можем сделать bindValue

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

, после чего выполняется выполнение.

Никаких других изменений в коде не требуется.

slothluvchunk ответил: 12 мая 2018 в 04:58
Это более тщательный ответ, чем мой собственный, и удаляет SELECT * в пользу явно объявленных полей. ++
spencer7593 ответил: 12 мая 2018 в 05:00
@slothluvchunk: я не могу на должном уровне совести пост SQL, который не квалифицирует ссылки на колонки, или использует * в списке SELECT списка явного списка выражений, которые будут возвращены. (II будет использовать a.* в списке SELECT, но только тогда, когда столбцы в a определены в запросе, то есть когда a является встроенным представлением).
slothluvchunk ответил: 12 мая 2018 в 05:04
Согласился - это был хороший шаг, поэтому я поддерживаю его. :) Легко привыкнуть предлагать решения, не обращаясь ни к чему другому, и я ценю ваш тщательный ответ.
slothluvchunk ответил: 12 мая 2018 в 04:55

Если у вас уже установлено "отношение", с таблицей tournament_registration, вы можете использовать свою инструкцию запроса для фильтрации этих пользователей.

$stmt = $DB_con->prepare('SELECT * FROM tournaments'); может выглядеть примерно так:

$sql = 'SELECT * FROM 
          tournaments as t, 
          tournament_registration as tr 
        WHERE 
          t.userid = tr.userid';
$stmt = $DB_con->prepare($sql);

В этом примере неявное объединение вернет только результаты из tournaments и tournament_registration, которые используют один и тот же идентификатор пользователя, который должен быть вашим желаемым списком турниров / событий, для которых зарегистрирован данный пользователь. note - Вы хотите ограничить этот запрос дополнительным идентификатором события, или конкретный идентификатор пользователя в зависимости от того, как вы хотите перебирать эти данные в своем представлении.