2013-09-28 2 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)); 

я столкнулся точная ситуация в прошлом, когда unserialization не работал для меня, есть что-то мне не ясно, и мне нужно, чтобы узнать, Это. Может ли кто-нибудь подтвердить или сказать мне, что случилось?

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

Смежные вопросы