サポート » 使い方全般 » シリアライズの値が破損しているDBの修復

  • 1度シリアライズの値が破損してしまったDBの修復ができるかどうかお聞きしたいです。
    ↓データベースのシリアライズの値はこんな感じで入っているとして、

    a:0:{s:21:”1234567890″;}

    この例だと、s:21が、s:10 になってほしいところです。
    これを修正してくれるものってありますかね?
    手でやるのはさすがに量があるのできついです。
    自分で正規表現なんかをつかって置換するしかないんでしょうか。

    経緯は、だいぶ前に、search replace dbやWP CLIを使ってURLの置換をしてみたのですが、
    ちゃんとシリアライズされているものは再度シリアライズしてくれるのですが、
    すでに破損している値では直してくれないみたいなので
    「しかたないか」と思っていました。
    最近になって、これぐらい直せるツールがあってもいいんじゃない?と気づいて、探してみたのですが、私では発見できず。。

    正規表現と文字数を数えるくらいなら、そんなに難しくないんじゃないかな、と思ったのですが、マルチバイトの文字数も対応しないといけなかったりで、自作よりも確実なものがあれば使いたいと思いました。
    ツールを知っている方がいらっしゃれば教えてほしいです。
    もしくは、プログラムの一部でも教えていただけたら、PHPならちょっとくらい書けるので助かります。
    こういう理由で無理だよ、というようなことでも歓迎です。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • すでにシリアライズ値がおかしくなっているデータベースの場合で、それを直すためのサンプルコードが、

    Fix serialized data broken due to editing MySQL database in a text editor? (Stackoverflow)

    にいくつか載っています。
    また使ったことがないですが
    WordPress Fix Serialization (GitHUB)
    に一括修正処理してくれるツールがありますね。

    データベースをバックアップして、ローカル環境やクローンサイト、あるいはDBのみコピーして、それら仮想環境で置換を試してみてはと思います。

    これに対する質問者さんからの返事について、メール通知が来ていて、しかしフォーラムに掲載されていないのはURLがついていたからですかね。

    さて、fix-serialization.php というのがあり、 PHP5.3でしか動作しない(PHP7では動作しない)ものがあるということです。

    その PHPがおいてある GitHubの Pull requests に、 PHP7 Fixes のパッチが置いてあります。こちらに、preg_replace において e修飾子を使わないで、preg_replace_callback を使ったコードがあります。そういったものをつかうのも手かもしれませんね。

    前のコメントはモデレーターの承認待ちとなってしまいました。1回投稿したんですが、ボールドとかつけてわかりやすくしたところ、そんなことになってしまったというわけです。

    おお!たしかにありました。これがパッチですね。
    https://github.com/Blogestudio/Fix-Serialization/pull/6/commits/ff0bf055e03d9edd928714f21e303ebc117288e2

    こっちを正しいコードとして使えってことですね。

    $data = preg_replace_callback('!s:(\d+):([\\\\]?"[\\\\]?"|[\\\\]?"((.*?)[^\\\\])[\\\\]?");!',

    わざわざPHP5.3入れたりしなくてもよかったとは…

    今後も使う場面あると思いますので助かりました。ありがとうございます!

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • このトピックに返信するにはログインが必要です。