画像(をはじめとするバイナリデータ,以下,画像)を管理するようなアプリケーション (というほと大げさではありませんが) を設計するときには,情報 (MIME タイプとかデータサイズとか) のみをデータベース(以下,DB) に格納し,データはファイルとして特定の場所へ保存する,といった方法を,今までとってきました.

この場合,管理するべき場所が 2か所あるわけですが,そんな管理がだんだんと手間に思えてきたので,管理をひとまとめにすべく,画像データを DB に格納する練習をしてみました.

まずは通常どおりの INSERT 文で実行してみます.

1
2
3
4
5
6
use DBI;
$img = <読み込んだ画像データ>;
$dbh = DBI->connect( ... ); # MySQL に接続
$sql = qq{INSERT INTO hoge ( id, name, content ) VALUES ( 1, 'img', '$img' );};
$sth = $dbh->prepare( $sql );
$sth->execute();

怒られました.

メッセージの内容から,バイナリデータ ($img) の中にシングルクォートに対応するコードが入っているため,SQL 文が不正となってしまう,ということはわかりましたが,しばらくそこから進めませんでした.

で,調べてみたところ,いくつか気になる記事・ページがありました.

これらによると,Perl + DBI な環境では “プレースホルダ (placeholder)” なるものを使うことで解決できるようです.今まで,ほぼ唯一参考にしていた MySQLクイックリファレンス では触れられていなかった (もしくは単なる見落としか) ので,ひとつ勉強になりました.

プレースホルダを使った場合,先のコードは次のように直せます.

1
2
3
4
5
6
use DBI;
$img = <読み込んだ画像データ>;
$dbh = DBI->connect( ... ); # MySQL に接続
$sql = qq{INSERT INTO hoge ( id, name, content ) VALUES ( ?, ?, ? );};
$sth = $dbh->prepare( $sql );
$sth->execute( 1, 'img', $img );

実行後,無事に格納できました.SELECT 文で問題なく取得することもできました.

画像等の管理の一元化に向けて一歩前進です.

本日の一語: 一元化

(名)スル
ばらばらであった組織や機構を一つの中心体のもとに統一すること。
いちげん-か ―くわ 0 【一元化】 – goo 辞書

そうするべきかそのままにしておくべきか.悩むところです.

こちらもあわせてどうぞ

Leave a Reply

直近のつぶやきを読み込みちゅう...