2013年12月18日水曜日

php BLOB型を使ってみる

phpってバイナリ操作するためのものないのん? と思っていたらあった。
MySQLのBLOB型というやつとphpのgmp関連のメソッドを使う。

参考サイト
BLOB型とTEXT型
PHP: GMP 関数 - Manual

使用する上でやったことをいくつかメモ的に残しておく。

MySQL:BLOB型のデータを初期化する


バイナリデータを全部初期化したり、新しい行を挿入したりするときに使った。
BLOB型はデフォルト値が設定できないようなので、多分知らないと困る。

/*---------------------------------------------------------------------------*/
INSERT INTO hoge (blob_data) VALUES ("");
UPDATE hoge SET blob_data = "";
/*---------------------------------------------------------------------------*/

空の文字列を渡してやると、空のバイナリデータとして初期化される。
NULLを渡すと中身がNULLになるので注意。

PHP:BLOB型のデータを取得する


phpでデータを取得するときは、バイナリデータを文字列に変換。
さらにそれをgmpのデータに変換して取得する。

/*---------------------------------------------------------------------------*/
$gmpData = gmp_init(bin2hex($blobData), 16)
/*---------------------------------------------------------------------------*/

16進数のデータで受け取る例。他には10進数、8進数が使用可能。
まあ、基本16進数でいいやと思って試してはいない。

PHP:ビットを操作する


/*---------------------------------------------------------------------------*/
gmp_setbit($gmpData, $index, $set);
/*---------------------------------------------------------------------------*/

indexは調べたいビット。setはオンにするならtrue。オフにするならfalseを渡す。

PHP:ビットを取得する


/*---------------------------------------------------------------------------*/
gmp_testbit($gmpData, $index);
/*---------------------------------------------------------------------------*/

MySQL:PHPで操作したデータを更新する


取得したときとは逆に、16進数のデータに変換して、さらにバイナリに変換する。

/*---------------------------------------------------------------------------*/
$hex = gmp_strval($gmpData, 16);
$data =  hex2bin($hex);
/*---------------------------------------------------------------------------*/

gmp_strvalで変換できる。
hex2binに渡すときは、文字列データの長さが偶数じゃないと起こられるので気をつけよう。

以上。思っていたより長くなった。

0 件のコメント:

コメントを投稿