【发布时间】:2012-08-01 13:11:36
【问题描述】:
我找不到简洁的方式来总结标题中的问题,请允许我详细说明:
我有一个使用 PHP 脚本“getImg.php”的网站,该脚本从我的数据库中获取图像二进制对象,并在单独页面上的 HTML img 标记调用时显示它。
我想记录人们查看图像的次数,因此我添加了一个简单的行来增加相应图像的“视图”属性。
我以为这很简单,但事实证明它增加了两次。我解决这个问题的方法是使“视图”列浮动并增加 0.5 以增加 1。但是,我今天查看了我的数据库,在一些图像中发现了 0.5!
当我注释掉最后的打印时,它可以正常工作。我假设来自 HTML 标记的调用加上脚本本身算作两次调用?但其他人似乎并非如此。
这只是我的设置吗?
<?php
# Connect to db
include('db.php');
# Get ID
$id = $_GET['id'];
if(!is_numeric($id)) exit;
$q = $db->prepare("SELECT tNail,image,format FROM gallery WHERE id = '$id'");
$q->execute();
$row = $q->fetch(PDO::FETCH_ASSOC);
if(array_key_exists("thumb", $_GET))
$img = base64_decode($row["tNail"]);
else
{
$img = base64_decode($row["image"]);
# Add to views if not thumb
// 0.5 because script called twice due to print?
$db->query("UPDATE gallery SET views = (views + 0.5) WHERE id = '$id'");
}
switch($row["format"])
{
case ".jpg":
header("Content-type: image/jpeg");
break;
case ".png":
header("Content-type: image/png");
break;
}
print $img;
?>
感谢您的帮助。
【问题讨论】:
-
为什么要将一整列专门用于文件扩展名?为什么不直接阅读加载时苍蝇的 mime 类型?此外,缩略图不需要存储为单独的列,您应该让 php 生成调整大小的图像。以上所有方法都将在您的数据库中节省 大量 空间并且效率更高。
-
我使用生成器来处理大量图像,因此在生成器和数据库上施加尽可能多的负载似乎是一种更有效的方法,因为它只需要查询即可找到它。以你的方式去做会有很大的不同吗?唯一的好处是节省存储空间,对吧?生成器脚本会调整图像大小。我宁愿减轻预处理器的负担。我更喜欢访问者加载时间而不是数据库空间。
-
这样可以节省空间并且不会在服务器上留下任何明显的污点。与许多人的看法相反,图像处理是服务器完成的一项简单任务。如果有的话,它给服务器带来的压力可以忽略不计。我看看能不能找到好的文案。大多数大型网络服务都使用这种方法。
-
好的,谢谢。你知道是什么导致了我的双倍增量吗?
-
为什么不回显而不是打印?