Проверить, существует ли значение внешнего ключа в другой таблице?

#php #mysql #sql

#php #mysql #sql

Вопрос:

Я хочу проверить, существует ли значение внешнего ключа в другой таблице. Вот что я пытаюсь сделать: у меня есть таблица с именем Gallery и еще одна с именем Posts. Posts — это родительская таблица, поэтому Gallery содержит внешний ключ post_id. На posts.php страница, поскольку не у каждого сообщения есть галерея, я хотел показать сообщение для каждой строки, например, «имеет галерею» или «не имеет галереи». Например: идентификатор записи 5 имеет галерею, как и номер записи 10, но идентификатор записи 1 не имеет галереи, как и идентификатор записи 3. Я думаю о таком способе, как: Таблица галереи, if a gallery_id row has a 'null' value on column post_id, then echo "does not have a gallery." Else echo "has a gallery" , на posts.php . Есть ли способ проверить, существует ли определенное значение в другой таблице?

SQL -код:

 CREATE TABLE `gallery` (
 `gallery_id` int(11) NOT NULL AUTO_INCREMENT,
 `picture` varchar(200) NOT NULL,
 `post_id` int(11) NOT NULL,
 `gallery_date` datetime NOT NULL,
 PRIMARY KEY (`gallery_id`),
 KEY `post_id` (`post_id`),
 CONSTRAINT `gallery_ibfk_1` FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=48 DEFAULT CHARSET=utf8mb4
 

Я просто пытался

 <?php
    $checkGallery = new Read();      
    $checkGallery->performQuery('gallery', "WHERE post_id = :post_id", "id_post={$post_id}");      
    if($checkGallery->result()):        
      $affirmative = $checkGallery->result(); 
?>
 

а потом

 <td class="values">
  <?= (  $affirmative ? 'This post has a gallery!' : 'No gallery enrolled in this post' );?> 
</td> 
 

Не получил удовлетворительных результатов. В нем были опущены некоторые строки вместо того, чтобы повторять «Ни одна галерея не зарегистрирована в этом сообщении».

Комментарии:

1. Вы имеете в виду, кроме прямого запроса к gallery таблице?

2. И есть ли проблемы? Кроме того, при добавлении новой информации с большим количеством кода лучше отредактировать это в вопросе. Комментарии не подходят для длинного кода bits (особенно многострочного).

3. Что входит в этот дополнительный код в комментарии id_post ? Я не уверен, что делает ваша performQuery() функция, но разве это не должно читаться post_id={$post_id} так, как у вас есть?

4. «В нем пропущены определенные строки» — этого недостаточно, чтобы продолжать. Предоставьте образец данных в тех случаях, когда он терпит неудачу.

5. performQuery() выполняет «SELECT * ИЗ таблицы, ГДЕ post_id = :post_id», а id_post на самом деле является post_id. Моя ошибка, я случайно неправильно написал это слово.

Ответ №1:

Бум! Я понял.

Я только что выполнил запрос «ВЫБРАТЬ * ИЗ галереи, ГДЕ id_post =:id_post» (учитывая, что мы вызываем метод bindValue на posts.php )и id_post = $id; (Итак, ВЫБЕРИТЕ * ИЗ галереи, ГДЕ id_post = 5 или … ГДЕ id = 3 и так далее, а результаты хранятся в массиве $checkGallery.)

 <?php
  if($checkGallery):
?>
    <td><?= This post has a gallery! ?></td>
<?php else: ?>
    <td><?= No gallery attached to this post.?></td>
<?php endif;?>
 

И каждая строка возвращает либо «у этого сообщения есть галерея«, либо «К этому сообщению не прикреплена галерея«, и все это динамически. Спасибо