| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

30-04-2010, 18:27
|
|
sascha_kote
Registrierter Benutzer
|
|
Registriert seit: Apr 2010
Beiträge: 4
|
|
Fatal error: Cannot use object of type stdClass as array
hallo,
meine ex hatte mir dieses script geschrieben (leider) und nun habe ich momentan keinen so guten kontakt mehr zu ihr 
im grunde geht es so:
man schickt ein foto per mail an eine mailadresse.
das script wird aufgerufen, das postfach abgerufen und das foto mit forllaufender nummer in ein verzeichnis gespeichert.
jetzt kommt plötzlich diese fehlermeldung und ich weiß überhaupt nicht woran das liegen könnte
ich hoffe hier hilfe zu finden.
danke
sascha
Datei wird wie folgt abgespeichert:
Name des Verzeichnisses 'dann' $basename' 'fünfstellige_Nummer_fortlaufend.jpg oder gif
je nach Ausgangsdatei
Im $basename wird der Mittelteil des Dateinamens festgelegt.
bilderfoto00001.jpg
i diesem Fall:
bilderfoto00001.jpg
Im Verzeichnis sollte eine Datei ohne fortlaufende Nummer liegen:
bilderfoto.jpg / bilderfoto.gif
Sonst wird diese als erste angelegt
PHP-Code:
<? /* Konfiguration */ $conf = array(); $conf['host'] = '{imap.domain.tld}'; //Accountzugang welches Postfach abgerufen werden soll $conf['username'] = '123'; // Zugangsdaten $conf['password'] = 'pw'; //Passwort $conf['path'] = './verzeichnis'; //Bilder werden in dieses Verzeichnis kopiert $conf['ext'] = array(".gif",".jpg",".jpeg"); //erlaubte Dateiendungen /* AB HIER NICHTS MEHR EDITIEREN */ $mbox = imap_open ($conf['host'],$conf['username'],$conf['password']); $headers = imap_headers ($mbox); if ($headers == false) { echo "Nothing to do! \n"; }else{ while (list ($key, $val) = each ($headers)) { $mid = $key + 1; $header = imap_header($mbox, $key+1); $struct = imap_fetchstructure($mbox, $key+1); extract_attachments($mbox,$mid); imap_delete($mbox,$mid); } imap_expunge($mbox); imap_close ($mbox); } function extract_attachments($mbox,$mid) { global $conf; $struct = imap_fetchstructure($mbox, $mid); $parts = $struct->parts; $i = 0; if (!$parts) { $attachment = array(); $content = imap_body($mbox, $mid); } else { $endwhile = false; $stack = array(); $content = ""; $attachment = array(); while (!$endwhile) { if (!$parts[$i]) { if (count($stack) > 0) { $parts = $stack[count($stack)-1]["p"]; $i = $stack[count($stack)-1]["i"] + 1; array_pop($stack); } else { $endwhile = true; } } if (!$endwhile) { $partstring = ""; foreach ($stack as $s) { $partstring .= ($s["i"]+1) . "."; } $partstring .= ($i+1); if (strtoupper($parts[$i]->disposition) == "ATTACHMENT") { /* Attachment */ $attachment[] = array("filename" => $parts[$i]->parameters[0]->value, "filedata" => imap_fetchbody($mbox, $mid, $partstring)); $encoding = $parts[$i]->encoding; $ext = strrchr($parts[$i]->parameters[0]->value,'.'); if (in_array($ext, $conf['ext'])) { $ext == '.jpeg' ? $basename = substr($parts[$i]->parameters[0]->value, 0, -5) : $basename = substr($parts[$i]->parameters[0]->value, 0, -4); #files sollen immer den gleich namen mit forlaufender Nr. haben $basename = 'foto'; // Hier steht der Mittelteil des Dateinamens echo "Bild gefunden: ".$parts[$i]->parameters[0]->value." "; if(file_exists($conf['path'] . $basename . $ext)) { $i = 1; if(file_exists($conf['path'] . $basename . $ext)) { while(file_exists($conf['path'] . $basename . sprintf("%05s", $i) . $ext)) { $i++; } } $fp = fopen($conf['path'] . $basename . sprintf("%05s", $i) . $ext,"w+"); } else { $fp = fopen($conf['path'] . $basename . $ext,"w+"); } if ($encoding == 3) { fwrite($fp, base64_decode(imap_fetchbody($mbox, $mid, $partstring))); } else { fwrite($fp, imap_fetchbody($mbox, $mid, $partstring)); } } } } if ($parts[$i]->parts) { $stack[] = array("p" => $parts, "i" => $i); $parts = $parts[$i]->parts; $i = 0; } else { $i++; } } } } ?> Es sollte 3 Mailaccounts geben. pop3 mail1 pop3 mail2 weiterleitung mail 3 besucher mailt foto an mail3 mail3 leitet weiter an mail1 und mail2 mail1 wird autom. abgerufen und gelöscht mail2 ist eine sicherung um auf alle mails jederzeit zugreifen zu können Datei wird wie folgt abgespeichert: Name des Verzeichnisses 'dann' $basename' 'fünfstellige_Nummer_fortlaufend.jpg oder gif je nach Ausgangsdatei Im $basename wird der Mittelteil des Dateinamens festgelegt. bilderfoto00001.jpg i diesem Fall: bilderfoto00001.jpg Im Verzeichnis sollte eine Datei ohne fortlaufende Nummer liegen: bilderfoto.jpg / bilderfoto.gif Sonst wird diese als erste angelegt <? /* Konfiguration */ $conf = array(); $conf['host'] = '{imap.sorkosys.de}'; //Accountzugang welches Postfach abgerufen werden soll $conf['username'] = 'photo@sorkosys.de'; // Zugangsdaten $conf['password'] = 'test'; //Passwort $conf['path'] = './sorkosys'; //Bilder werden in dieses Verzeichnis kopiert $conf['ext'] = array(".gif",".jpg",".jpeg"); //erlaubte Dateiendungen /* AB HIER NICHTS MEHR EDITIEREN */ $mbox = imap_open ($conf['host'],$conf['username'],$conf['password']); $headers = imap_headers ($mbox); if ($headers == false) { echo "Nothing to do! \n"; }else{ while (list ($key, $val) = each ($headers)) { $mid = $key + 1; $header = imap_header($mbox, $key+1); $struct = imap_fetchstructure($mbox, $key+1); extract_attachments($mbox,$mid); imap_delete($mbox,$mid); } imap_expunge($mbox); imap_close ($mbox); } function extract_attachments($mbox,$mid) { global $conf; $struct = imap_fetchstructure($mbox, $mid); $parts = $struct->parts; $i = 0; if (!$parts) { $attachment = array(); $content = imap_body($mbox, $mid); } else { $endwhile = false; $stack = array(); $content = ""; $attachment = array(); while (!$endwhile) { if (!$parts[$i]) { if (count($stack) > 0) { $parts = $stack[count($stack)-1]["p"]; $i = $stack[count($stack)-1]["i"] + 1; array_pop($stack); } else { $endwhile = true; } } if (!$endwhile) { $partstring = ""; foreach ($stack as $s) { $partstring .= ($s["i"]+1) . "."; } $partstring .= ($i+1); if (strtoupper($parts[$i]->disposition) == "ATTACHMENT") { /* Attachment */ $attachment[] = array("filename" => $parts[$i]->parameters[0]->value, "filedata" => imap_fetchbody($mbox, $mid, $partstring)); $encoding = $parts[$i]->encoding; $ext = strrchr($parts[$i]->parameters[0]->value,'.'); if (in_array($ext, $conf['ext'])) { $ext == '.jpeg' ? $basename = substr($parts[$i]->parameters[0]->value, 0, -5) : $basename = substr($parts[$i]->parameters[0]->value, 0, -4); #files sollen immer den gleich namen mit forlaufender Nr. haben $basename = 'foto'; // Hier steht der Mittelteil des Dateinamens echo "Bild gefunden: ".$parts[$i]->parameters[0]->value." "; if(file_exists($conf['path'] . $basename . $ext)) { $i = 1; if(file_exists($conf['path'] . $basename . $ext)) { while(file_exists($conf['path'] . $basename . sprintf("%05s", $i) . $ext)) { $i++; } } $fp = fopen($conf['path'] . $basename . sprintf("%05s", $i) . $ext,"w+"); } else { $fp = fopen($conf['path'] . $basename . $ext,"w+"); } if ($encoding == 3) { fwrite($fp, base64_decode(imap_fetchbody($mbox, $mid, $partstring))); } else { fwrite($fp, imap_fetchbody($mbox, $mid, $partstring)); } } } } if ($parts[$i]->parts) { $stack[] = array("p" => $parts, "i" => $i); $parts = $parts[$i]->parts; $i = 0; } else { $i++; } } } } ?>
Geändert von sascha_kote (30-04-2010 um 20:02 Uhr)
Grund: sorry
|

30-04-2010, 18:38
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.310
|
|
Bitte nutz die PHP-Tags für deinen Code.  So kann das keiner lesen.
Danke
Peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
|

30-04-2010, 21:23
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Und wenn du noch so nett wärst, die Zeilennummer anzugeben, die in der Fehlermeldung genannt wird und diese Zeile im Code mit einem Kommentar hervorzuheben, könnte man sogar noch rauskriegen, woran es liegt, ohne alle 264 Zeilen lesen zu müssen.
Gruß,
Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
Geändert von AmicaNoctis (30-04-2010 um 21:31 Uhr)
|

30-04-2010, 21:28
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.310
|
|
Schon besser. Jetzt sorge bitte auch noch dafür, dass der Code sauber eingerückt ist. Denn man kann immer noch nicht die Struktur erkennen. Um das Problem zu finden, müsste man vorher den gesamten Code per Hand formatieren. Und dazu wird hier wohl keiner bereit sein. Geht übrigens wunderbar, wenn du noch mal mit Copy&Paste arbeitest.
Danke
Peter
PS:
Zitat:
|
meine ex hatte mir dieses script geschrieben
|
Du lässt das von einer Frau machen? Und die heißt nicht AmicaNoctis. Armer Kerl.
SCNR
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
|

30-04-2010, 21:40
|
|
sascha_kote
Registrierter Benutzer
|
|
Registriert seit: Apr 2010
Beiträge: 4
|
|
der fehler soll in zeite 117 sein.
danke für die hähme - hab ich wohl verdient
PHP-Code:
<?
/* Konfiguration */ $conf = array(); $conf['host'] = '{imap.domain}'; //Accountzugang welches Postfach abgerufen werden soll $conf['username'] = 'user'; // Zugangsdaten $conf['password'] = 'test123'; //Passwort $conf['path'] = './verz'; //Bilder werden in dieses Verzeichnis kopiert $conf['ext'] = array(".gif",".jpg",".jpeg"); //erlaubte Dateiendungen /* AB HIER NICHTS MEHR EDITIEREN */ $mbox = imap_open ($conf['host'],$conf['username'],$conf['password']); $headers = imap_headers ($mbox); if ($headers == false) { echo "Nothing to do! \n"; }else{ while (list ($key, $val) = each ($headers)) { $mid = $key + 1; $header = imap_header($mbox, $key+1); $struct = imap_fetchstructure($mbox, $key+1); extract_attachments($mbox,$mid); imap_delete($mbox,$mid); } imap_expunge($mbox); imap_close ($mbox); } function extract_attachments($mbox,$mid) { global $conf; $struct = imap_fetchstructure($mbox, $mid); $parts = $struct->parts; $i = 0; if (!$parts) { $attachment = array(); $content = imap_body($mbox, $mid); } else { $endwhile = false; $stack = array(); $content = ""; $attachment = array(); while (!$endwhile) { if (!$parts[$i]) { if (count($stack) > 0) { $parts = $stack[count($stack)-1]["p"]; $i = $stack[count($stack)-1]["i"] + 1; array_pop($stack); } else { $endwhile = true; } } if (!$endwhile) { $partstring = ""; foreach ($stack as $s) { $partstring .= ($s["i"]+1) . "."; } $partstring .= ($i+1); if (strtoupper($parts[$i]->disposition) == "ATTACHMENT") { /* Attachment */ $attachment[] = array("filename" => $parts[$i]->parameters[0]->value, "filedata" => imap_fetchbody($mbox, $mid, $partstring)); $encoding = $parts[$i]->encoding; $ext = strrchr($parts[$i]->parameters[0]->value,'.'); if (in_array($ext, $conf['ext'])) { $ext == '.jpeg' ? $basename = substr($parts[$i]->parameters[0]->value, 0, -5) : $basename = substr($parts[$i]->parameters[0]->value, 0, -4); #files sollen immer den gleich namen mit forlaufender Nr. haben $basename = 'foto'; // Hier steht der Mittelteil des Dateinamens echo "Bild gefunden: ".$parts[$i]->parameters[0]->value." "; if(file_exists($conf['path'] . $basename . $ext))
{ $i = 1; if(file_exists($conf['path'] . $basename . $ext)) { while(file_exists($conf['path'] . $basename . sprintf("%05s", $i) . $ext)) { $i++; } }
$fp = fopen($conf['path'] . $basename . sprintf("%05s", $i) . $ext,"w+"); } else { $fp = fopen($conf['path'] . $basename . $ext,"w+"); } if ($encoding == 3) { fwrite($fp, base64_decode(imap_fetchbody($mbox, $mid, $partstring))); } else { fwrite($fp, imap_fetchbody($mbox, $mid, $partstring)); } } } } if ($parts[$i]->parts) { $stack[] = array("p" => $parts, "i" => $i); $parts = $parts[$i]->parts; $i = 0; } else { $i++; } } } } ?>
|

30-04-2010, 21:50
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Warum hast du den Code nochmal gepostet?
Code:
115| $i++;
116| }
117| } // in Zeile 117 is nix
118| }
119| }
120| ?>
Reden PHP und du überhaupt von derselben Datei?
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

30-04-2010, 23:01
|
|
sascha_kote
Registrierter Benutzer
|
|
Registriert seit: Apr 2010
Beiträge: 4
|
|
ich wußte nicht, dass die ganzen leerzeilen mitgezählt werden.
der fehler soll in dieser zeile sein:
$attachment[] = array("filename" => $parts[$i]->parameters[0]->value,
|

30-04-2010, 23:30
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von sascha_kote
ich wußte nicht, dass die ganzen leerzeilen mitgezählt werden.
|
Wenn ich in meiner Wohnung nur für die Flächen mit Teppich bezahlen müsste, wäre ich auch glücklicher, ist aber nicht so und ich bin zum Glück auch nie davon ausgegangen.
Zitat:
Zitat von sascha_kote
$attachment[] = array("filename" => $parts[$i]->parameters[0]->value,
|
Sieh dir $parts und $parts[$i]->parameters mit print_r an, dann findest du raus, ob es Array oder Objekt ist. Das Ergbnis teilst du uns mit und wir sehen weiter.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

01-05-2010, 10:24
|
|
sascha_kote
Registrierter Benutzer
|
|
Registriert seit: Apr 2010
Beiträge: 4
|
|
was ist, bitteschön, print_r ?
|

01-05-2010, 10:26
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|