PHP  
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | my php.net 
search for in the  
<w32api_set_call_methodwddx_add_vars>
view the version of this page
Last updated: Thu, 21 Aug 2003

CVIII. WDDX Functions

Introduction

These functions are intended for work with WDDX.

Requirements

In order to use WDDX, you will need to install the expat library (which comes with Apache 1.3.7 or higher).

Installation

After installing expat compile PHP with --enable-wddx.

The windows version of PHP has built in support for this extension. You do not need to load any additional extension in order to use these functions.

Runtime Configuration

This extension has no configuration directives defined in php.ini.

Resource Types

This extension has no resource types defined.

Predefined Constants

This extension has no constants defined.

Examples

All the functions that serialize variables use the first element of an array to determine whether the array is to be serialized into an array or structure. If the first element has string key, then it is serialized into a structure, otherwise, into an array.

Example 1. Serializing a single value with WDDX

<?php
print wddx_serialize_value("PHP to WDDX packet example", "PHP packet");
?>

This example will produce:

<wddxPacket version='1.0'><header comment='PHP packet'/><data>
<string>PHP to WDDX packet example</string></data></wddxPacket>

Example 2. Using incremental packets with WDDX

<?php
$pi = 3.1415926;
$packet_id = wddx_packet_start("PHP");
wddx_add_vars($packet_id, "pi");

/* Suppose $cities came from database */
$cities = array("Austin", "Novato", "Seattle");
wddx_add_vars($packet_id, "cities");

$packet = wddx_packet_end($packet_id);
print $packet;
?>

This example will produce:

<wddxPacket version='1.0'><header comment='PHP'/><data><struct>
<var name='pi'><number>3.1415926</number></var><var name='cities'>
<array length='3'><string>Austin</string><string>Novato</string>
<string>Seattle</string></array></var></struct></data></wddxPacket>

Note: If you want to serialize non-ASCII characters you have to set the appropriate locale before doing so (see setlocale()).

Table of Contents
wddx_add_vars --  Add variables to a WDDX packet with the specified ID
wddx_deserialize -- Deserializes a WDDX packet
wddx_packet_end -- Ends a WDDX packet with the specified ID
wddx_packet_start --  Starts a new WDDX packet with structure inside it
wddx_serialize_value -- Serialize a single value into a WDDX packet
wddx_serialize_vars -- Serialize variables into a WDDX packet


add a note add a note User Contributed Notes
WDDX Functions
pierre dot jeunejean at adnexus dot be
26-Sep-2003 07:11
This is, to me, a nice way to solve the date problem.
In this example, we use a custom Date Object to store a date.
We show the serialized value in a textarea. We unserialize the packet and then we loop trough the returned array to get each element value and the data type of each of those values.

Here is the code, and after it its ouptut:

<?PHP
class Date {
    var 
$date null;
   
    function 
Date ($date) {
       
$this->date $date;
    }
}

$textValue "Per idem tempus annorum.";
$numberValue 23;
$booleanValue true;
$null null;
$dateValue = new Date('22/03/2003');

$packet_id wddx_packet_start();

wddx_add_vars($packet_id"dateValue");
wddx_add_vars($packet_id"textValue");
wddx_add_vars($packet_id"numberValue");
wddx_add_vars($packet_id"booleanValue");
wddx_add_vars($packet_id"null");

$wddxSerializeValue wddx_packet_end($packet_id);

echo(
"<FORM><TEXTAREA rows=15 cols=80>" .
       
$wddxSerializeValue .
   
"</TEXTAREA></FORM>");
   
$wddxDeserialize wddx_deserialize($wddxSerializeValue);

foreach (
$wddxDeserialize as $key => $value) {
    if(
is_object($value)) { //checks if the value is an object
       
$valueType get_class($value); //gets the NAME of the class, so the type of the current value
       
$value $value->date//gets the value of the date property of the current Date Object
   
} else {
       
$valueType gettype($value);
    }
    echo(
"Value = " $value "&nbsp;&nbsp;&nbsp;(Value type = " $valueType ")<br>");
}
?>

<wddxPacket version='1.0'>
<header/>
<data><struct>
<var name='dateValue'><struct>
<var name='php_class_name'><string>date</string></var>
<var name='date'><string>22/03/2003</string></var>
</struct></var>
<var name='textValue'><string>Per idem tempus annorum.</string></var>
<var name='numberValue'><number>23</number></var>
<var name='booleanValue'><boolean value='true'/></var>
<var name='null'><null/></var>
</struct></data>
</wddxPacket>

Value = 22/03/2003   (Value type = date)
Value = Per idem tempus annorum.   (Value type = string)
Value = 23   (Value type = integer)
Value = 1   (Value type = boolean)
Value =    (Value type = NULL)
12-Sep-2003 09:29
wddx isn't 100% perl compatible .. I have an wddx file infront of me and it only works with php so better don't use it
pointsystems.com, sbarnum
04-Sep-2002 12:11
bradburn at kiwi dot de
30-Jul-2002 09:02
With ref to the above comment about typing, I have found that -- oddly enough -- PHP's WDDX supports the following WDDX types: null, boolean (true/false), number and string, *but* not date-time.

as an example, use the following values in an array that you then serialize:

$number = 5,
$null = NULL,
$bool = true,
$string = 'this is a string'.

they will all serialize correctly, e.g. the third entry comes out as:

<var name='bool'><boolean value='true'/></var>

i have tried with the 'official' format for WDDX 'datetime', e.g. '1998-9-15T09:05:32+4:0' (from the DTD @ http://www.openwddx.org/downloads/dtd/wddx_dtd_10.txt)  but have only succeeded in getting this encoded as a 'string' type.

if anyone else has any more information on this, it would be welcome. i would like to store the variables in 'appropriate' fields in a database, and the fact that only datetime is not supported is slightly irritating -- otherwise it would be a very useful function.
philip at thepr()jects dot ()rg
17-Nov-2000 05:32
Tutorial here :

XML and PHP. Part 1: Using the WDDX functions
http://www.phpbuilder.net/columns/jesus20000402.php3
djm at web dot us dot uu dot net
02-Mar-2000 07:50
Here's a rewrite of the deserializing Perl code that uses variable names consistently with the serializing example.  Sorry for any confusion....
<PRE>
#!/usr/bin/perl

use WDDX;

open(FP, "<cities.wddx");
undef $/;                       # Slurp the whole file.
$packet = <FP>;
close(FP);

$wddx = new WDDX;
$packet_id = $wddx->deserialize($packet);
$value = $packet_id->as_hashref();

print "pi is:<br>" . $value->{"pi"} . "<p>\n";
print "cities is:<br>\n";
$key = 0;
foreach $val (@{$value->{"cities"}}) {
    print "$key => $val<br>\n";
    $key++;
}
</PRE>
djm at web dot us dot uu dot net
02-Mar-2000 07:36
I think it would be helpful for passing data between languages to show a direct translation of the above examples into Perl, using WDDX.pm 1.00 from CPAN.  It took me awhile to figure out.  To serialize:
<PRE>
#!/usr/bin/perl

use WDDX;

$wddx = new WDDX;
$packet_id = $wddx->struct({});

$pi = 3.1415926;
$packet_id->set("pi" => $wddx->number($pi));

# Suppose @cities came from database
@cities = ("Austin", "Novato", "Seattle");
$packet_id->set("cities" => $wddx->array([map $wddx->string($_), @cities]));

$packet = $wddx->serialize($packet_id);

open(FP, ">cities.wddx");
print FP $packet;
close(FP);
</PRE>
<P>
To deserialize:
<PRE>
#!/usr/bin/perl

use WDDX;

open(FP, "<cities.wddx");
undef $/;                       # Slurp the whole file.
$packet = <FP>;
close(FP);

$packet_id = new WDDX;
$wddx_obj = $packet_id->deserialize($packet);
$value = $wddx_obj->as_hashref();

print "pi is:<br>" . $value->{"pi"} . "<p>\n";
print "cities is:<br>\n";
$key = 0;
foreach $val (@{$value->{"cities"}}) {
    print "$key => $val<br>\n";
    $key++;
}
</PRE>
djm at web dot us dot uu dot net
20-Oct-1999 03:30
The PHP WDDX module encodes all scalars as strings in the XML packet, due to PHP's loose typing.  The current Perl WDDX module takes a different approach, requiring the caller to mark each variable with a type.  This is helpful if the reader of the packet is a more strongly typed language that distinguishes between string, int, float, and bool; but it's more cumbersome to use than the PHP approach.  The Perl module is hard to find right now; its home page is:
<br>
<a href="http://www.scripted.com/wddx/">http://www.scripted.com/wddx/</a>
djm at web dot us dot uu dot net
19-Oct-1999 10:45
Since there aren't any examples of reversing the process, here's one. If you had the packet produced by the above example (without the htmlentities() call), you could retrieve the values like this:

<pre>
$value = wddx_deserialize($packet);
print "pi is:<br>" . $value["pi"] . "<p>\n";
print "cities is:<br>\n";
while (list($key, $val) = each($value["cities"])) {
    print "$key => $val<br>\n";
}
</pre>

which outputs:

<pre>
pi is:
3.1415926

cities is:
0 => Austin
1 => Novato
2 => Seattle
</pre>
yzhang at sfu dot ca
26-May-1999 02:29
To make these examples work, you'll probably want to format the output with a call to htmlentities:

<pre>
$pi = 3.1415926;
$packet_id = wddx_packet_start("PHP");
wddx_add_vars($packet_id, "pi");

/* Suppose $cities came from database */
$cities = array("Austin", "Novato", "Seattle");
wddx_add_vars($packet_id, "cities");

$packet = wddx_packet_end($packet_id);
print htmlentities($packet);
</pre>

<w32api_set_call_methodwddx_add_vars>
 Last updated: Thu, 21 Aug 2003
show source | credits | sitemap | mirror sites 
Copyright © 2001-2003 The PHP Group
All rights reserved.
This mirror generously provided by: http://php.mirrors.ilisys.com.au/
Last updated: Sat 01 Nov 2003 04:13:36 EST EST