Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]imap_open a przechodenie miedzy mailboxami
Forum PHP.pl > Forum > Przedszkole
Wolfie
Witam,

Mam taki kawalek kodu :

  1. function mailbox() {
  2. $_SESSION['login'] = $_POST['mailbox'];
  3. $_SESSION['pass'] = $_POST['pass'];
  4. if(($this->model->connect('gmail.com',$_SESSION['login'],$_SESSION['pass'],'993','imap')) == false) {
  5. $this->view = new LoginView;
  6. $this->view->display('login');
  7. echo 'Niepoprawny login lub hasło!';
  8. } else {
  9. echo 'Zalogowany!';
  10. $this->model->inbox();
  11. $view = new LoginView;
  12. $boxes = $this->model->getMailboxes();
  13. $msgsParts = $this->model->getMsgsParts(333);
  14. $view->setVars('boxes', $boxes);
  15. $view->setVars('parts',$msgsParts);
  16. $view->display($_POST['action']);
  17. }
  18. }


Jak widac mamy tutaj taka linijke kodu :
  1. $this->model->connect('gmail.com',$_SESSION['login'],$_SESSION['pass'],'993','imap'))


Ktora uruchamia funkcje znajdujaca sie w innej klasie :
  1. public function connect($server, $user, $pass, $port = 993, $protocol = 'imap') {
  2. if(!($this->_connection = imap_open('{imap.'.$server.':'.$port.'/'.$protocol.'/ssl}', $user, $pass))){
  3. //throw new Exception('Mailserver connection failure');
  4. return false;
  5. } else {
  6. return $this->_connection;
  7. }
  8. }


No i tutaj jest wszystko ok, ale teraz chce przelaczyc sie na inny mailbox (przejsc do innego widoku) w tej samej skrzynce i do tego sluzy mi taka funkcja :
  1. function reconnect($mailbox) {
  2. $server = '{imap.gmail.com:993/ssl}'.$mailbox;
  3. echo $server;
  4. if($this->_connection == false) {
  5. echo 'not connected';
  6. } else {
  7. echo 'connected';
  8. }
  9. $this->_reconnection = imap_reopen($this->_connection, $server) or die(imap_errors());
  10. }


Jako argument ta funkcja dostaje nazwe skrzynki zwrocony przez imap_list i lekkich modyfikacjach na stringu....

No i dostaje taki blad

Cytat
imap_reopen(): supplied argument is not a valid imap resource


A do tego wchodzi mi w warunek if($this->_connection == false) tak jakby tracil połączenie do skrzynki.......

No i teraz pytanie, czy za kazdym razem jak chce połączyc sie z inna skrzynka to musze odnawiac połączenie z serwerem ?
Troche to by bylo dziwne ze musze najpierw wywolac imap_open a zaraz pozniej imap_reopen...

Prosze kogos z wieksza wiedza odemnie na ten temat o podpowiedz ....
wookieb
A może poprostu przez przypadek zamykasz gdzieś połączenie, tworzysz nową instancje twojego modelu?. Prześledź dokładnie cóż się dzieje z właściwością _connection
Wolfie
Fakt, w kontrolerze wywoluje metode :

  1. if(isset($action)) {
  2. $model = ucfirst($action);
  3. $this->setModel($model);
  4. }


ktora wyglada tak

  1. public function setModel($model) {
  2. $className = $model.'Model';
  3. $this->model = new $className;
  4. echo 'SET MODEL OK';
  5. }


Ktora wywoluje mi drugi raz ten sam model....ale gdy zakomentowalem linijke
  1. //$this->setModel($model);


To dostalem fatala :

Cytat
Fatal error: Call to a member function reconnect() on a non-object in
wookieb
No to masz odpowiedź. Uporządkuj kod tak aby twoja klasa operowała na jednym modelu. A skoro masz taki błąd oznacza to, że model ci znikł. A dlaczego? Nie jestem w stanie stwierdzić po takiej garstce kodu, ale wiem, że ty dasz radę po powyższej poradzie.
Wolfie
Podrzuce wiecej kodu bo nie moge znalezc bledu, niby znika model ale gdzie ? Nie ma nigdzie w kodzie takiego kawalka ktory by za to odpowiadal, przynajmniej ja nie wiedze, moze Ty cos zobaczysz.

Tutaj plik index.php gdzie przekierowuje wszystkie rzadania :

  1. <?php
  2.  
  3. try {
  4. $frontController = MainController::getInstance();
  5. $frontController->dispatch($_POST,$_SESSION);
  6. //$mailboxAccess = new MailboxAccess();
  7. //$mailboxController = new MailboxController($mailboxAccess, $_POST, $_SESSION);
  8. //echo $mailboxController->display();
  9.  
  10. } catch(Exception $e){
  11. echo $e->getMessage();
  12. exit();
  13. }
  14. ?>


No i teraz MainController :
  1. <?php
  2.  
  3. class MainController {
  4.  
  5. private function __construct() {
  6. $this->controllerPrefix = 'controllers/class.';
  7. $this->controllerSufix = '.php';
  8. }
  9.  
  10. static public function getInstance() {
  11. if (!self::$instance instanceof self) {
  12. self::$instance = new self;
  13. }
  14. return self::$instance;
  15. }
  16.  
  17. public function dispatch($_POST = null,$_SESSION = null) {
  18.  
  19. $controllerClassName = ucfirst($_POST['controller']).'Controller';
  20. $params = array_merge($_POST,$_SESSION);
  21.  
  22. if($_POST['controller'] != '') {
  23. $filename = $this->controllerPrefix.$controllerClassName.$this->controllerSufix;
  24. if(file_exists($filename)) {
  25. echo 'Plik ktorego kontroler to '. $controllerClassName .' istnieje !';
  26. $controllerClass = new $controllerClassName($params);
  27. } else {
  28. $controllerClass = new LoginController($params);
  29. echo 'Plik kontrolera nie istnieje';
  30. }
  31. } else {
  32. $controllerClass = new LoginController($params);
  33. echo 'Zmienna controller nie zostala przeslana';
  34. }
  35. }
  36.  
  37. public function setModel($model) {
  38. $className = $model.'Model';
  39. $this->model = new $className;
  40. }
  41. }
  42. ?>

Nastepnie stad przechodzi do LoginControllera ktory wywoluje metode setModel :
  1. <?php
  2.  
  3. class LoginController extends MainController{
  4.  
  5. function __construct($params) {
  6. $action = $params['action'];
  7.  
  8. if(isset($action)) {
  9. $model = ucfirst($action);
  10. $this->setModel($model);
  11. }
  12.  
  13. if(method_exists('LoginController', $action)) {
  14. $this->$action($params);
  15. } else {
  16. $this->defaultAction();
  17. }
  18. }
  19.  
  20. function defaultAction() {
  21. echo 'Widok logowania';
  22. $this->view = new LoginView;
  23. $this->view->display('login');
  24. }
  25.  
  26. function mailbox() {
  27. echo 'login';
  28. $_SESSION['login'] = $_POST['mailbox'];
  29. $_SESSION['pass'] = $_POST['pass'];
  30. if(($this->model->connect('gmail.com',$_SESSION['login'],$_SESSION['pass'],'993','imap')) == false) {
  31. $this->view = new LoginView;
  32. $this->view->display('login');
  33. } else {
  34. $this->model->inbox();
  35. $view = new LoginView;
  36. $boxes = $this->model->getMailboxes();
  37. $msgsParts = $this->model->getMsgsParts(333);
  38. $view->setVars('boxes', $boxes);
  39. $view->setVars('parts',$msgsParts);
  40. $view->display($_POST['action']);
  41. }
  42. }
  43. }
  44. ?>

No i teraz klikam na nazwe innej skrzynki ktora mi przekazuje do index.php inne zmienne i wywoluje MailboxController:
  1. <?php
  2.  
  3. class MailboxController extends MainController{
  4.  
  5. function __construct($params) {
  6. $action = $params['action'];
  7.  
  8. if(isset($action)) {
  9. //$model = ucfirst($action);
  10. //$this->setModel($model);
  11. }
  12.  
  13. if(method_exists('MailboxController', $action)) {
  14. $this->$action($params);
  15. } else {
  16. $this->defaultAction();
  17. }
  18. }
  19.  
  20. function mailbox() {
  21. echo 'MailboxController action mailbox!';
  22. $this->model->reconnect($_POST['mailbox']);
  23. }
  24. }
  25. ?>

No i jak zakomentuje te dwie linijki odpowiedzialne za model to wywala mi blad :
  1. [b]Fatal error[/b]: Call to a member function reconnect() on a non-object in

tak jakby model znikal....

Widzisz gdzie cos tu moze byc nie tak ?
No i jeszcze takie pytanie , jak dlugo istnieje obiekt w aplikacji ?
wookieb
Przy każdym wywołaniu skryptu (przeładowaniu skryptu) musisz się połączyć z imapem ponownie...
Wolfie
Czyli jedynym rozwiazaniem jest za kadym razem wywolywac imap_open a zaraz po tym imap_reopen ?
Czy moze widzisz tu jakies inne rozwiazanie ?
wookieb
W każdym skrypcie powinieneś mieć resource dla połączenia z imapem. Nie uzyskasz go w inny sposób niż tylko przez imap_open. Wiec na każdej stronie musisz zrobić najpierw imap_open a potem imap_reopen
Wolfie
No a np poprzez przekazanie obiektu przez sesje ? nie da rady ?
wookieb
Nie. Resourców nie możesz serializować. A to się właśnie dzieje przy sesji.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.