MySQL MEDIUMBLOB总是大小相同

时间:2012-12-15 21:52:30

标签: php mysql sql insert pdo

我在共享主机帐户上安装了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

1 个答案:

答案 0 :(得分:2)

我找到了解决问题的方法! $image->getBinary()方法返回GD图像资源而不是实际的二进制图像字符串,因此我将其更改为:

    public function getBinary() {
        ob_start();
        imagejpeg($this->image);
        return ob_get_clean();
    } 

它现在有效! 经验教训,我可以继续我的项目! :)