2015-06-17 1 views
0

Код был протестирован, что вся информация о заголовке сообщения message_id, uid, subject gmail может быть вставлена ​​в мою базу данных sqlite3.Почему я не могу вставить тему моего заголовка в базу данных sqlite3?

<?php 
    $db='/home/email.db'; 

    // function get_gmail can get all the message_id,uid,subject gmail header info. 
    function get_gmail(){ 
     $email_data=array(); 
     $hostname = '{imap.gmail.com:993/imap/ssl}'; 
     $username = '[email protected]'; 
     $password = 'yyyy'; 
     $inbox = imap_open($hostname,$username,$password); 
     $nums=imap_num_msg($inbox); 
     for ($i=1;$i<=$nums;$i++){ 
      $overview = imap_fetch_overview($inbox, $i, 0); 
      $x1 = $overview[0]->message_id; 
      $x2 = $overview[0]->uid; 
      $x3 = $overview[0]->subject; 
      $email_data[]=array($x1,$x2,$x3); 
      } 
     imap_close($inbox); 
     return $email_data; 
     } 

    //function insert_data can insert all the data into my sqlite3 database. 
    function insert_data($array){ 
     Global $db; 
     $dbh=new PDO("sqlite:{$db}"); 
     $dbh->beginTransaction(); 
     $sql = "INSERT INTO gmail(message_id,uid,subject) VALUES (?,?,?)"; 
     $query = $dbh->prepare($sql); 
     foreach($array as $item){ 
      $query->execute($item); 
      } 
     $dbh->commit(); 
     $dbh->beginTransaction(); 
     $dbh=null; 
    } 

    $data=get_gmail(); 
    insert_data($data); 
?> 

Проблема остается, например, предмет электронной почты является '=?GB2312?B?zbO8xtGnu/m0ocq10bXP7sS/?=', он был вставлен в sqlite3 как форме '=?GB2312?B?zbO8xtGnu/m0ocq10bXP7sS/?=', я изменил его в китайские иероглифы в виде UTF-8 со следующим кодом.

<?php 
    $db='/home/email.db'; 

    function get_gmail(){ 
     mb_internal_encoding('UTF-8'); 
     $email_data=array(); 
     $hostname = '{imap.gmail.com:993/imap/ssl}'; 
     $username = '[email protected]'; 
     $password = 'yyyy'; 
     $inbox = imap_open($hostname,$username,$password); 
     $nums=imap_num_msg($inbox); 
     for ($i=1;$i<=$nums;$i++){ 
      $overview = imap_fetch_overview($inbox, $i, 0); 
      $x1 = $overview[0]->message_id; 
      $x2 = $overview[0]->uid; 
      $x3 = $overview[0]->subject; 
      $x3 = mb_decode_mimeheader($x3); 
      $email_data[]=array($x1,$x2,$x3); 
      } 
     imap_close($inbox); 
     return $email_data; 
     } 


    function insert_data($array){ 
     Global $db; 
     $dbh=new PDO("sqlite:{$db}"); 
     $dbh->beginTransaction(); 
     $sql = "INSERT INTO gmail(message_id,uid,subject) VALUES (?,?,?)"; 
     $query = $dbh->prepare($sql); 
     foreach($array as $item){ 
      $query->execute($item); 
      } 
     $dbh->commit(); 
     $dbh->beginTransaction(); 
     $dbh=null; 
    } 

    $re=get_gmail(); 
    insert_data($re); 
?> 

Есть две проблемы, которые необходимо решить.

1.mb_decode_mimeheader
Не все объект в MIME RFC нужен формат 2047, который необходимо изменить, строки начинается с =?GB2312 будет изменен.
Как добавить структуру if-else для выполнения задания?

2. Функция insert_data не может быть запущена.
PHP Неустранимая ошибка: вызов функции-члена execute() для не-объекта в строке 49
Некоторая ошибка в $query->execute($item);. Почему оператор может быть запущен, если не изменить строку с помощью функции mb_decode_mimeheader?

ответ

0

Хотя я не буду отвечать точно «почему» (извините слишком поздно ночью здесь), вы можете попробовать использовать imap_mime_header_decode, чтобы можно было хранить его в db. Убедитесь, что вы обрабатываете его с помощью значка позже, поскольку он обычно хранится не в utf8. (в моем случае как минимум)

$x3 = $overview[0]->subject; 
$subject = imap_mime_header_decode(x3); 
$subject = iconv('ISO-8859-2','utf-8',$subject[0]->text);