共有ホスティングアカウントにMySQL5.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;
PHP5.2.17からdbに接続するためにPDOを使用しています。ここSOとWebで同様の(または同じ)問題に対するいくつかの回答で提案されたように、接続を設定しようと
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
しましたが、問題は修正されませんでした。MySQL構成で最大許可パケットも確認しましたが、16,777,216に設定されています。これは、5MBを超える画像のアップロードを許可しないため十分なはずです。
関連性があるかどうかはわかりませんが、他のテーブルにも複数の挿入を行うトランザクション内にデータを挿入しています。
$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]」を含む.binファイルが表示されます。[id]は画像のIDです。
ありがとう、Viktor