Results 1 to 8 of 8

Thread: PHP serialised objecten

  1. #1
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357

    PHP serialised objecten

    Gebruiker van FPC wilde PHP arrays accessen vanuit FPC/Delphi, (gepost vanuit webapps) en dat heb ik ff uitgezocht. Het bleek redelijk eenvoudig te zijn, omdat de basis PHP types die zin hebben om via webinterfaces door te geven prima op variants mappen.

    Met behulp van de volgende code kan je geserialiseerde php arrays naar variant (vararray) serialiseren (met phpunserialize) en weer terug. (phpserialize)

    Code:
    {$ifdef FPC}{$mode delphi}{$else}{$apptype console}{$endif}
    Uses Variants,SysUtils;
    
    function phpdeserialize (const s : string):variant;
    
    var i,l:integer;
    
    
    function consumefield:variant; forward;
    
    function consumearray:variant;
    
    var j,k,fields : integer;
    
    begin
      inc(i,2);
      j:=i;
      while (j<l) and (s[j] in ['0'..'9']) do inc(j);
      fields:=strtointdef(copy(s,i,j-i),0);
      i:=j+2;
      result:=vararraycreate([0,fields-1],varvariant);
      for j:=0 to fields-1 do
        begin
          inc(i,2);
          k:=i;
          while (k<l) and (s[k] in ['0'..'9']) do
            inc(k);
          i:=k+1;
          result[j]:=consumefield;
         end;
    end;
    
    function consumestring:variant;
    
    var j,len : integer;
        s2 : string;
    begin
      inc(i,2);
      j:=i;
      while (j<l) and (s[j] in ['0'..'9']) do inc(j);
      len:=strtointdef(copy(s,i,j-i),0);
      i:=j;
      s2:=copy(s,i+2,len);
      result:=s2;
      inc(i,len+4); // +2 are the quotes, + two :
    end;
    
    function consumeinteger:variant;
    
    var j,len : integer;
    
    begin
      inc(i,2);
      j:=i;
      while (j<l) and (s[j] in ['0'..'9']) do inc(j);
      result:=strtointdef(copy(s,i,j-i),0);
      i:=j+1;
    end;
    
    function consumefield:variant;
    
    begin
      case s[i] of
         'a' : result:=consumearray;
         's' : result:=consumestring;
         'i' : result:=consumeinteger;
    //     'd' : result:=consumedouble; // t.b.d.
         'n' : begin
    	     result:=varnull;
                 inc(i,2); // ; also
    	   end;
        end;
    end;
    
    begin
      i:=1; l:=length(s);
      if i<l then  // tokens are >1
        result:=consumefield;
    end;
    
    function phpserialize(v:variant):String;
    
    function servariant(v:variant):string; forward;
    
    function servarray(v:variant):string;
    
    var i : integer;
    
    begin
      result:='a:' +inttostr(vararrayhighbound(v,1)-vararraylowbound(v,1)+1)+':{';;
      for i:=VarArrayLowBound(v,1) to vararrayhighbound(v,1) do
        result:=result+'i:'+inttostr(i)+':'+servariant(v[i])+';';
      result:=result+'}';
    end;
    
    function servariant(v:variant):string;
    
    var i : integer;
    
    begin
      result:='';
      i:=VarType(v);
      if (i and vararray)=vararray then
       i:=vararray;
      case i of
       varinteger :  result:='i:'+vartostr(v);
    	// was inttostr(vr)
       varolestr,
       varstring  :  result:='s:'+inttostr(length(v))+':"'+v+'"';
       vararray   :  result:=servarray(v);
       varnull    :  result:='N';
    //   vardouble  :   t.b.d.
       end;
    end;
    
    begin
     result:=servariant(v);
    end;
    
    procedure dotest;
    
    const phparr ='a:4:{i:0;s:5:"Tuple";i:1;s:4:"With";i:2;i:4;i:3;s:6:"Values";}';
    
    var v      : Variant;
        serobj : string;
    begin
      Writeln(phparr);
      // deserialize a serialized a PHP array to an vararray
      v:=phpdeserialize(phparr);
      serobj:=phpserialize(v);
      writeln(serobj);
    end;
    
    begin
     dotest;
    end.
    Overigens werkt de code nog niet met FPC, er zit ergens een refcounting issue. Dit zou echter ook een probleem met Kylix kunnen veroorzaken. (strings worden als olestr opgeslagen)

  2. #2
    Senior Member PsychoMark's Avatar
    Join Date
    Nov 2001
    Location
    Raamsdonksveer
    Posts
    10,269
    Handig! Misschien kan ik er nog eens gebruik van maken... heb 'm in ieder geval even verplaatst naar de Artikelen & Tips sectie

    ...misschien ter overvloed, maar de aanroepen in PHP heten "serialize" en "unserialize" (logisch ), voor degenen die er niet bekend mee zijn.
    Qui custodiet ipsos custodes

  3. #3
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    De FPC issue is inmiddels opgelost in FPC's SVN van vanmorgen (probleempje met blockcount)

    Mijn development versie heeft nu ook boolean en float support. Ik ga deze ff opschonen, en dan meld ik met terug.

  4. #4
    marcov,
    Als je tijd en zin hebt... maak dan een Artikel(tje) over PHP,
    Liefst voor beginners
    Ik heb veel interessen voor PHP!
    en ik denk dat ik niet de enigste ben.
    Misschien kun je een klein aanzetje geven met een klein Artikel,
    Ook weer een aanwinst voor NLDelphi.
    met vriendelijke groet

  5. #5
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Ik gebruik amper PHP. Dit is gemaakt juist om weer wat meer PHP te elimineren (en dus meer van de functionaliteit in de FPC CGI te stoppen)

    Op termijn willen we naar een PHP vrije website tenslotte.

  6. #6
    Senior Member screner's Avatar
    Join Date
    Jun 2005
    Location
    Oss
    Posts
    141
    Dat is zo, PHP moet uitgebannen worden en cgi van delphi moet daarvoor in de plaats komen

  7. #7
    In dat geval loop je een paar jaar achter ik denk dat inmiddels meer mensen ASP.NET verkiezen voor CGI van Delphi. Dat is veel toegankelijker dan een CGI van Delphi. Het maken van de HTML pagina met daarachter gelijk de code in de designer..

    Ik heb zelfs al van mensen(Marcel) gehoord dat hij ASP.NET veeeeelen malen lekkerder vind werken dan Delphi CGI.

  8. #8
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Als het ontwerpen van de formuliertjes + logica de beperking is, dan zeker ja.
    Wat er van ASP.NET overblijft als wat verder dan een db frontendje gaat, weet ik niet. Er is een provider systeem, maar hoe praktisch dat is.....

    Maar het fijne van FPC/Delphi CGI is dat je het eenvoudig aan je bestaande server app kan vast lassen. En dat het portable en relatief standalone is.
    (enige vereiste: een webserver die een soort "fast" cgi ondersteund)

    (later in 2009 toegevoegd)
    Overigens moet ik zeggen dat de PHP eliminatie vn een andere reden had. Simpelweg dat het team allemaal diep in Pascal zit, en maar een enkeling in PHP, en nog minder in exact de gebruikte pakketten. Het gaat er dus meer om, om het webbeheer een taak voor het hele team te maken, zonder ze te forceren een nieuwe taal te leren. De resterende PHP zijn de kant en klare pakketten.
    Last edited by marcov; 30-Jan-09 at 13:28.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •