PHP脚本显示两次执行的图像BLOB?

PHP脚本显示两次执行的图像BLOB?,php,database,image,blob,Php,Database,Image,Blob,我找不到一种简洁的方式来总结标题中的问题,请允许我详细说明: 我有一个网站,它使用一个PHP脚本“getImg.PHP”,从我的数据库中获取一个图像二进制对象,并在被HTML img标记调用时在单独的页面上显示它 我想记录人们查看图像的次数,因此我添加了一条简单的行,以增加相应图像的“视图”属性 我以为这很简单,但结果是它增加了两倍。我的方法是将“视图”列设为一个浮点,并增加0.5,结果是增加1。然而,我今天查看了我的数据库,在一些图片中找到了0.5 当我注释结束打印时,它工作正常。我假设来自H

我找不到一种简洁的方式来总结标题中的问题,请允许我详细说明:

我有一个网站,它使用一个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;

?>
这是您的问题:

if(array_key_exists("thumb", $_GET))
    $img = base64_decode($row["tNail"]);
else
{$img = base64_decode($row["image"]);//<==
找到这个


如果任一分支缺少可能导致问题的大括号。同样:如果if语句不包含在代码块中,则只有else语句后面的第一条语句(所有代码直到第一个分号)将被解释为分支。这是您案例中
$img
变量的赋值。在这两种情况下都将调用数据库插入

您可以使用
\uuuu-halt\u编译器检查数据库查询是否执行:

if(array_key_exists("thumb", $_GET))
{
    $img = base64_decode($row["tNail"]);
}
else
{
    $img = base64_decode($row["image"]);
    if ($db->query("UPDATE gallery SET views = (views + 0.5) WHERE id = '$id'"))
    {
        if (array_key_exists("thumb", $_GET))
        {//this should be an impossible branch
            __halt_compiler();//or exit || throw if this is a (member) function
        }
    }
}
\uuu halt\u compiler()
函数不能用于全局命名空间以外的任何其他作用域,并且只影响正在执行的当前脚本,如果此脚本是
index.php
的包含,则index.php将按原样运行,但包含脚本将停止。为了更全面的解释(我不擅长解释事情)


所有这些都无法帮助您在解决此问题时避免此问题,因此我建议您暂时解决以下问题:

if(array_key_exists("thumb", $_GET))
{
    $img = base64_decode($row["tNail"]);
    $db = null;//disconnect
}
else
{
    $img = base64_decode($row["image"]);
    if ($db !== null)
    {//or $db instanceof PDO (or whatever object you're using)
     //or try{$db->query('UPDATE...');}catch(Exception $e){}//<- suppress exception
        $db->query("UPDATE gallery SET views = (views + 0.5) WHERE id = '$id'");
    }
}
if(数组\键\存在(“thumb”,$\获取))
{
$img=base64_解码($row[“tNail”]);
$db=null;//断开连接
}
其他的
{
$img=base64_解码($row[“image”]);
如果($db!==null)
{//或$db instanceof PDO(或您正在使用的任何对象)
//或者尝试{$db->query('UPDATE…');}catch(异常$e){}//query(“更新库集视图=(视图+0.5),其中id='$id');
}
}

让我知道上面哪一个有效,或者如果你仍然遇到同样的问题。我发现这是一个非常奇怪,因此也很有趣的案例:)

这似乎是一个brwoser问题。像Chrome这样的浏览器可以预取图像,这样就可以加载一次,如果用户点击图像链接,就会加载两次

检查


用浏览器加载一个图像,然后检查apache access.log,如果同时看到2个请求,则这是浏览器问题。

为什么要将整个列用于文件扩展名?为什么不在加载时读取flie的mime类型?此外,缩略图不需要存储为单独的列,您应该让php生成一个调整大小的图像。所有这些都将在数据库中节省大量空间,而且效率更高。我使用生成器处理大量图像,因此尽可能多地在生成器和数据库上加载负载似乎是一种更有效的方法,因为只需查询即可找到它。按你的方式做会有很大的不同吗?唯一的好处是节省存储空间,对吗?生成器脚本会调整图像的大小。我宁愿卸下预处理器的负载。我更喜欢访客加载时间,而不是数据库空间。这将节省空间,不会给服务器带来任何明显的污点。与许多人的看法相反,图像处理是服务器要完成的一项简单任务。它对服务器造成的压力可以忽略不计(如果有的话)。我看看能不能找到一篇好文章。大多数大型web服务都使用这种方法。好的,谢谢。你知道是什么导致了我的双增量吗?为什么不使用echo而不是print?嗯,我更改了错误报告,甚至为if语句添加了常用的大括号,但没有任何更改。当我对打印结构进行注释时,它会适当地递增,非常奇怪。确实非常奇怪,我会在完成工作后再看一看。很难理解这里发生了什么。。。做出来总是很有趣的@李:让我知道如果重写规则行得通,也许有一天会派上用场的。谢谢你。mod_rewrite.so已经启用,但是当我创建.htaccess并将其放在站点的HTML文件夹中时,似乎什么都没有改变。我没有使用.htaccess的经验。只需将其粘贴到一个空白的.htaccess文件中就足够了吗?并在您的Web服务器上启用
mod_rewrite
,最好将您的RewriteEngine设置为on,并可能声明一个重写基等等。。。一切正常:阅读链接,开始时有点棘手,但值得一提的是你是正确的。这在FF 14.0.1中表现不正确,但在K-meleon中表现良好。这是我无法避免的事情吗?谢谢你,是的,它要求两个请求
if(array_key_exists("thumb", $_GET))
{
    $img = base64_decode($row["tNail"]);
}
else
{
    $img = base64_decode($row["image"]);
    if ($db->query("UPDATE gallery SET views = (views + 0.5) WHERE id = '$id'"))
    {
        if (array_key_exists("thumb", $_GET))
        {//this should be an impossible branch
            __halt_compiler();//or exit || throw if this is a (member) function
        }
    }
}
if(array_key_exists("thumb", $_GET))
{
    $img = base64_decode($row["tNail"]);
    $db = null;//disconnect
}
else
{
    $img = base64_decode($row["image"]);
    if ($db !== null)
    {//or $db instanceof PDO (or whatever object you're using)
     //or try{$db->query('UPDATE...');}catch(Exception $e){}//<- suppress exception
        $db->query("UPDATE gallery SET views = (views + 0.5) WHERE id = '$id'");
    }
}