Passage d'objet par POST/GET

Résolu
cs_TOURSENE Messages postés 11 Date d'inscription vendredi 26 mai 2006 Statut Membre Dernière intervention 3 avril 2009 - 26 sept. 2006 à 09:50
cs_TOURSENE Messages postés 11 Date d'inscription vendredi 26 mai 2006 Statut Membre Dernière intervention 3 avril 2009 - 26 sept. 2006 à 13:16
Salut à tous !

Je travaille actuellement sur un projet en e-commerce. Je suis en plein dans le développement du site. Je rencontre une difficulté. Je sais qu'il est plus courant d'utiliser des variables de session pour passer des objets, mais j'ai voulu testé une autre façon de faire. Peut-on passer un objet par les méthodes GET/POST ? Dans mon cas il s'agit d'un tableau d'objets sérialisé. L'idée était séduisante au départ, puis je me suis rendu compte que ça posait un problème : je n'arrive pas à récupérer mes valeurs par la méthode post, alors que je ne change même pas de page.

Voilà mon code : à cette page sont envoyés 2 tableaux $reference et $quantite qui sont créé par la même technique qu'ici (les inputs de type "hidden"). J'ai simplifié le code au maximum pour ne laisser que la partie vraiment utile.

include('Articles.class.php');
extract($_POST,EXTR_OVERWRITE);

if(!isset($_POST['commander']))
{
        echo'
            <form method= "POST" action="'.$PHP_SELF.'">;
            for($i=0;$i<sizeof($reference);$i++)
            {
                $article = new Articles($reference[$i],$quantite[$i]);         // on instance un nouvel article à chaque tour de boucle
                echo'';
             }
             echo'
            </form>';

            for($i=0;$i<sizeof($panier);$i++)       // boucle qui permet de vérifier le contenu de $panier
                                                                 // affiche bien des objets de type "Articles" sérialisés
                echo $panier[$i].'
';
           }
}
else
{
      print_r($panier).'
';             // affiche les types d'objets contenus dans $panier après soumission du formulaire
                                                      // affiche à l'écran ---> Array ( [0] => O:8: [1] => O:8: ) O:8:
      echo'
';                              // Ici $panier contient bien 2 objets sérialisés.
                                                     //si je déserialise, il me retourne... ben rien en fait, que du vide...

  for($i=0;$i<sizeof($panier);$i++)  // même boucle qu'avant le else et c'est là que le problème survient
  {                                                       // ça n'affiche rien...
    echo $panier[$i].'
';
  }

}

Je ne suis pas un crack en php, je débute en fait. Si quelqu'un pouvait m'aider à mieux comprendre, ce serait sympa, merci d'avance.
N'hésitez pas si vous avez des questions à me les poser, j'essaierai d'y répondre du mieux que je pourrais.

@+++, TOURSENE

4 réponses

cs_TOURSENE Messages postés 11 Date d'inscription vendredi 26 mai 2006 Statut Membre Dernière intervention 3 avril 2009 1
26 sept. 2006 à 13:16
Re, encore moi...

J'ai trouvé la solution à mon problème. Pour rappeler le contexte rapidement, je tentais de passer un objet (sérialisé) par la méthode POST.  Après le passage je n'arrivais pas à récupérer les données sérialisé, bien que j'utilisais unserialize().
Le truc peut intéressé du monde donc le voilà, en fait c'était tout bête. Je ne vais très certainement rien apprendre à personne mais bon.

Je ne l'ai pas encore testé avec le code de mon premier message, mais si ça marche avec le petit bout d'essai que j'ai testé, il n'y a pas de raisons.

Il suffit de prendre l'objet sérialisé et de lui appliquer la méthode urlencode(). Une fois le formulaire soumis, on utilise urldecode(), puis unserialize() et on peut de nouveaux exploiter ses données.

<?php
if(!isset($submit))
{
    //   on a une classe Objet(), on instancie $objet
    $objet = new Objet();
    $so = serialize($objet);
    $soe = urlencode($so);
    echo'
        <form method="POST" action="'.$PHP_SELF.'">
       
       
        </form>
       ';
}
else
{
    $soe = $_POST['hidden'];
    $so = urldecode($soe);
    $objet = unserialize($so);
}
?>

Voilà, c'est aussi simple que ça...
Allez à plus et encore merci, TOURSENE.
2
cs_darkduck Messages postés 138 Date d'inscription vendredi 28 février 2003 Statut Membre Dernière intervention 29 février 2008 1
26 sept. 2006 à 10:07
Bonjour,

je ne sais pas si ton problème vient de là mais il faut savoir que $_POST et $_GET on des longueurs maximales à ne pas dépasser.
Peut etre que leurs longueurs sont trop longues et que c'est pour cela que tu n'arriveas pas a récupérer les info.

Autre chose : Il ne faut pas faire unserialize($objet) avant d'afficher ?
0
cs_TOURSENE Messages postés 11 Date d'inscription vendredi 26 mai 2006 Statut Membre Dernière intervention 3 avril 2009 1
26 sept. 2006 à 10:27
Merci pour ta réponse darkduck.

Déjà pour l'histoire de longueur maximale à ne pas dépasser des $_POST et $_GET, je ne savais pas. Je te remercie.

Pour la question de déserialisation, j'ai précisé dans les commentaires de mon code que même après avoir fait unserialize($objet), ça ne retourne rien.

J'ai fait une autre version de mon code, cette fois avec variables de session. C'est pas tout mais je pas tout le temps que je souhaite. J'ai remplacé la boucle for, qui me permettait de créer mes objets $article, puis de les stocker dans le tableau $panier, par la suivante :

        for($i=0;$i<sizeof($reference);$i++)
        {
           $article = new Articles($reference[$i],$quantite[$i]);
            $panier[$i] = serialize($article);
        }
        session_register($panier);

La où ça coince, c'est ici :

  print_r($_SESSION);

renvoit :

Array ( [login] => stephane
[O:8:"Articles":2:{s:15:"referenceAchete";s:1:"4";s:14:"quantiteAchete";s:1:"1";}]
=>
[O:8:"Articles":2:{s:15:"referenceAchete";s:3:"100";s:14:"quantiteAchete";s:1:"1";}]
=> )

N'y a-t-il pas comme un problème ici ? Mes objets sont les clés ou je me trompe ?
0
cs_TOURSENE Messages postés 11 Date d'inscription vendredi 26 mai 2006 Statut Membre Dernière intervention 3 avril 2009 1
26 sept. 2006 à 10:39
Re suite à mon dernier message, j'y avais fait une petite erreur :

session_register($panier)        // non valide

il faut écrire :

$_SESSION['panier'] = $panier;

Ensuite,

$panier = $_SESSION['panier'];
print_r($panier);

renvoie :

Array ( [0] =>
O:8:"Articles":2:{s:15:"referenceAchete";s:1:"4";s:14:"quantiteAchete";s:1:"1";}
[1] =>
O:8:"Articles":2:{s:15:"referenceAchete";s:3:"100";s:14:"quantiteAchete";s:1:"1";}
)

Et là c'est tout bon, je peux poursuivre mon projet tranquillement.

Mais pour ce qui était de mon problème présenté dans le tout premier message, je cherche toutjours un solution. Ce serait juste pour le fun. Je trouve le cas intéressant, de pouvoir passer des objets par post/get. Il doit bien y avoir une solution.

Encore merci, TOURSENE
0
Rejoignez-nous