2

ここで何が間違っていますか?値をシリアル化し、データベース (テーブル bb_meta) に保存し、取得しています...ここまでは問題ありませんが、2 回シリアル化を解除する必要があります。一度だけシリアル化を解除することはできませんか?これは機能しているように見えますが、シリアライゼーションのどの点が欠けているのか疑問に思っています。

//check database to see if user has ever visited before.
$querystring = $bbdb->prepare( "SELECT `meta_value` FROM `$bbdb->meta` WHERE `object_type` = %s AND `object_id` = %s AND `meta_key` = %s LIMIT 1", $bbtype, $bb_this_thread, $bbuser );
$bb_last_visits = $bbdb->get_row($querystring, OBJECT);
//if $bb_last_visits is empty, add time() as the metavalue using bb_update_meta
    if (empty($bb_last_visits)) {
        $first_visit = time();
        echo 'serialized first visit: ' . $bb_this_visit_time_serialized = serialize(array($bb_this_thread => $first_visit));
        bb_update_meta( $bb_this_thread, $bbuser, $bb_this_visit_time_serialized, $bbtype ); //add to database, bb_meta table
        echo '$bb_last_visits was empty. Setting first visit time as ' . $bb_this_visit_time_serialized . '<br>';
        } else {
            //else, test by unserializing the data for use.
            echo 'last visit time already set: '; echo $bb_last_visits->meta_value; echo '<br>';
            //fatal error - echo 'unserialized: ' . $bb_last_visits_unserialized = unserialize($bb_last_visits[0]->meta_value); echo '<br>';
            echo 'unserialize: ' . $unserialized_visits = unserialize($bb_last_visits->meta_value); echo '<br>';
            echo 'hmm, need to unserialize again??: '; echo $unserialized_unserialized_visits = unserialize($unserialized_visits); echo '<br>';
            echo 'hey look, it\'s an array value I can finally use now. phew: ' . $unserialized_unserialized_visits[$bb_this_thread];
            }
4

1 に答える 1

3

bb_update_meta() は bbPress 関数であり、この場合、配列を条件付きでシリアル化することを意味するように、「退屈なことをする」 Maybe_serialize() という Wordpress 関数を呼び出します。

この関数には、シリアル化されていない配列を直接渡すことができます。そうすることで、シリアル化を解除する必要がなくなりました。

すべての努力がパフォーマンスの向上に見合うかどうかはわかりませんが、少なくともそれは教育的でした.

これを解決したスパークを開始してくれた@webbiedaveに感謝します!

于 2010-04-02T17:00:47.753 に答える