Site cover image

Site icon image 制作メモ

Description is here. The icon, the title, the description can be modified in Notion.

[PHP] シリアライズされたデータを含む文字列を一括置換する

シリアライズされたデータには値の他に長さ(byte)の情報が含まれています。

a:1:{i:0;s:24:"あしたは晴れです";}

a は配列で、続く数値は要素の数を表しています。

i は Integer型で、続く数値は byte ではなく値です。この場合、配列のキーにあたります。

s は String型で、続く数値は byte です。この場合、配列の値にあたります。

この文字列をアンシリアライズすると、

array(1) {
  [0]=>
  string(24) "あしたは晴れです"
}

このようになります。

ここからが本題!

あしたは晴れですをあしたは雨ですに置き換えたとします。

a:1:{i:0;s:24:"あしたは雨です";}

マルチバイトはほとんど 3 bytes / 1文字なので、1文字減って 21 bytes に変わりましたが、長さを示す数値は 24 bytes のままです。

これをアンシリアライズすると、

Notice: unserialize(): Error at offset 39 of 39 bytes in YOUR DIR on line **
bool(false)

そらみたことか。false(偽)が返され、Notice(注意)が出てしまいました。

そうです、byte も正しい数値に変えないとならないのです。

WordPress を使っている場合、これは大きな問題になることがあります。

プラグインの中にはシリアライズされたデータを扱うものが数多く存在するので、安易に置き換えを行うと不具合が発生してしまいます。

WordPress で一括置換を行う場合はプラグインを利用すべきです。

おすすめプラグイン ――― Better Search Replace

なぜか Search Replace DB を推す記事が多くみられますが、WordPress の公式ディレクトリのものではないので個人的には不安です。

WordPress をご利用の方は Better Search Replace で対処するとして、手元にある SQL に対して一括置換を行いたいときのために・・・

一括置換ツール開発しました!

GitHub:https://github.com/YuyaHoshino/SearchAndReplaceSerializedString

ダウンロード:https://github.com/YuyaHoshino/SearchAndReplaceSerializedString/archive/master.zip

使い方:Search And Replace Serialized String