次のような画像テーブルの 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 を呼び出し、それを表示するスクリプトに列からバイナリ文字列を返すスクリプトがあります。id
image
images.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)
echo
image.php
header()
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 アプローチで時間を節約できます。私は確かに時間を節約しませんでした:)