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 :