PHPを使用してMySQLデータベースから画像を保存および取得するにはどうすればよいですか?
質問
MySQLに画像を挿入し、PHPを使用して画像を取得するにはどうすればよいですか
どちらの分野でも経験が限られており、小さなコードを使用して、これを理解するために始めることができます。
解決
最初に、次のような画像を保存するMySQLテーブルを作成します。
create table testblob (
image_id tinyint(3) not null default '0',
image_type varchar(25) not null default '',
image blob not null,
image_size varchar(25) not null default '',
image_ctgy varchar(25) not null default '',
image_name varchar(50) not null default ''
);
その後、次のようにデータベースに画像を書き込むことができます:
/***
* All of the below MySQL_ commands can be easily
* translated to MySQLi_ with the additions as commented
***/
$imgData = file_get_contents($filename);
$size = getimagesize($filename);
mysql_connect("localhost", "$username", "$password");
mysql_select_db ("$dbname");
// mysqli
// $link = mysqli_connect("localhost", $username, $password,$dbname);
$sql = sprintf("INSERT INTO testblob
(image_type, image, image_size, image_name)
VALUES
('%s', '%s', '%d', '%s')",
/***
* For all mysqli_ functions below, the syntax is:
* mysqli_whartever($link, $functionContents);
***/
mysql_real_escape_string($size['mime']),
mysql_real_escape_string($imgData),
$size[3],
mysql_real_escape_string(最初に、次のような画像を保存するMySQLテーブルを作成します。
create table testblob (
image_id tinyint(3) not null default '0',
image_type varchar(25) not null default '',
image blob not null,
image_size varchar(25) not null default '',
image_ctgy varchar(25) not null default '',
image_name varchar(50) not null default ''
);
その後、次のようにデータベースに画像を書き込むことができます:
$link = mysql_connect("localhost", "username", "password");
mysql_select_db("testblob");
$sql = "SELECT image FROM testblob WHERE image_id=0";
$result = mysql_query("$sql");
header("Content-type: image/jpeg");
echo mysql_result($result, 0);
mysql_close($link);
次のコマンドを使用して、Webページにデータベースの画像を表示できます。
<*>FILES['userfile']['name'])
);
mysql_query($sql);
次のコマンドを使用して、Webページにデータベースの画像を表示できます。
<*>他のヒント
画像をデータベースに保存する代わりに、ディスクのフォルダに保存し、データベースに保存します。
DBから画像を提供することは、通常、ディスクから画像を提供するよりもはるかに遅くずっと注意してください。
PHPプロセスを開始し、DB接続を開き、DBがファイルシステムと同じディスクとRAMからキャッシュに画像データを読み取り、少数のソケットとバッファで転送してから、PHP経由でプッシュします。デフォルトではキャッシュ不可になり、チャンクHTTPエンコーディングのオーバーヘッドが追加されます。
OTOHの最新のWebサーバーは、最適化されたカーネルコール(メモリマッピングファイルとそのメモリ領域がTCPスタックに渡される)をわずかに使用してイメージを提供できるため、メモリをコピーすることもオーバーヘッドもほとんどありません。
これは、1台のマシンで20個または2000個の画像を同時に提供できることの違いです。
したがって、トランザクションの整合性が絶対に必要な場合(実際にはDBおよびファイルシステムクリーンアップルーチン内のイメージメタデータだけでも実行可能)およびPHPのHTTP処理を改善する方法を知っている場合を除き、実行しないでください画像に適しています。
iは、これを考えてから、DBではなくファイルシステムにイメージを保存することを選択することもお勧めします。 こちらをご覧ください:画像をDBに保存する-はい、またはいや
私の意見では、画像をデータベースに直接保存する代わりに、画像の場所をデータベースに保存することをお勧めします。両方のオプションを比較すると、データベースに画像を保存することはセキュリティ目的で安全です。欠点は
-
データベースが破損している場合、取得する方法はありません。
-
dbからの画像ファイルの取得は、他のオプションと比較すると遅くなります。
一方、dbに画像ファイルの場所を保存すると、次の利点があります。
-
簡単に取得できます。
-
複数の画像が保存されている場合、画像情報を簡単に取得できます。
個人的には、画像をデータベースに保存せず、代わりに外部からアクセスできないフォルダに保存し、その場所を追跡するためにデータベースを使用します。データベースのサイズを抑え、PHPを使用してデータベースを含めることができます。 PHPがなければその画像にアクセスする方法はありません