forms - 在 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 } ?>
解决方案
解决此问题的一种方法是在循环之外添加一些 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();
}
}
?>
推荐阅读
- php - 尝试从 html 表单更新 sql 表
- javascript - 不正确和正确的陈述
- javascript - Javascript - 无法读取 json 键值 - JSON 中位置 1 的意外令牌 i - sql 查询输出问题
- nodatime - 尝试使用 ZonedDateTimePattern 从字符串解析 ZonedDateTime 失败
- reactjs - 处理 useEffect 中的 fetch api 错误并设置错误
- linux - 在 csh 中排序之前保留文件的标题
- amazon-web-services - 无法从 Lightsail 实例访问 DynamoDB
- angular - Tortoise SVN中的角度组件创建版本错误
- python - AttributeError: 'MigrationLoader' 对象没有属性 'items' django 迁移错误
- python - 如何用python签署数字签名?