javascript function serialize compatible PHP

Posté le samedi 5 ao√Ľt 2006 à 1 h 34, Read it in english with Google

Un jour comme hier j’en ai eu marre de pas pouvoir passer mes variables PHP √† javascript correctement. Et je me suis di ¬ę¬†mais il y a la fonction serialize en PHP¬†¬Ľ alors j’ai rouill√© sur le net une petite heure pour √©ssayer de trouver un script qui permette de d√©serializer (unserialise) en javascript…

Je me suis rendu conte qu’il avait tous besoin d’une class en javascript… Alors moi et mon √©go surdimensionn√© nous d√©pla√ß√Ęmes tout ces scripts mal it√©r√©s dans la corbeille et ouvr√ģmes une page blanche, d√©cid√© √† √©crire une fonction et non une classe.

voila le r√©sultat ūüėÄ Demo serialize javascript

Dernière version : xorax-serialize-1.2
mise à jour du support pour la deserialization des objets php


historique :
xorax-serialize-1.1 correction de bug mineur sur les boolean.
xorax-serialize

24 réponses à “javascript function serialize compatible PHP”

  1. billyboylindien

    Paff vla qu’il se met a js ūüėČ

    Ca va fR mal

  2. Nicolas de Bray

    Bonjour,

    J’ai un probl√®me que j’essaie de r√©soudre avec votre serializer mais √ßa coince…

    J’ai fait un convertisseur de devises qui fonctionne bien ainsi :
    1- Un script php va charger un fichier CSV sur le site web d’une banque
    2- Le même script php en fait un tableau
    3- Je r√©cup√®re les valeurs du tableau dans mon formulaire comme ceci ‘>EURO ETC…
    et je les traite avec du javascript pour les conversions de devises.

    Le problème que je rencontre est que ce script PHP est executé à chaque fois que la page web est rafraichie, ce qui rallenti beaucoup mon site.

    Comment faire pour utiliser SERIALIZER DANS CE CONTEXTE ou bien
    y-a-t’il un autre moyen de mettre un tableau PHP en arri√®re-plan pour ne pas que le script s’√©x√©cute √† chaque rafraichissement de la page.
    J’ai essay√© la fonction php INCLUDE_ONCE mais ca ne marche pas

    VOICI EN PASSANT LE SCRIPT PHP /////////////////////////////////////////////

    /////////////////////////////////////////////////////////////////////////////

    MERCI

    Nicolas de Bray

  3. Nicolas de Bray

    VOICI EN PASSANT LE SCRIPT PHP /////////////////////////////////////////////
    ?php
    function read_csv( $filename, $separateur) // transfert le fichier dans un tableau
    {
    if ( $FILE=fopen(¬ę¬†http://www.bank-banque-canada.ca/fr/marches/csv/exchange_fre.csv¬†¬Ľ, ¬ę¬†r¬†¬Ľ) ) // ouverture du fichier
    {
    while ($ARRAY[]=fgetcsv($FILE, 1024, ¬ę¬†,¬†¬Ľ)); // lire ligne par ligne et coupe colonne par colonne
    fclose($FILE) ; // ferme le fichier
    array_pop($ARRAY); // efface la derniere ligne
    return $ARRAY ; // renvoie le tableau
    }
    }
    $ARRAY=read_csv(¬ę¬†$filename¬†¬Ľ, $separateur); // lit le fichier
    ?
    /////////////////////////////////////////////////////////////////////////////

  4. XoraX

    Le seul moyen est de stocker les donn√©es du tableau php (ou du tableau javascript renvoy√©) dans un fichier enregistr√© sur votre serveur afin d’√©vit√© la connection au serveur de la banque. Cependant, il faudra surement v√©rifier p√©riodiquement que le fichier csv de la banque n’a pas chang√©…

    d’autre part, les argument $filename et $separateur ne servent pas √† grand chose ici…

    function read_csv()
    {
    $fc = 'exchange_fre.csv.cache';
    if(!file_exist($fc) || time()-filemtime($fc)>3600){ // si le fichier de cache existe et qu'il est assez recent
    if ( $FILE=fopen('http://www.bank-banque-canada.ca/fr/marches/csv/exchange_fre.csv','r') ) // ouverture du fichier
    {
    while ($ARRAY[]=fgetcsv($FILE, 1024, ',')); // lire ligne par ligne et coupe colonne par colonne
    fclose($FILE) ; // ferme le fichier
    array_pop($ARRAY); // efface la derniere ligne
    file_put_contents($fc,serialize($ARRAY));
    } // sinon erreur impossible d'ouvrir le csv
    }else{ // sinon on retourne le cache
    $ARRAY = unserialize(file_get_contents($fc));
    }
    return $ARRAY;
    }
    $ARRAY=read_csv();

    $fc sera ici le fichier dans lequel les données du tableau seront stocké.
    time()-filemtime($fc)>3600 signifie que la durée écoulé depuis la dernière modification du fichier doit être supérieur à  3600 secondes pour pour refaire une capture du csv et donc reconstruire $fc.

  5. lereps

    Parfaites petites fonctions.
    Merci XoraX.

  6. JSON contre serialize contient sur le sujet :

    […] Pour ma part je pr√©f√®re serialize(), fonction native de php, rapide, souvent dans le cache (elle est utilis√© pour stocker les sessions) et permet de renvoyer la plus grosse charge de calcul aux utilisateurs grace √† ma fonction. Tant que je n’√©ssaye pas de faire une page avec autre chose que php, tout va bien. […]

    le mercredi 22 novembre 2006 @ 1 h 13
  7. MehdiB

    Bonjour,

    J’aimerai stocker une image jpeg dans un tableau puis l’envoyer √† un service web, est-ce possible?
    Existe-t-il une fonction qui permet de convertir une image jpeg en byte[]

    Merci beaucoup

    Très cordialement

  8. XoraX

    √ßa va √™tre difficile…

    Convertir une image dans une page en byte c’est pas possible.

    Maintenant tu peux quand même aller rechercher cette image en AJAX via son url afin de la recharger, et en changeant le tyoe MIME dans ton XMLHttpRequest, tu devrait avoir ton image stocké dans une variable.
    Et tu pourra la renvoyer o√Ļ tu veux.

    Seulement je ne vois pas bien l’int√©ret ??? Si tu pouvais m’√©claircir ce serait cool.

  9. Durss

    Ah juste un petit problème..
    j’ai voulu s√©rializer un tableau (pas de prob √† ce niveau) sauf que si il contient une cha√ģne de caract√®res commen√ßant ou finissant par un espace √ßa marche pas! ūüôĀ

  10. XoraX

    humm chez moi √ßa marche…
    file moi ton code et dit moi quel navigateur tu utilise et je regarde ça tout de suite.

  11. kankrelune

    Nikel pour les tableau index√©s num√©riquement mais pour les tableaux associatifs unserialize() plante… je cherche si jamais je trouve je posterais la solution… .. .

    @ tchaOo¬į

  12. XoraX

    désolé de la réponse tardive.
    je viens de mettre √† jour les fonctions pour le support de objects mais j’ai pas vu d’erreur sur les tableaus associatifs.
    si t’as du code √† lacher… thx! ūüôā

  13. Jean

    tu peux ajouter le type ‘function’ pour javascript √©ventuellement, sinon tr√®s bon boulot

  14. marcimat

    Bonjour,

    Je viens d’utiliser votre script qui me d√©panne bien.

    Je suis tomb√© sur une erreur, je ne sais pas si c’est cela vient du script ou de ma fa√ßon de l’utiliser, mais voici la correction que j’ai apport√© pour ‘vaincre’ le probl√®me.

    Je sérialise un tableau php dans un textarea. Je lis ensuite celui-ci en javascript.
    A chaque fois qu’il y a un retour chariot, ils sont vu par php comme 2 caract√®res (\r\n) et par js comme 1 caract√®re (\n) et la fonction unserialize javascript du coup tombe en erreur car le nombre de caract√®res lus n’est pas le bon.

    J’ai mis simplement un replace lors de l’appel de la fonction : unserialise( txt.replace(/\n/g,¬†¬Ľ\r\n¬†¬Ľ) ) et je n’ai plus de probl√®me.

    Merci pour ce partage,
    MM.

  15. XoraX

    Remarque très interressante.
    C’est parce que le navigateur omet volontairement les \r dans les textarea.

    Une solution alternative serait de configurer l’√©diteur utilis√© pour cr√©er les script de tel mani√®re qu’il ins√®re des sauts de ligne \n plut√īt que des sauts de ligne √† la windows \r\n.

    Je stocke g√©n√©ralement les r√©sultats de s√©rialize php dans un input hidden je n’es donc jamais rencontr√© se probl√®me.

    Merci de l’avoir fait remarquer !

  16. Seb

    Salut,

    Un grand bravo ! Très utile !!!

    A+
    Seb

  17. Tomaa

    En voilà un garçon intelligent. Merci

  18. babwar

    ne marche pas avec utf8

  19. platanax

    Salut,

    Super pratique, merci. Par contre, petit ¬ę¬†bug¬†¬Ľ : quand la chaine en entr√©e de unserialize est vide, il ya aune erreur JS, corrig√©e par :

    if (!txt) return final;

    Apr√®s l’init des variables. Ca donne :

    function unserialize(txt){
    var level=0,arrlen=new Array(),del=0,final=new Array(),key=new Array(),save=txt;
    if (!txt) return final;
    while(1){
    ….

  20. Lo√Įc

    Bonjour,

    Déjà merci beaucoup pour ce script JS fort utile.

    J’ai par contre remarqu√© un probl√®me lors du unserialize sur un tableau serializ√© contenant des valeurs null (N).

    ¬ę¬†Error thrown at line 1, column 0 in evaluated code:
    final[¬ę¬†toto¬†¬Ľ][¬ę¬†undefined¬†¬Ľ]= ret;
    called from line 108, column 3 in unserialize¬†¬Ľ

    √áa peut arriver suite √† une r√©cup√©ration d’info dans une base de donn√©es, avec des champs null.
    J’ai pu corriger ceci en ajoutant cette simple ligne juste avant le eval(‘final’+ev+’=ret’) ligne 108 :

    if(ret==null){ret=¬†¬Ľ;}

    Je ne sais pas si c’est le plus judicieux √† faire, mais √ßa me semble fonctionn√©. Si √ßa peut en aider certains.

    Lo√Įc

  21. Koren

    Merci pour le script !

  22. Shanti Mcdougald

    I‚Äôd like to visit your weblog extra often however recently it appears to be taking eternally to come up. I go to from work, and our connection there’s fairly good. Do you assume the problem could be in your end?

  23. Nicolas

    Bonjour,
    Je tente d’utiliser ce script pour interpr√©ter en javascript un tableau php, mais pass√© en aJax. Et l√†, je me retrouve dans l’impasse.

    Ma page appelant le fichier aJax et interprétant le tableau en javascript est :
    $.ajax({
    type: ‘POST’,
    url: ‘inc.php’,
    data: { culture: num[0], echeance: num[1] },
    success: function(data) {
    var tableau = unserialize(¬†¬Ľ);
    alert(tableau);
    }
    });

    Ma page aJax qui crée et retourne le tableau php est :
    while ($varNtotal = mysql_fetch_array($varRequete)) {
    $varHistorique[] = array($varNtotal[‘timestamp’], $varNtotal[‘echeance_2’]);
    }
    echo $varHistorique;

    Mon alert(tableau) me retourne ¬ę¬†data¬†¬Ľ. Une id√©e ? Merci d’avance.

  24. Qooxdoo

    Merci Pour le script JS
    son besoin est inévitable ^^

Laissez un commentaire :