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 :D 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

25 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 ^^

  25. clash royale triche

    Good way of explaining, and good piece of writing to
    get facts concerning my presentation subject matter,
    which i am going to convey in university.

Laissez un commentaire :