извлечение изображений из отношения «один ко многим»

#php

#php

Вопрос:

У меня есть 2 таблицы. Статья (idarticle int, titlea varchar(100), текст содержимого, ПЕРВИЧНЫЙ КЛЮЧ (idarticle))

Изображение (idimage int, titlei varchar(100),pic varchar(100),idarticle int,ПЕРВИЧНЫЙ КЛЮЧ (idimage), ВНЕШНИЙ КЛЮЧ (idarticle) ССЫЛАЕТСЯ НА статью (idarticle)).

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

 <php>
if(isset($_GET["id"]))
{
$id = $_GET["id"];
$pdo_statement = $connect->prepare("select article.titlea, article.content,image.titlei, image.pic from article,image WHERE article.idarticle=image.idarticle AND article.idarticle=$id GROUP BY article.idarticle");
$pdo_statement->execute();
$result = $pdo_statement->fetchAll();
if(!empty($result)) 
{ 
foreach($result as $row) 
{
<p><?php echo $row["titlea"]; ?></p>
<p><?php echo $row["titlei"]; ?></p>
<p><?php echo $row["content"]; ?></p>
}
}
}
<php>
  

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

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

1. Нам нужно больше информации, чтобы ответить на этот вопрос. Что именно хранится внутри pic столбца вашей image таблицы? URL-адрес? Локальное имя файла? Большой двоичный объект?

2. Внутри столбца ‘pic’ у меня есть только имя файла, а изображение хранится в папке upload

3. Внимание: этот код открыт для SQL-инъекции. Если вы уже используете подготовленные операторы, пожалуйста, не включайте никаких параметров (особенно из запроса) через строки!

Ответ №1:

Прежде всего, пожалуйста, используйте prepare() и execute() правильно. Для предотвращения SQL-инъекций существуют подготовленные инструкции, но вы используете их неправильно. В вашем случае кто-то потенциально может делать с вашей базой данных все, что захочет, передав поддельный id параметр URL вашего скрипта…

Чтобы этого не произошло, используйте

 $pdo_statement = $connect->prepare("select article.titlea, article.content,image.titlei, image.pic from article,image WHERE article.idarticle=image.idarticle AND article.idarticle=:id GROUP BY article.idarticle");
$pdo_statement->execute([':id' => $id]);
  

Отображение изображения

Как вы сказали, внутри хранится имя image.pic файла, которое ссылается на папку загрузки. Вам нужно убедиться, что папка загрузки находится в корне документа. Если вы можете получить доступ к изображениям в папке загрузки с помощью URL / upload / filename, вы можете просто сделать что-то подобное в своем цикле foreach:

 foreach($result as $row) 
{
  foreach (['titlea', 'titlei', 'content'] as $field) {
    echo "<p>{$row[$field]}</p>n";
  }

  echo "<img src="/upload/{$row['pic']}">n";
}
  

Для того, чтобы это работало, требуется image.pic содержать что-то вроде myimage.jpg и изображение upload/myimage.jpg относительно корня вашего документа.

Обратите внимание, что я также изменил ваш код для отображения полей заголовка и содержимого, потому что код, написанный в вашем вопросе, не будет работать — вы не можете писать HTML внутри своих блоков php. Одна вещь, которую вы могли бы сделать, чтобы заставить ваш код работать, это:

 foreach($result as $row): ?>
  <p><?php echo $row["titlea"]; ?></p>
  <p><?php echo $row["titlei"]; ?></p>
  <p><?php echo $row["content"]; ?></p>
<?php
endforeach;
}
  

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

1. Спасибо, да, мне нужен html для отображения изображений статей. Как я могу это сделать, пожалуйста? Внутри image.pic я сохранил имя файла, а изображения хранятся в папке «загрузка»

2. Я добавил пример того, как вы можете отобразить изображение и исправить остальную часть вашего кода. Если в браузере отображается поврежденное изображение, ваше имя файла или путь неверны и должны быть соответствующим образом скорректированы.