Créer une classe pour se connecter au ftp

Créer une classe pour se connecter au ftp - PHP - Programmation

Marsh Posté le 27-03-2015 à 15:32:23    

Bonjour à tous,
 
Voilà, je suis en train de monter un petit projet perso (on reste dans le débutant) dans lequel j'ai besoin de créer un module qui va chercher tout seul des infos sur mon ftp pour les afficher, les traiter etc.
 
J'ai écrit le code suivant pour me connecter et ça fonctionne (enfin, c'est surtout le code du manuel php, j'ai pas fait grand-chose non plus) :
 

Code :
  1. <?php
  2. $ftp_server = "serveur";
  3. $ftp_user = "id";
  4. $ftp_pass = "mdp";
  5. // Mise en place d'une connexion basique
  6. $conn_id = ftp_connect($ftp_server) or die("Couldn't connect to $ftp_server" );
  7. // Tentative d'identification
  8. if (@ftp_login($conn_id, $ftp_user, $ftp_pass)) {
  9.     echo "Connecté en tant que $ftp_user@$ftp_server\n";
  10. } else {
  11.     echo "Connexion impossible en tant que $ftp_user\n";
  12. }
  13. // Fermeture de la connexion
  14. ftp_close($conn_id);
  15. ?>


 
Du coup, pour réutiliser plus facilement ce code sur d'autres modules, je voudrais le transformer en classe. Malheureusement, j'y connais pas grand-chose vu que ça ne marche pas tellement.
 
J'ai créé deux fichiers : FTP.class.php et index.php pour tester rapido sur un serveur, mais rien ne se passe (je pense que c'est au niveau de la transmission des infos que ça plante, mais évidemment je n'en sais rien). Voici le code :
 
FTP.class.php

Code :
  1. <?php
  2. // INITIALISATION
  3. class FTP{
  4. private $ftp_stream;
  5. private $ftp_host;
  6. private $ftp_user;
  7. private $ftp_password;
  8. private $ftp_port;
  9. function __construct() {
  10.  $this->ftp_stream="";
  11.  $this->ftp_host="";
  12.  $this->ftp_user="";
  13.  $this->ftp_password="";
  14.  $this->ftp_port="";
  15. }
  16. function __destruct() {}
  17. // METHODES
  18. protected function connexion() {
  19.  $conn_id = ftp_connect($this->ftp_stream;) or die("Couldn't connect to $ftp_stream" );
  20.  if (@ftp_login($conn_id, $ftp_user, $ftp_password)) {
  21.   echo "Connecté en tant que $ftp_user sur le serveur $ftp_stream\n";
  22.  }
  23.  else {
  24.   echo "Connexion impossible en tant que $ftp_user\n";
  25.  }
  26. }
  27. }


 
Là je me suis inspiré du code mis en lien (si ça a réussi) d'un autre article sur ce forum, de 2008. J'ai bidouillé la fin.
 
Index.php

Code :
  1. <?php
  2. require 'FTP.class.php';
  3. $ftp = new FTP;
  4. $ftp->connexion('ftp.AA.com', 'BB', 'CC');
  5. ?>


 
Je ne suis pas du tout sûr de ce code là, c'est ici que j'ai le moins de connaissance, j'ai commencé à lire des trucs sur les classes y a un mois environ et je n'arrive à rien. Mais j'ai bon espoir que ça change :). Le truc c'est que index.php devrait se connecter au FTP et m'afficher le message "youpi je suis connecté" comme sur le premier exemple.
Si j'ai bien compris, le __construct me permet de mettre à 0 les valeurs de l'objet à chaque instance, et il faudrait donc que je passe mes params de connexion quand je crée un objet, comme sur le index.php. Mais je me trompe peut-être sur l'endroit où les passer ? ou juste sur le code en lui-même, mais là, je vois pas où du tout.
 
Voilà voilà, donc si quelqu'un avait une idée, un conseil, n'importe quoi qui me permette d'avancer sur ce problème, merci bien.

Reply

Marsh Posté le 27-03-2015 à 15:32:23   

Reply

Marsh Posté le 27-03-2015 à 16:20:00    

Salut,
 
Quand tu fais le :

Code :
  1. $ftp = new FTP;
  2. $ftp->connexion('ftp.AA.com', 'BB', 'CC');


 
Tu fais passer en paramêtres de connexion 3 infos.
 
Or ta méthod connexion, n'en fais rien...

Code :
  1. protected function connexion() {
  2. $conn_id = ftp_connect($this->ftp_stream;) or die("Couldn't connect to $ftp_stream" );
  3. if (@ftp_login($conn_id, $ftp_user, $ftp_password)) {
  4.  echo "Connecté en tant que $ftp_user sur le serveur $ftp_stream\n";
  5. }
  6. else {
  7.  echo "Connexion impossible en tant que $ftp_user\n";
  8. }
  9. }


 
il te faudrai setter ces valeurs et les utiliser ;)
C'est ici que ton problème ce localise  :jap:


---------------
Créer son forum gratuit |  Mon beau blog phpBB caÿ le mal :o
Reply

Marsh Posté le 27-03-2015 à 16:26:37    

Pourquoi t'as mis ta fonction connexion() en protected au lieu de public :??:
 
Par ailleurs, elle ne prend aucun paramètre alors que dans ton index.php, tu en passes. Enfin, dans la fonction connexion, à aucun moment tu initialises les attributs private avec les paramètres passés à connexion() :pt1cable:  
 
Bref, tu fais n'importe quoi. Je te recommande de lire des tutos sur la programmation objet avant de commencer à coder, sinon, tu vas perdre beaucoup de temps en débuggage pour des trucs tous con ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 27-03-2015 à 16:47:43    

Re,
 
Déjà merci d'avoir répondu si vite.
 
@scull=> Pour ce qui est de passer des valeurs à connexion(), j'ai bien essayé, comme ceci :

Code :
  1. function connexion($ftp_stream, $ftp_host, $ftp_user, $ftp_password)


 
Mais ça ne change pas grand-chose. Après peut-être que je le fais mal ?
 
@rufo => Pour ce qui est de lire des tutos, je suis tout à fait d'accord, c'est bien ce que je fais. Mais après faut passer à la pratique sinon on risque pas d'avancer plus. Je vais continuer mes recherches mais j'aurais bien aimé savoir dans quelle direction avancer précisément, c'eut été plus rapide :).
 

Citation :

Enfin, dans la fonction connexion, à aucun moment tu initialises les attributs private avec les paramètres passés à connexion() :pt1cable:  


 
Je ne suis pas sûr d'avoir compris cette partie là.
 
Merci encore de vos réponses.

Reply

Marsh Posté le 27-03-2015 à 16:53:13    

Reply

Marsh Posté le 27-03-2015 à 17:02:52    

Splagadou a écrit :

Re,
 
Déjà merci d'avoir répondu si vite.
 
@scull=> Pour ce qui est de passer des valeurs à connexion(), j'ai bien essayé, comme ceci :

Code :
  1. function connexion($ftp_stream, $ftp_host, $ftp_user, $ftp_password)


 
Mais ça ne change pas grand-chose. Après peut-être que je le fais mal ?
 
@rufo => Pour ce qui est de lire des tutos, je suis tout à fait d'accord, c'est bien ce que je fais. Mais après faut passer à la pratique sinon on risque pas d'avancer plus. Je vais continuer mes recherches mais j'aurais bien aimé savoir dans quelle direction avancer précisément, c'eut été plus rapide :).
 

Citation :

Enfin, dans la fonction connexion, à aucun moment tu initialises les attributs private avec les paramètres passés à connexion() :pt1cable:  


 
Je ne suis pas sûr d'avoir compris cette partie là.
 
Merci encore de vos réponses.


Le concept de private, protected et public étant la base de la POO, je réitère mon conseil de lire des tutos. Ton pb provient très probablement du fait que la méthode connexion() est protected (elle devrait être public) : http://openclassrooms.com/courses/ [...] heritage-3
 
Le fait que tu ne parles pas de msg d'erreur à ce sujet me laisse à penser que t'as pas dû bien activer tous les msgs d'erreur de PHP :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 28-03-2015 à 13:23:59    

Re,
 
Il semblerait que ça marche avec le code suivant (la classe FTP est devenue Connexion pour un souci de lisibilité) :
 
connexion.class.php

Code :
  1. <?php
  2. class Connexion {
  3. private $_ftp_host;
  4. private $_ftp_user;
  5. private $_ftp_pass;
  6. private $_ftp_port;
  7. function __construct($a, $b, $c, $d) {
  8.  $this->setHost($a);
  9.  $this->setUser($b);
  10.  $this->setPass($c);
  11.  $this->setPort($d);
  12.  $this->connexion_ftp();}
  13. //GETTERS - SETTERS
  14. function ftp_host() {return $this->_ftp_host;}
  15. function ftp_user() {return $this->_ftp_user;}
  16. function ftp_pass() {return $this->_ftp_pass;}
  17. function ftp_port() {return $this->_ftp_port;}
  18. function setHost($ftp_host) {$this->_ftp_host = $ftp_host;}
  19. function setUser($ftp_user) {$this->_ftp_user = $ftp_user;}
  20. function setPass($ftp_pass) {$this->_ftp_pass = $ftp_pass;}
  21. function setPort($ftp_port) {$this->_ftp_port = $ftp_port;}
  22. //METHODES
  23. function connexion_ftp()
  24. {
  25.  // Mise en place d'une connexion basique
  26.  $conn_id = ftp_connect($this->_ftp_host, $this->_ftp_port) or die("Impossible de se connecter à $this->_ftp_host" );
  27.  // Tentative d'identification
  28.  if (@ftp_login($conn_id, $this->_ftp_user, $this->_ftp_pass)) {
  29.   echo "Connecté en tant que $this->_ftp_user sur le serveur $this->_ftp_host sur le canal $this->_ftp_port\n";
  30.   } else {
  31.   echo "Connexion impossible en tant que $this->_ftp_user\n";
  32.   }
  33.  // Fermeture de la connexion
  34.  ftp_close($conn_id);
  35. }
  36. }
  37. ?>


 
Index.php

Code :
  1. <?php
  2. require 'connexion.class.php';
  3. //(hote, utilisateur, mdp, port)
  4. $connexion = new Connexion("", "", "", "" );
  5. ?>


 
Donc d'abord, un grand merci pour les liens, effectivement je me sers ce ce site en général, mais j'avais du louper ce cours.
 
Ensuite quelques questions quand même pour bien tout comprendre :
 
- A quoi servent les Getters/setters ? bien sûr, sans le code marche, j'ai bien cru comprendre qu'ils permettaient d'utiliser les variables hors de la classe, mais je vois pas pourquoi dans mon code ça marche.
En effet, je reste tout le temps dans mon objet là, vu que j'ai réduit l'appel extérieur à la fonction __construct non ?
 
- Petit 2, j'ai essayé de minimiser le code mais il n'y a pas une façon encore plus rapide d'écrire ce que je viens de faire ?
 
Voilà, en tout cas je remercie encore les intervenants sur cette question, sans vous je n'aurais pas trouvé aussi vite.
 
Ah oui, pour la remarque sur les codes d'erreurs, effectivement je ne sais pas les afficher. J'ai bien testé de mettre ce code en début de document

Code :
  1. // Afficher les erreurs à l'écran
  2. ini_set('display_errors', 1);
  3. // Afficher les erreurs et les avertissements
  4. error_reporting(e_all);


 
mais ça ne sert à rien du tout. C'est peut-être parce que j'ai pas la main sur le php.ini étant en serveur mutualisé ? En tout cas, je serais intéressé de savoir comment les afficher ces erreurs de script :).


Message édité par Splagadou le 28-03-2015 à 13:28:44
Reply

Marsh Posté le 29-03-2015 à 13:52:22    

Je vais te redire pour la 3ème fois ce que je t'ai dit : lis le cours concernant la POO et les notions de private, protected et public. Ces 3 valeurs représentent un concept fondamental de la POO. Si tu ne comprends pas pourquoi tu as besoin des accesseurs get et set quand tu as des attributs d'une classe déclarés en private, alors c'est que tu n'as pas compris le concept. :o Le cours t'aidera aussi à comprendre pourquoi un constructeur de classe peut avoir besoin de paramètres.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed