Page 1 sur 1

serialisation, curl, ....transfert des données ...

Posté : 07 avr. 2009, 15:09
par Nours312
salut :

Je me prend la tete avec ce problème depuis quelques jours ....


je travail sur le transfert de données à l'aide d'une session cURL d'un serveur à un autre ...

J'avais fait une fonction qui fonctionnais très bien, qui été très lourde, de sérialisation manuel

elle transformais

$var[id][post][test] = "ici"
$var[id][pose][dest] = "la"

en :
$var = "id-_-post-_-test = ici & id-_-pose-_-dest = la "

il me suffisait ddonc de passer cette variable en $_post par cURL pour ensuite la décompresser


Vous l'avez compris, Le gros problème de cette structure c'est la limite des sous tabeaux ... tous doivent etre prévus OBLIGATOIREMENT

et mes scripts de compression, décompression fonts une trentaines de lignes ....


Donc, j'ai opté pour serialize() qui est fait pour ça, sans me souvenir pourquoi, je ne l'avais pas employé à l'époque ::

=> heauu .... comment je fait pour faire transiter du code (dans le cadre d'un forum)

comment faire comprendre à la fonction que ceci :
 	function __construct($idAttrib="", $conf="", $s, $c){
		$this->idAttrib = $idAttrib;
		$this->conf		= $conf;
		$this->s		= $s;
		$this->c		= $c;
		parent::__construct();

Doit impérativement ne pas etre interprété comme des éléments variables ... mais comme une chaine ?

Merci à tous ...

Dois-je encoder toutes mes valeurs ?? et dans ce cas, avec quel fonction de préférence ! ?

BonCode ;)

Posté : 07 avr. 2009, 15:15
par Sékiltoyai
eval() ?

Posté : 07 avr. 2009, 15:42
par Nours312
heuu .....

non, pas 2 fois d'affilé ... :s,


je ne veux pas interpréter le code, je veux pouvoir le transférer dans une variable sériablizée

$_POST[maVar][content] = "function __construct($idAttrib=\"\", $conf=\"\", $s, $c){
        $this->idAttrib = $idAttrib;
        $this->conf        = $conf;
        $this->s        = $s;
        $this->c        = $c;
        parent::__construct();"

$post = array('P' => selialize($_POST));

 // => transfert cURL avec $post en POSTFIELD

// reception :

echo unserialize($_POST['P']) ;

Ben le problème c'est que unserialize interprete les éléments du contenu de la variable {, et autres : comme des éléments créés par la fonction serialize() .. et donc, ma variable n'a plus rien à voir avec l'origine ...

Merci ;)

Posté : 07 avr. 2009, 16:45
par Calimero

$_POST[maVar][content] = "function __construct($idAttrib="", $conf="", $s, $c){
        $this->idAttrib = $idAttrib;
        $this->conf        = $conf;
        $this->s        = $s;
        $this->c        = $c;
        parent::__construct();"

$post = array('P' => selialize($_POST));

 // => transfert cURL avec $post en POSTFIELD

// reception :

echo unserialize($_POST['P']) ;

Ben le problème c'est que unserialize interprete les éléments du contenu de la variable {, et autres : comme des éléments créés par la fonction serialize() .. et donc, ma variable n'a plus rien à voir avec l'origine ...
T'es sûr que le coupable est unserialize(), et pas le fait que tu aies entouré la chaîne de guillemets doubles dans ton test ?

Posté : 07 avr. 2009, 17:12
par Nours312
T'es sûr que le coupable est unserialize(), et pas le fait que tu aies entouré la chaîne de guillemets doubles dans ton test ?
ben en fait, ma variable est beaucoup plus somplexe que ça, et j'ai fait mes testes directement avec ...

bon, c'est résolu, juste un Point : quel serait la plus performante des fonction d'encodage entre uuencode() et base64_encode() ... ?

solution mise en place :

function enc($a){
	$b = array();
	foreach ($a as $k => $v){
		$b[$k] = (!is_array($v)) ? base64_encode($v) : enc($v);
	}
	return $b;
}
function dec($a){
	$b = array();
	foreach ($a as $k => $v){
		$b[$k] = (!is_array($v)) ? base64_decode($v) : dec($v);
	}
	return $b;
}

$post = array('P' => str_replace('=', 'E-G-A-L', serialize(enc(array('post'=>$_POST, 'session'=>$_SESSION)))));
 // oui le '=' posais problème ...
/* connexion curl avec $post en parametre ... */

// réception :
BackVars(dec(unserialize(str_replace('E-G-A-L', '=', stripslashes($_POST['P'])))));

//la fonction BackVars à en charge d'implémenter $_POST et $_SESSION sur le nouveaux serveur ....


cette ensemble fonctionne bien, tous les tests sont satisfaisant, mais au cas OU, y aurais-t-il mieux .. ?

Merci @ tous ;)

Posté : 07 avr. 2009, 17:54
par Sékiltoyai
Pour le égal il y avait aussi urlencode()…

Posté : 07 avr. 2009, 18:03
par Nours312
vi ...

J'hésitais entre les trois ...

convert_uuencode(), base64_encode() et url_encode()

j'ai pas trop cerné les différences entre chacun, si ce n'est qu'initialement url_encode est destiné aus url, et convert_uuencode(), est plus lourd que le dernier ....

J'ai ainsi betement opter pour base64_encode ... confronté au pb du '=', j'ai pas cherché plus loin, je l'ai remplacé .... mais je reconnais que c'est pas top !!

que pourrais-tu me conseiller ... ?

Posté : 07 avr. 2009, 18:17
par Sékiltoyai
Non, c'est juste que vu que tu le passes par curl, tu dois rajouter urlencode() après la serialisation pour échapper les données…

Posté : 07 avr. 2009, 18:58
par Nours312
ah ... ça fonctionne sans ... je te remercie ! et vérifierais les bugs ...

mais je passe mes données en POST, pas en GET ... !?

Merci ;)

Posté : 07 avr. 2009, 19:30
par Sékiltoyai
ah ... ça fonctionne sans ... je te remercie ! et vérifierais les bugs ...
Tu ne préfères vraiment pas coder proprement ? …
mais je passe mes données en POST, pas en GET ... !?
Aucune différence en principe…

Posté : 07 avr. 2009, 19:54
par Nours312
Tu ne préfères vraiment pas coder proprement ? …
Ho que si !! Merci ;) ... c'est que là, je suis sur une classe qui m'arrache la tête ! ... et ayant résolu ceci, j'espérais pouvoir le laisser ainsi .... Merci de me remettre dans le droit chemin !!

@+

Posté : 07 avr. 2009, 20:00
par Sékiltoyai
Bah je te remets pas dans le droit chemin, c'est à toi de voir, mais urlencode() est fait justement pour régler ce problème…