gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:41:02 25 4
gpt4 key购买 nike

我将图像数据存储在图像表的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com