2011-11-13 11 views
1

[OK]を私持っているこの:これはアンシリアライズ($文字列)では動作しませんPHPで壊れたシリアライズされた文字列を回復することができ、スクリプトを作る

a:1:{i:0;a:3:{s:7:"address";s:52:"Elågåresgude 41, 2200 Københamm N";s:12:"company_name";s:14:"Kaffe og Kluns";s:9:"telephone";s:0:"";}} 

私はどこにエラーがあるか知っています。住所の前にある番号です。それは52ではありませんが、36.

私は文字列(私に33を与えた)を数えることによって得られ、次に文字列に存在する各åまたはφについて1をプラスします。

私は52を36に置き換えると、うまくいきません。

私はすべての私のアドレスのためにこれを行うためのスクリプトを書いています。

しかし、どうすればいいのですか? "corrupted"のときに、アドレス/会社名/電話番号を抽出しますか?

+1

代わりにjson_encodeを使用できます。 – Flukey

+1

@Flukey:これはJSONではなく、OPは** deserialize **にしたい、JSONからデコードしません。 – Tadeck

+0

どのように破損した文字列を取得しますか?可能であれば、エラー自体よりも、問題の原因に集中する必要があります。 – Marcus

答えて

4
function fix_corrupted_serialized_string($string) { 
    $tmp = explode(':"', $string); 
    $length = count($tmp); 
    for($i = 1; $i < $length; $i++) {  
     list($string) = explode('"', $tmp[$i]); 
     $str_length = strlen($string);  
     $tmp2 = explode(':', $tmp[$i-1]); 
     $last = count($tmp2) - 1;  
     $tmp2[$last] = $str_length;   
     $tmp[$i-1] = join(':', $tmp2); 
    } 
    return join(':"', $tmp); 
} 

作業のデモ: http://codepad.viper-7.com/GNbM25

+0

「長さ」問題にはいいですが、Marcus氏のように、彼は問題の原因に集中すべきです。 – malletjo

+0

長さの問題についての質問があり、答えがあります:)とにかく 'serialize()'はキャッシュにしか役に立ちません。私はこの形式でデータを保存する人が嫌いです(例:80%のWordpressプラグイン) – Peter

+0

ありがとうございました! @racar私はすでに問題の原因を修正しました – Karem

-1

solutionは、unserializeが機能するかどうかをテストする必要があります。そうでない場合は、削除して再シリアライズします。

$yourserializestring = '...'; 

$data = @unserialize($yourserializestring); 
if ($yourserializestring === 'b:0;' || $data !== false) { 
    // Something didn't work, you should recreate it 
} else { 
    echo "ok"; 
} 
+0

私はこれが彼の問題を解決しないことに同意します。 – malletjo

0

は、マルチバイト文字を扱う関数のバグのように見えます。また、シリアル化する前にexplicitly encoding the string as utf-8を試してみることもできます。

回避策として、アドレスをシリアル化する前にbase64 encodeにアドレスを設定してから、シリアル化を解除するときにbase64 decodeとすることができます。

関連する問題