Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Cannot use object of type stdClass as array
 
 автор: andrey215   (07.03.2012 в 19:25)   письмо автору
 
 

Доброго времени суток!
Народ, помогите, вылетает ошибка
Fatal error: Cannot use object of type stdClass as array in /home/virtwww/w_auto-zp-ru_44475984/http/triggers/getfile.php on line 200
пытаюсь что то сделать уже несколько дней, но ничего не выходит, если закомментировать эту строку (строчка №200), то ошибка пропадает, но мне надо знать имена файлов, скачиваемых с почты на сервер. Очень нужна ваша помощь!!!!

код скрипта:

<?
Error_Reporting
(E_ALL & ~E_NOTICE);
setlocale (LC_ALL"ru_RU.CP1251");
include 
"../lib/connections.php";
Connect();

$sql=mysql_query("SELECT * FROM `Settings` WHERE `Id`='5';");
if(
$sql)$row=mysql_fetch_row($sql); $FolderForMail=$row[3];
$sql=mysql_query("SELECT * FROM `Settings` WHERE `Id`='6';");
if(
$sql)$row=mysql_fetch_row($sql); $MailForPrices=$row[3];
$sql=mysql_query("SELECT * FROM `Settings` WHERE `Id`='7';");
if(
$sql)$row=mysql_fetch_row($sql); $PassMail=$row[3];
$sql=mysql_query("SELECT * FROM `Settings` WHERE `Id`='8';");
if(
$sql)$row=mysql_fetch_row($sql); $MAILBOX=$row[3];

//записываем в массив все параметры для загрузки фалов
$sql=mysql_query("SELECT * FROM `SpisokSklads` WHERE `Block`='0';");
if(
$sql)
{
    
$i=0;
    while(
$row=mysql_fetch_row($sql))
    {
        
$SkladMailFrom[$i]=$row[19];
        
$SkladMailPost[$i]=$row[20];
        
$SkladFileName[$i]=$row[15];
        
$SkladFileReName[$i]=$row[16];
        
$SkladArchive[$i]=$row[17];
        
$i++;
    }
    
$SkladKol=$i;
}



function 
decode_header($header$out_charset//декодирование имен файлов и заголовков

    
preg_match_all('/=\\?(.+?)\\?(.+?)\\?(.+?)((\\s)|\\?=|$)/'$header$matches);

    for(
$i 0$i count($matches[0]); $i++)
    {
        switch( 
strtoupper($matches[2][$i]) ) 
        { 
            case 
'B'$matches[3][$i] = imap_base64($matches[3][$i]); break; 
            case 
'QP'$matches[3][$i] = imap_qprint($matches[3][$i]); break; 

            default: 

            
trigger_error('Unknown encoding: ' $matches[2][$i]); 

            return 
false
        } 
     
        
$matches[3][$i] .= $matches[5][$i]; 
     
        if( 
strtoupper($matches[1][$i]) != strtoupper($out_charset) ) 
        { 
            
$matches[3][$i] = iconv($matches[1][$i], $out_charset '//IGNORE'$matches[3][$i]); 
        }
    }

    return 
str_replace($matches[0], $matches[3], $header);
}

function 
DeArhive($FileName,$Folder)//функция разархивирования - надо указать имя файла (путь и имя файла) и путь куда разархивировать файлы
{
    
$zip zip_open($FileName);
    
    
$folder substr(str_replace("\\""/"__FILE__), 0strrpos(str_replace("\\""/"__FILE__), "/"))."/".$Folder;

    
//echo "Папка <b>".$folder."</b><br />\n";

    
$files 0;
    
$folders 0;

    if (
$zip) {
        while (
$zip_entry zip_read($zip)) {
            echo 
"<br />\n";
            
$name $folder zip_entry_name($zip_entry);
            
//echo"DeArhive: ".$name."<br>";
            //$name = iconv("UTF-8","windows-1251",$name);
            
$name=decode_header($name'windows-1251');
            
//echo"DeArhive decode_header: ".$name."<br>";
            
if($name[strlen($name) - 1] == '/') {
                
mkdir($name0755);
                
$folders++;
            } elseif (
zip_entry_open($zip$zip_entry"r")) {
                
$buf zip_entry_read($zip_entryzip_entry_filesize($zip_entry));
                
$file fopen($name"w");
                if (
$file) {
                    
fwrite($file$buf);
                    
fclose($file);
                    
$files++;
                } else {
                    
//echo "Ошибка при открытии файла <b>".$name."</b>";
                
}
                
zip_entry_close($zip_entry);
            }
        }
        
//echo "Готово! Разархивировано <b>".$files."</b> файлов и <b>".$folders."</b> папок";
        
zip_close($zip);
    } else {
        
//echo "Ошибка при открытии архива!";
    
}
}

function 
CheckArhive($Folder//функция находит файлы-архивы и запускает функцию разархивирования - надо указать путь к папке, где искать архивы
{
    
// Открываем директорию
    
$dir opendir($Folder);

    
// В цикле считываем её содержимое
    
while(($file readdir($dir)))
    {
        
$file=(string)$file;
        if(
$file!="." && $file!="..")
        if(
is_resource(zip_open($Folder."".$file)))DeArhive($Folder."".$file,$Folder);
    }
    
//закрываем директорию
    
closedir($dir);
}

// Первый аргумент imap_open() - сервер и путь к почтовому ящику на этом сервере 
// Например, для MAIL.RU выглядит так:

define'MAILBOX'$MAILBOX ); 
// ... 
define'USER',$MailForPrices ); 
define'PASS',$PassMail );  

// Возможные виды кодирования данных 
// Ввод этих констант нужен только для дальнейшего улучшения читабельности кода 
define'ENC_7BIT');
define'ENC_8BIT');
define'ENC_BINARY');
define'ENC_BASE64'); // Чаще всего для передачи вложений их кодируют в base64
define'ENC_QUOTED_PRINTABLE');
define'ENC_OTHER');

// Если IMAP-библиотека не подключена или отсутствует в этой сборке
if(!function_exists('imap_open'))die('IMAP lib does not exist');

// Массив для attachment'ов (вложений)
$attachment = array();

// Соединение с почтовым сервером
if(!($mbox=imap_open(MAILBOX,USER,PASS)))die('Could not open mailbox');

// Получение кол-ва писем на сервере
$num_msg=imap_num_msg($mbox);

$from= isset($_GET['f'])? intval($_GET['f']): 1;

echo
"Кол-во писем".$num_msg."<br>";

    
// Перебор всех писем
    
for($i=$num_msg;$i>0;$i--)
    {
        
// читаем тему письма под номером $i
        
$obj=imap_headerinfo ($mbox$i);
        
        
//читаем адрес отправителя
        
$fromname=imap_mime_header_decode($obj->fromaddress);
        
        
//$arr = isset($obj->Subject)? imap_mime_header_decode($obj->Subject) : '';
        //echo "отправитель ".@convert_cyr_string($fromname[0]->text,$fromname[0]->charset,"w")."<br>";
        //echo "Unseen ".$obj->Unseen."<br>";
        //echo ($arr === ''? '' : convert_cyr_string($arr[0]->text,$arr[0]->charset,"w"));
        
        
$obj=imap_headerinfo($mbox,$i);
        
$arr=isset($obj->Subject)? imap_mime_header_decode($obj->Subject):'';
        
$fromname imap_mime_header_decode($obj->fromaddress);
        
$From=iconv("UTF-8","windows-1251",$fromname[0]->text)."<br>";//от кого
        
$Post=iconv("UTF-8","windows-1251",$arr[0]->text)."<br>";//тема письма
        
        
        
        // Структура письма
        
$structure imap_fetchstructure($mbox,$i);

        
// Перебор частей писем (письмо, состоящее из одной части не содержит аттачей)
        
for($p=0;isset($structure->parts) && $p<count($structure->parts);$p++)
        {
            
// Если это вложение, ...
            
if($structure->parts[$p]->ifdisposition && strtoupper($structure->parts[$p]->disposition)=='ATTACHMENT')
            {
                
//..., то получаем его
                
$buffer imap_fetchbody($mbox,$i,$p+1,FT_PEEK);
                
                
// Раскодирование
                
switch($structure->parts[$p]->encoding)
                {
                    case 
ENC_BASE64:
                    {
                        
$buffer=imap_base64($buffer);
                        break;
                    }
                }
                
// Запихивем в массив имя файла, которое было на клиентской машине, и его содержимое
                
$attachment[$i]=array(
                
'filename'=>$structure->parts[$p]->parameters[0]->value,
                
'content'=>$buffer
                
);
                
//,'MailPost'=>$Post,'MailFrom'=>$From
            
}
            else if(
$structure->parts[$p]->ifsubtype && strtoupper($structure->parts[$p]->subtype)=='PLAIN')
            {
                
// Письмо без вложений - не записываеется в массив
            
}
        }
        
imap_delete($mbox$i);//помечаем письмо как удаленное
        //if(imap_mail_copy($mbox, "$i:$i", "INBOX/test"))echo"1"; else echo"0";
    
}
    
//imap_expunge($mbox);//удаляем помеченные письма
    // Закрытие соединения
    
imap_close($mbox);




for(
$i=0;$i<count($attachment);$i++)
{
    
//сравнивая значения полей "от кого" и "тема письма" находим соответствие и закачивая файлы переименовываем их для последущей загрузки
    
for($d=0;$d<$SkladKol;$d++){if(substr_count(strtolower($attachment[$i]['MailFrom']),strtolower($SkladMailFrom[$d]))>0)$IdMas=$d;} // строки совпадают - запоминаем позицию массива
    //echo "attachment[$i]['filename']".$attachment[$i]['filename']."<br>";
    
$attachment[$i]['filename']=decode_header($attachment[$i]['filename'], 'windows-1251');
    
//если имена файлов совпадают, то используем сразу новое имя при создании файла
    
if($attachment[$i]['filename']==$SkladFileName[$IdMas] || substr_count(strtolower($attachment[$i]['filename']),strtolower($SkladFileName[$IdMas]))>&& !$SkladArchive[$IdMas])
    {
        if(!
$SkladArchive[$IdMas]){$fh=fopen($FolderForMail.$SkladFileReName[$IdMas],'wb');echo"имя файла ".$SkladFileReName[$IdMas];}
        
fwrite($fh,$attachment[$i]['content']);
        
fclose($fh);
    }
    
    if(
$SkladArchive[$IdMas])//если скаченный файл является архивом, запускаем функцию разархивирования и переименовываем файл
    
{
        if(
$SkladArchive[$IdMas]){$fh=fopen($FolderForMail.$attachment[$i]['filename'],'wb');echo"имя архива ".$attachment[$i]['filename'];}
        
fwrite($fh,$attachment[$i]['content']);
        
fclose($fh);
        
CheckArhive($FolderForMail);
        
//if(is_file($FolderForMail.$SkladFileName[$IdMas]))rename($FolderForMail.$SkladFileName[$IdMas],$FolderForMail.$SkladFileReName[$IdMas]);
        //просматриваем все файлы в директории, если файл точно совпадает с бд или частично, то переименовываем его
        
$dir=opendir($FolderForMail);
        while((
$file=readdir($dir)))
        {
            echo
$file."<br>";
            if(
$file==$SkladFileName[$IdMas] || substr_count(strtolower($file,strtolower($SkladFileName[$IdMas]))>0))rename($FolderForMail.$file,$FolderForMail.$SkladFileReName[$IdMas]);
        }
    }
}

Disconnect();
?>

  Ответить  
 
 автор: .heed   (07.03.2012 в 19:53)
 
   для: andrey215   (07.03.2012 в 19:25)
 

>$attachment[$i]=array(
'filename'=>$structure->parts[$p]->parameters[0]->value,
'content'=>$buffer
);


с200 так понимаю = $structure->parts[$p]->parameters[0]->value

я-бы попробовал сначала создать промежуточную переменную = $structure->parts[$p]->parameters[0]
, а потом присваивать значение = Переменная->value
Где-то уже замечалось что пхп парсит такое по своим непонятным представлениям
, но не утверждаю, imap_fetchstructure не юзал

  Ответить  
 
 автор: .heed   (07.03.2012 в 19:56)
 
   для: .heed   (07.03.2012 в 19:53)
 

var_dump($structure->parts[$p]->parameters) что-то выводит?

  Ответить  
 
 автор: andrey215   (09.03.2012 в 11:43)   письмо автору
 
   для: .heed   (07.03.2012 в 19:56)
 

выводит это

array(1) { [0]=> object(stdClass)#6 (2) { ["attribute"]=> string(4) "NAME" ["value"]=> string(24) "=?UTF-8?B?aXptYWkueGxz?=" } } object(stdClass)#27 (0) { }

  Ответить  
 
 автор: andrey215   (09.03.2012 в 14:03)   письмо автору
 
   для: andrey215   (09.03.2012 в 11:43)
 

кстати, только заметил, что эта ошибка вылетает тогда, когда в письме приложенный файл является архивом, если файл не архив, то все в порядке

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования