首页 > 解决方案 > 在 PHP While 循环中定位单个表单实例/计数器

问题描述

我有一个 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 } ?>

标签: formsloopspdocounter

解决方案


解决此问题的一种方法是在循环之外添加一些 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();
      }
}
?>

推荐阅读