[RESOLU] Perte de valeur de l'attribut dans ma class

Eléphanteau du PHP | 13 Messages

24 sept. 2012, 15:57

Bonjour a tous :)

Enfaîte je débute en POO, j'ai voulu faire comme premier projet un éditeur de fichiers texte.
Tout marchait très bien lorsque je mets directement le nom du fichier.txt dans mon code, mais lorsque j'ai voulu introduire un <input type="file"> les problèmes commencent :) quand j'upload mon fichier.txt, j'arrive a l'afficher mais quand je le modifier et que j’envoie, la méthode invoquée qui est "modification()" prend une valeur null de l'attribut qui contient le nom du fichier.txt, par contre la méthode lire arrive bien a prendre la valeur de ce dernier :(

voici mes deux codes :
  
<?php
include('class_editeur.php');
?>

<html>
    <body>
<?php $editeurfinal = new editeur() ; ?> 
        
        <form method="post">
        <input type="file" onchange="this.form.submit()" name="fileupload">
       
         <?php
        
       
        if (isset($_POST['fileupload'])){
        
         
        $editeurfinal -> uploadfile($_POST['fileupload']);

        $editeurfinal -> lire();
    
        }
        ?>
        </form>
        
    <form method="post">
        
        <label>Texte : </label>
       <textarea id="styled" name="modification"><?php $editeurfinal -> affichage(); 
       
        if (isset($_POST['editer'])){

            $editeurfinal -> ecrire($_POST['modification']);
            //$editeurfinal ->redirection();
        }
       ?>
       </textarea>
        <input id=el11 type="submit" name="editer" value="Edit" />
    </form>

    </body>
</html>
ma class :
  
<?php

class editeur {
    
    private $fichier;
    private $file_handle;
    
    
    public function uploadfile ($fileupload){
         
 
      
      $this -> fichier = $fileupload;
      
    
         
     }
    
    public function lire(){ //fichier contient le nom du fichier txt  
        
        $this->file_handle = file_get_contents($this -> fichier);
      
    }
    
    public function ecrire($modification){ //fichier arrive ici sans valeur
    
        
        $this->file_handle = file_put_contents($this -> fichier,$modification);
       
        
    }
    
    public function affichage (){
        
        echo ltrim ($this->file_handle) ;
    
     
    }
     
     public function redirection (){
         
         header('Location: editeur.php'); 
     }
     
  
  
}

?>

Donc voila si quelqu'un a une idée :priere:

Merci !!

ViPHP
xTG
ViPHP | 7331 Messages

24 sept. 2012, 16:45

Un objet n'est pas persistant, c'est une variable.
Donc à la fin de l'exécution de ton script c'est détruit.

Exemple :
script1.php
$var = 1;
echo '<a href="script2.php">script 2.php</a>';
script2 :
echo $var; // undefined variable
Pour garder ton objet(ta variable) il faut soit le réinstancier à chaque changement de page.
Soit le stocker dans une variable de session.
session_start();
$var = 1;
$_SESSION['var'] = $var;
echo '<a href="script2.php">script 2.php</a>';
session_start();
$var = $_SESSION['var'];
echo $var; // 1

Eléphanteau du PHP | 13 Messages

24 sept. 2012, 20:13

merci pour ta réponse,

j'ai essayé de faire la session de mon objet dans les deux script, pas d'erreur mais rien ne change :(

j'ai ajouté :

Dans le premier script (ou j'ai mes deux formulaire) :
session_start();
$editeurfinal = new editeur();
$_SESSION['editeurfinal'] = $editeurfinal;
le second script ( ma class ) :
session_start();
$editeurfinal = $_SESSION['editeurfinal'];
Je suis totalement larguer ... j'ai réussi a coder en utilisant les variables de sessions avant mais avec les objet 'nada'

Merci encore

ViPHP
xTG
ViPHP | 7331 Messages

24 sept. 2012, 20:47

C'est une affectation de variable par copie du fait de la serialisation en session.
Donc il stocke l'état de la variable au moment de l'affectation.
session_start();
$editeurfinal = new editeur();
$_SESSION['editeurfinal'] = $editeurfinal;
$editeurfinal->uploadfile('test');
est faux car la sauvegarde se fait avant l'affectation dans l'objet.
session_start();
$editeurfinal = new editeur();
$editeurfinal->uploadfile('test');
$_SESSION['editeurfinal'] = $editeurfinal;
est correct.

Eléphanteau du PHP | 13 Messages

25 sept. 2012, 01:08

merci encore pour ta reponse xTG,

Donc je viens d'essayé d'initier la session après le reload, eh ban toujours rien :cry:

j'ai essayé de placer :
session_start();
$editeurfinal = new editeur();
$_SESSION['editeurfinal'] = $editeurfinal;
$editeurfinal->uploadfile('test');
après l'affectation, sans résultat toujours null :?

ViPHP
xTG
ViPHP | 7331 Messages

25 sept. 2012, 08:49

Erreur sur le session_start() ?
Cette fonction doit être la première de ton script PHP car il doit être le premier envoyé dans le header de la requête HTTP (donc avant tout echo ou chaîne HTML).
j'ai essayé de placer :
Pas sûr de te comprendre, mais dans le doute... Ce code est faux comme je l'indiquais.

Sur ta page après le reload effectues un var_dump($_SESSION['editeurfinal']); pour voir ce que cela retourne.
Si c'est NULL alors la session n'a pas démarrée.
Si c'est un objet alors c'est correct mais c'est ton utilisation de l'objet mis en session qui ne l'est pas ou bien tu l'as mal rempli.

Eléphanteau du PHP | 13 Messages

25 sept. 2012, 19:57

toujours rien :cry:

bon je vais essayé de détailler le maximum ...

J'ai deux fichier php : editeur.php et class_editeur.php, dans editeur.php j'utilise deux formulaire html l'un pour uploader le fichier texte et l'autre pour le modifier, l'instanciation de l'objet se fait dans se dernier, donc comme vous voyez j'utilise pas le fameux action="script.php" tout ce passe dedans.

Voici mon editeur.php en deux partie :

Première partie : instanciation + formulaire d'upload .
  
<?php
include('class_editeur.php');
?>
<html>
    <body>
<?php $editeurfinal = new editeur() ; ?> 
        
        <form method="post">
        <input type="file" onchange="this.form.submit()" name="fileupload">
       
         
<?php  if (isset($_POST['fileupload'])){ 
        
        
        $editeurfinal -> uploadfile($_POST['fileupload']); 

        $editeurfinal ->readfilename();
    
        } ?>
        
        </form>
Deuxième partie : lecture et écriture
<form method="post">
        
        <label>Texte : </label>
        
        <textarea id="styled" name="modification"> <?php $editeurfinal ->printtext();

        if (isset($_POST['editer'])){

            //$editeurfinal -> write($_POST['mod']);         
            //$editeurfinal ->redirection();
            
            session_start(); //  le chargement se passe ici donc je place ma session_start

            $_SESSION['editeurfinal'] = $editeurfinal; // je mets en session mon objet 
            
            $editeurfinal -> test(); //la méthode test() reçoit la valeur du fichier uploader
            
        }
       ?>
       </textarea>
        <input id=el11 type="submit" name="editer" value="EDIT" />
        
    </form>

    </body>
</html>
ma classe : class_editeur.php
<?php

class editeur {
    
    private $filename ;
    private $file_handle;
    
    public function uploadfile($fileupload){ 
         
        $this->filename=$fileupload;
    
      
     }
    
    public function readfilename(){
          
        $this->file_handle = file_get_contents($this -> filename);
      
    }
    
    public function write($mod){
    
        
        $this->file_handle = file_put_contents($this -> filename,$mod);
       
        
    }
    
    public function printtext(){

        echo ltrim ($this->file_handle) ;

    }
     
     public function redirection (){
         
         header('Location: editeur.php'); 
     }
     
     public function test(){ //file name test
         
          $this -> filename ;
          echo 'la var est : '.$this -> filename; 
     }
   
  
}

?>
Es ce que j'ai bien placer ma session_start ? autre chose, je ne suis pas sur d'avoir bien compris comment mettre mon objet en session ...
Excusez mon ignorance :oops: tout ça et nouveau pour moi,
Merci encore,

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

25 sept. 2012, 21:57

Salut,


Il est préférable de faire les validations de formulaire avant le html.

De plus le session_start() te fournis une erreur il doit être avant tout affichage !

Ton objet doit être mis en session à la validation du 1er formulaire, hors la tu le fait au second.


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 13 Messages

25 sept. 2012, 23:49

yeees ça marche !! merci man !!

le placement de la session était faux, je l'ai changer sur le premier formulaire et le miracle fut :) maintenant j'arrive a récupérer ma valeur sur le deuxième formulaire après deux jour de galère !

merci a tous les deux pour votre aide,

@+