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

标签 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;

问题是当我使用 error_log($img) 输出时,$img 绑定(bind)变量总是包含 ˙Ř˙ŕ 序列当我从我的 image.php 脚本(没有 header())echo 时,我得到空白页,还有 empty() 返回 1 所以我猜 ˙Ř˙ŕ 序列只是一些奇怪的(至少对我来说)错误日志在给定空输入字符串时的行为。

直接从 API 返回 empty($img)isset($img)count($img) image.php 并将其输出到那里所有工作始终如一,因此在传输图像数据时可能不会出现任何错误。

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

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

我花了大约 6 个小时试图修复它并浏览如此类似的问题,阅读 PHP 文档和用户对我使用的每个 PDO 方法的评论,我尝试了所有建议的边界列方法、不同的获取选项等等,但是它们都没有解决我的问题。我试过这样做 http://php.net/manual/en/pdo.lobs.php#96311和“官方”方式http://php.net/manual/en/pdo.lobs.php (使用流)但在我的情况下两者都不起作用,并且在这两种情况下 $img 都是空的。 我也试过像这样连接,正如 SO 的类似问题中所建议的那样

$dbh = new PDO("mysql:host={$db['host']};dbname={$db['name']}", $db['user'], $db['password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

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

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

附言我知道将图像存储在 db 中并不是一个看起来那么好的主意,但我决定这样做是因为我在这个项目上的截止日期很紧,而且我对以文件系统方式进行操作的了解还不够,我认为我会使用数据库方法节省一些时间。我当然没有节省任何时间:)

最佳答案

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

关于php - 使用 PHP 和 PDO 从 MySQL 检索 MEDIUMBLOB 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13898445/

相关文章:

mysql - 我可以在 InnoDB 事务期间检索挂起的查询吗?

php - 如何使用php创建多个依赖的下拉列表并将数据保存在mysql数据库中?

jquery - 使用按钮导航以打开页面(jquery)

html - 哪种图像扩展在质量和性能(速度)方面都更好?

php - 自动从mysql导入数据到solr

javascript - 如何在选择除一个链接之外的所有链接时运行脚本

PHPExcel 列循环

php - 移动 mysql 行中的数字以进行排序

mysql - 从具有零值的单个表返回多列结果

java - 图像透明度如何工作以及如何实现它?