serialize/unserialize und locales

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • serialize/unserialize und locales

    Hallo,

    Ich bin gerade über einen PHP-Fehler gestossen, der mich fast an den Rande des wahnsinns gebracht hat. Folgender Code funzt net (mit generierten DE-Locales!)

    PHP-Code:
    <?php

    setlocale 
    (LC_ALL,"de_DE");

    $fl1=(float)5000000000// 5Mrd
    $str=serialize ($fl1);
    $fl2=unserialize($str);

    var_dump ($fl1);
    var_dump ($fl2);

    ?>
    , weil PHP die länder-zahlenformatierung beim serialize nicht beachtet, beim unserialize schon. In folge dessen führt meine schöne session.set_save_handler-routine, die die PHP-$_SESSION-Variablen in eine Datenbank abgelegt hat, zu Datenverfälschungen. (aus den 5mrd wird eine 5) *koch*

    Ich hab in der PHP-doku nachgelesen und verstehe auch, das es beim serialisieren von floats auch mal dazu kommen kann, das aus einer 3,14 schonmal eine 3,1400000000012 werden kann...habe kein prob damit. Aber bei sowas geht mir echt der Hut hoch.

    Setzt man auf setlocale (LC_ALL,"C") funktioniert das einwandfrei.

    Kennt jemand einen guten Work-around für dieses Problem? Mir wiederstrebt es, bei jedem Session-Datenbanktzugriff die locales auf 'C' zu setzen.... für den moment funktioniert das zwar, finde ich haber höhst unsauber und dahingefrickelt....

  • #2
    Re: serialize/unserialize und locales

    irgendwie kann ich das problem nicht nachvollziehen ...

    var_dump gibt mir in beiden fällen float(5.0E+9) aus, und mit echo ausgegeben ergeben sowohl $fl1 also auch $fl2 wieder 5000000000.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Re: Re: serialize/unserialize und locales

      Original geschrieben von wahsaga
      [B]irgendwie kann ich das problem nicht nachvollziehen ...
      Offensichtlich hast du keine de-locales generiert.

      Wenn bei dir
      PHP-Code:
      echo "test:".(float)3.14152
      Folgendes anzeigt:
      test:3.14152
      (. statt ,) sind bei dir die de_DE-Locales nicht generiert.

      Damit die de-locales funktionieren, müssen die de-Locales generiert sein. (Debian: dpkg-reconfigure locales)

      Kommentar


      • #4
        Re: Re: Re: serialize/unserialize und locales

        Original geschrieben von Monarch
        Offensichtlich hast du keine de-locales generiert.
        doch, sind vorhanden.

        und ich hab natürlich schon vorher bei deinem beispielscript ein echo vor das setlocale() gemacht, um zu überprüfen, ob's auch funktioniert hat.
        ja, hat es - de_DE wird ausgegeben.

        und
        PHP-Code:
        echo "test:".(float)3.14152
        gibt bei mir
        Code:
        test:3,141525000000000
        aus.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          Re: Re: Re: Re: serialize/unserialize und locales

          Original geschrieben von wahsaga
          doch, sind vorhanden.
          PHP-Code:
          echo "test:".(float)3.14152
          gibt bei mir
          Code:
          test:3,141525000000000
          aus.
          Hrmm, das ist interessant...mit welcher PHP-Version arbeitest du?

          phpinfo() spuckt bei mir 4.3.10 aus, was halbwegs aktuell sein sollte. Die 5'er Version kann ich aus kompatibilitätsgründen nicht einsetzen.

          Kommentar


          • #6
            Re: Re: Re: Re: Re: serialize/unserialize und locales

            hab's unter 4.3.8 getestet.
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar

            Lädt...
            X