我在共享主机帐户上安装了MySQL 5.1.65,并且在将图像插入到我想要存储图像数据的MEDIUMBLOB列的图像表(InnoDB)时遇到了麻烦。
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;
我使用PDO从PHP 5.2.17连接到db。我尝试过设置
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
在我的连接中,因为它在SO和网络上的类似(或相同)问题的一些答案中被建议,但它没有解决问题。
我还检查了MySQL配置中的最大允许数据包,它设置为16,777,216,这应该足够了,因为我不允许上传大于5 MB的图像。
我不知道它是否相关,但我在事务中插入数据,我也会在其中对其他表执行多次插入。
$image_params = array(
"description" => $data->description,
"image" => $image->getBinary() // Basicaly does file_get_contents() and returns
);
$image_statement = $pdo->prepare(
"INSERT INTO images (description, image)
VALUES(:description, :image)"
);
$pdo->beginTransaction();
$image_statement->execute($image_params);
$some_other_statement->execute($params);
$pdo->commit()
在phpMyAdmin中,当我浏览图像表时,图像列始终显示[BLOB-15B],当我访问它时,我得到包含"资源ID#[id]"其中[id]是图像的id。
谢谢你,Viktor
答案 0 :(得分:2)
我找到了解决问题的方法! $image->getBinary()
方法返回GD图像资源而不是实际的二进制图像字符串,因此我将其更改为:
public function getBinary() {
ob_start();
imagejpeg($this->image);
return ob_get_clean();
}
它现在有效! 经验教训,我可以继续我的项目! :)