0

共有ホスティングアカウントに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

4

1 に答える 1

2

問題の解決策を見つけました!$image->getBinary()メソッドは実際のバイナリ イメージ文字列ではなく GD イメージ リソースを返していたので、次のように変更しました。

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

そしてそれは今動作します!教訓が得られ、プロジェクトの作業を進めることができます! :)

于 2012-12-15T22:00:22.643 に答える