Целевой Отдельный Экземпляр/Счетчик Формы Внутри Цикла PHP While

#forms #loops #pdo #counter

Вопрос:

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

Поскольку form элемент находится внутри while цикла, когда вы нажимаете кнопку загрузки, текущая функциональность обновляет счетчик для всех изображений на этой странице (т. Е. Все, что находится внутри цикла).

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

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

PHP

 <?php

    // get username from URL parameter
    isset($_GET['username']) ? $username = $_GET['username'] : header("Location: index.php");

    // fetch filename details from database
    $stmt = $connection->prepare("SELECT * FROM imageposts WHERE username = :username");
    $stmt->execute([':username' => $username]); 

    while ($row = $stmt->fetch()) {

        $db_image_filename = htmlspecialchars($row['filename']);

        // -- HTML that shows the image file goes here --

        // update counter for number of downloads of an image
        if (isset($_POST['download'])) {
            try {
                $sql = "UPDATE imageposts SET downloads = downloads  1 WHERE filename = :filename";
                $stmt = $connection->prepare($sql);

                $stmt->execute([
                    ':filename' => $db_image_filename
                ]);

            } catch (PDOException $e) {
                echo "Error: " . $e->getMessage();
            }
        }
?>

// download button that updates the counter
<form method="post">
    <button type="submit" name="download">Download</button>
</form>

<?php } ?>
 

Ответ №1:

Один из способов подойти к этому — добавить какой-нибудь PHP вне вашего цикла, который ссылается на значение из скрытого <form> элемента внутри цикла-в этом случае у вас есть $db_image_filename значение, которое вы могли бы использовать.

 <form method="post">
    <button type="submit" name="download">Download</button>
    <input type="hidden" name="hidden-filename" value="<?php echo $db_image_filename; ?>">
</form>
 

Затем укажите это значение в PHP:

 <?php
if (isset($_POST['download'])) {

      // value from hidden form element
      $hidden_filename = $_POST['hidden-filename'];

      try {
           $sql = "UPDATE imageposts SET downloads = downloads  1 WHERE filename = :filename";
           $stmt = $connection->prepare($sql);

           $stmt->execute([
                ':filename' => $hidden_filename
           ]);
           
           header("location: " . $_SERVER['PHP_SELF']);

      } catch (PDOException $e) {
           echo "Error: " . $e->getMessage();
      }
}
?>