使用PHP和PDO从MySQL检索MEDIUMBLOB失败

时间:2012-12-16 03:50:50

标签: php mysql image pdo blob

我将图像数据存储在图像表的MEDIUMBLOB列中,如下所示:

CREATE TABLE IF NOT EXISTS `images` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `description` varchar(160) DEFAULT NULL,
  `image` mediumblob,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

我有images.php脚本接收要显示的图像的id,调用应该接收图像id参数的API(以及与此问题无关的其他内容)并返回二进制文件从image列到应显示它的images.php脚本的字符串。

这是API(实际上是一个imageController)的一部分,它从db获取图像数据,将其加载到我的Image类,它根据前几个字节签名确定图像类型并返回相应的mime类型。

        $pdo = Database::getPDO($db);
        $select_image_statement = $pdo->prepare(
            "SELECT image FROM images WHERE id = :id"
        );
        $select_image_statement->bindParam(":id", $image_id);
        $select_image_statement->execute();

        $select_image_statement->bindColumn(1, $img, PDO::PARAM_LOB);

        $select_image_statement->fetch(PDO::FETCH_BOUND);

        $image = new Image();
        $image->load($img);

        $return = array(
            'image' => $img,
            'mime_type' => $image->getMimeType()
        );

        return $return;

问题虽然$img绑定变量在我使用˙Ř˙ŕ输出时error_log($img)序列始终包含echo,但在image.php脚本中输出header()时没有empty())我得到空白页面,˙Ř˙ŕ也返回1,所以我猜empty($img)序列只是给定空输入字符串时error_log的一些奇怪的行为(至少对我而言)。

isset($img)count($img)image.php直接从API返回到$img并在那里输出所有内容都一致,以便在传输图像数据时可能没有出现错误

我正在获取没有其他问题或错误的行(其他列按预期工作)。

此外,当我从phpMyAdmin点击BLOB列时,它显示存储的图像没有任何问题或错误,因此图像存储在核心,唯一的问题可能是从db中检索它。 我还检查了MySQL配置中的最大允许数据包,它设置为16,777,216,这应该足够,因为我的图像最大为5 MB(我想要检索的是~100 kB)

我花了大约6个小时尝试修复它并浏览类似的问题,阅读我使用的每个PDO方法的PHP文档和用户注释,我尝试了所有建议的方法来限制列,不同的提取选项等等但是没有一个解决了我的问题。我尝试这样做http://php.net/manual/en/pdo.lobs.php#96311和“官方”方式http://php.net/manual/en/pdo.lobs.php(使用流),但两者都不适用于我的情况,在这两种情况下$dbh = new PDO("mysql:host={$db['host']};dbname={$db['name']}", $db['user'], $db['password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 都是空的。 我也尝试过这样的连接,正如SO在

中的类似问题所示
SET NAMES

并且没有{{1}}命令,这两个命令对我的问题都没有任何作用。

我很绝望,我不知道该怎么办了,现在已经很晚了,所以我现在要睡觉了,我真诚地希望我能想到一个解决方案,或者至少有些人会知道什么是错了,写给我或分享一个有用的链接:)

P.S。我知道在db中存储图像看起来并不是一个好主意,但我决定这样做,因为我对这个项目有一个紧迫的截止日期,我对文件系统的方式做得不够,并认为我会用db方法节省一些时间。我当然没有保存任何时间:))

2 个答案:

答案 0 :(得分:0)

PDO处理LOB时似乎存在一个错误:https://bugs.php.net/bug.php?id=40913。 在撰写本文时,该错误仍未解决。

答案 1 :(得分:0)

我的建议也有类似问题,请执行以下操作:

首次尝试: 将图像保存到数据库中时,使用 base64_encode 将其转换为十六进制。要在生成图像之前使用 base64_decode 显示相反的内容。

如果失败,您可以尝试以下操作:打开文件。 Notepad++中的“PHP”,转到格式 - >转换为UTF-8(无BOM)

出于某种原因,使用UTF-8(带BOM)格式化文件会生成无效字符。