(51) オブジェクトをシリアライズして保存する。

投稿者: | 2018年9月5日

この記事は最終更新から 456日 が経過しています。

(1) やりたいこと

PHPプログラム上の複雑なデータ構造を、DBに保存したい。

でも…
個々のメンバ変数について、個々にカラムを作るのは面倒だ。

複雑なデータを、1個のカラムにまとめて保存したい。
 ↓
シリアライズして保存すればよい!

(2) やってみる

1. まずはシリアライズしてみる。

クラスのインスタンスに対して serialize() でシリアライズし、unserialize() で戻す。

class CAaa {
  private $m_text;
  private $m_int;
  private $m_array;
  function __construct( $text, $int, $array ){
    $this->m_text  = $text;
    $this->m_int   = $int;
    $this->m_array = $array;
  }
}

$caaa = new CAaa("hello", 1234, array(1,2,3,4,5));
var_dump($caaa);
echo "<hr>";

$bin_txt = serialize($caaa);
var_dump($bin_txt);
echo "<hr>";

$caaa2 = unserialize($bin_txt);
var_dump($caaa2);

実行結果は以下の通り。
https://www.dogrow.net/php/sample/00051/test1.php
シリアライズしたデータが正しく復元できている。

2. シリアライズしたデータをDB保存する。

以下のPHP公式ページには、シリアライズしたデータのDB保存について注意書きがある。
http://php.net/manual/ja/function.serialize.php

serialize() の出力をデータベースに格納するときには、 通常は CHAR 型や TEXT 型ではなく BLOB 型を使わないといけません。

すなわち…
シリアライズしたデータを保存するためのカラムを作る時は BLOB 型でなければならない。

また、BLOBには以下のようにサイズの制約があるので注意すること。
大きなデータを TINYBLOB型のカラムに保存すれば溢れてしまう。
TINYBLOB : ~255[byte]
BLOB : ~64KB
MEDIUMBLOB : ~16MB
LONGBLOB : ~4GB


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)