2013-09-28 39 views
3

在Drupal的,我出現在私人郵件的正文,並將它們存儲第一序列化的電子郵件是MySQL的是這樣的:Drupal的PHP序列化和反序列化

function prvtmsg_list($body) { 
    $notify = array(); 
    if (isset($body->emails)) { 
    $notify['mid'] = $body->mid; 
    $notify['emails'] = serialize($body->emails); 
    } 
    if (isset($body->vulgar_words) { 
    $notify['mid'] = $body->mid; 
    $notify['vulgar_words'] = serialize($message->vulgar_words); 
    } 
    if (isset($notify['mid'])) { 
    drupal_write_record('prvtmsg_notify', $notify); 
    } 
} 

當我後來試圖找回它們,電子郵件userialization失敗,我找回它們是這樣的:

function prvtmsg_list_notify() { 
    // Select fields from prvtmsg_notify and Drupal pm_message tables 
    $query = db_select('prvtmsg_notify', 'n'); 
    $query->leftJoin('pm_message', 'm', 'n.mid = m.mid'); 
    $query->fields('n', array('mid', 'emails', 'vulgar_words')); 
    $query->fields('m', array('mid', 'author', 'subject', 'body', 'timestamp')); 
    orderBy('timestamp', 'DESC'); 
    $query = $query->extend('PagerDefault')->limit(20); 
    $result = $query->execute()->fetchAll(); 

    $rows = array(); 
    foreach ($result as $notify) { 
    $rows[] = array(
     $notify->author, 
     $notify->subject, 
     implode(', ', unserialize($notify->emails)), 
     implode(', ', unserialize($notify->vulgar_words)), 
    ); 
    } 

    $build = array(); 
    $build['table'] = array(
    '#theme' => 'table', 
    '#header' => array(
     t('Author'), 
     t('Message subject'), 
     t('Emails captured'), 
     t('Vulgar Words Captured'), 
    ), 
    '#rows' => $rows, 
); 
    $build['pager']['#theme'] = 'pager'; 

    return $build; 

}

也許我序列化的電子郵件的方式是錯誤的?這是因爲:

dpm(unserialize($notify->emails); 

給數組,數組,數組 - 這意味着:

Array( [0] => Array() [1] => Array() [2] => Array() [3] => Array() )

出人意料的是,序列化的俗詞都出現了好嗎!我不知道是否有可能要序列化這樣的電子郵件:

$notify['emails'] = serialize (array($body->emails)); 

我面對過去的確切情況下反序列化並沒有對我的工作,有什麼我也不清楚,我需要學習它。任何人都可以確認或告訴我什麼是錯的?

N.B.以上代碼來自內存,可能不準確,因爲我目前無法訪問它。

回答

1

如果我正確地閱讀本你正在寫一個數組到數據庫中

drupal_write_record('prvtmsg_notify', $notify); 

應該是:

drupal_write_record('prvtmsg_notify', serialize($notify)); 

你最有可能不再需要

$notify['emails'] = serialize($body->emails); 

和可以改爲寫:

$notify['emails'] = $body->emails; 

從數據庫中檢索它之後,你可以反序列化數組和遍歷它例如:

$array = unserialize(someFunctionToGetPrvtmsg_notifyFromTheDb()); 
//the array should be the same as the one you serialized 
+0

謝謝。 $ notify數組包含中間值,電子郵件以及代碼中未顯示的其他內容,該代碼將插入多個字段中。我會編輯我的問題來說清楚。 – Mike

+0

$ notify數組包含除了不需要序列化的電子郵件以外的東西。 – Mike