2

次のような画像テーブルの 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画像パラメーターを受け取る API を呼び出し、それを表示するスクリプトに列からバイナリ文字列を返すスクリプトがあります。idimageimages.php

これは、db から画像データをフェッチし、それをクラスにロードする API (実際には imageController) の一部であり、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;

問題は、$imgバインドされた変数を使用して出力するときに常にシーケンスが含まれ˙Ř˙ŕ、スクリプトから(なしで) 空白のページを取得すると、 1 が返されるため、そのシーケンスは error_log の奇妙な (少なくとも私にとっては) 動作だと思います。空の入力文字列が与えられたとき。error_log($img)echoimage.phpheader()empty()˙Ř˙ŕ

empty($img)API からまたは直接 API に戻りisset($img)、そこに出力することはすべて一貫して機能するため、画像データの転送時にエラーが発生することはおそらくありません。count($img)image.php

他の問題やエラーなしで行をフェッチしています(他の列は意図したとおりに機能します)。

また、phpMyAdmin の BLOB 列をクリックすると、問題やエラーのない保存された画像が表示されるため、画像は正しく保存され、db から取得するときにのみ問題が発生する可能性があります。また、MySQL 構成で最大許容パケットを確認し、16,777,216 に設定されています。これは、イメージのサイズが最大 5 MB であるため、これで十分なはずです (取得しようとしているものは ~100 kB です)。

過去〜6時間かけて修正し、同様の質問を閲覧し、使用するすべてのPDOメソッドのPHPドキュメントとユーザーコメントを読み、列の境界、さまざまなフェッチオプションなどの提案された方法をすべて試しましたが、どれも試しませんでした私の問題を解決しました。この方法でやってみました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で、どちらも私の問題に関して何もしません。

私は必死です、私はもう何をすべきかわかりません、そしてここは非常に深夜なので、私は今寝ます.解決策を夢見るか、少なくともあなたの何人かが何が悪いのかを知って書いてくれることを心から願っています.私のためにそれをアップするか、便利なリンクを共有してください:)

PS 画像を db に保存するのは、見た目ほど素晴らしいアイデアではないことはわかっていますが、このプロジェクトの締め切りが迫っていて、ファイルシステムの方法について十分に知らなかったので、そうすることにしました。 db アプローチで時間を節約できます。私は確かに時間を節約しませんでした:)

4

2 に答える 2

0

私はあなたのアドバイスで同様の問題を抱えており、次のことを行います。

最初の試行: データベースに画像を保存して、base64_encodeを使用して 16 進数に変換するとき。表示するには、画像を生成する前にbase64_decodeを使用して逆の操作を行います。

それが失敗した場合は、次のことを試すことができます: ファイルを開きます。Notepad++の「PHP」、 [フォーマット]に移動-> UTF-8 に変換 (BOM なし)

何らかの理由で、UTF-8 (BOM 付き) でファイルをフォーマットすると、無効な文字が生成されます。

于 2013-08-11T03:08:02.703 に答える
0

LOB の PDO 処理にバグがあるようです: https://bugs.php.net/bug.php?id=40913。このバグは、執筆時点ではまだ保留中です。

于 2013-05-23T16:30:12.760 に答える