PHP::HTTPBuildQuery - Data structures become form-encoded query strings


PHP-HTTPBuildQuery documentation Contained in the PHP-HTTPBuildQuery distribution.

Index


Code Index:

NAME

Top

PHP::HTTPBuildQuery - Data structures become form-encoded query strings

SYNOPSIS

Top

    use PHP::HTTPBuildQuery qw(http_build_query);

    my $query = http_build_query( { foo => { 
                                      bar   => "baz", 
                                      quick => { "quack" => "schmack" },
                                    },
                                  },
                                );

    # Query: "foo%5Bbar%5D=baz&foo%5Bquick%5D%5Bquack%5D=schmack"

    # URL decoded: "foo[bar]=baz", "foo[quick][quack]=schmack"

DESCRIPTION

Top

PHP::HTTPBuildQuery implements PHP's http_build_query function in Perl. It is used to form-encode Perl data structures in URLs, so that PHP can read them on the receiving end.

http_build_query accepts one mandatory and two optional parameters:

     http_build_query( $data, $prefix, $separator );

where

EXAMPLES

Top

Array

    $query = http_build_query( ['foo', 'bar'] );

    # Query: "name_0=foo&name_1=bar"

Hash with Array

    $query = http_build_query( { foo => [ 'bar', 'baz' ] } );

    # Query: "foo[0]=bar&foo[1]=baz" (not escaped for readability)

GOTCHAS

Top

CHANGES

Top

    0.03  2008/10/14
        (ms) Added copyright notice

    0.02  2008/10/03
        (ms) Changed API to be more PHP-like after consulting with 
             Sara Golemon.
        (ms) Added arrays

    0.01  2008/10/03
        (ms) Where it all began.

THANKS

Top

Thanks to the following Yahoos who provided advice, ideas and code: Sara Golemon, Rasmus Lerdorf, Evan Miller.

COPYRIGHT & LICENSE

Top

AUTHOR

Top

2008, Mike Schilli <cpan@perlmeister.com>


PHP-HTTPBuildQuery documentation Contained in the PHP-HTTPBuildQuery distribution.

# Copyright (c) 2008 Yahoo! Inc.  All rights reserved.  The
# copyrights to the contents of this file are licensed under the Perl
# Artistic License (ver. 15 Aug 1997)

###########################################
package PHP::HTTPBuildQuery;
###########################################
use strict;
use warnings;
use URI::Escape;

require Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(http_build_query);

our $VERSION = "0.03";

###########################################
sub http_build_query {
###########################################
    my($data, $prefix, $separator) = @_;

    $separator = '&' unless defined $separator;

    return serialize($data, $prefix, $separator);
}

###########################################
sub serialize {
###########################################
    my($data, $prefix, $separator, $sofar) = @_;

    if( ref($data) eq "HASH" ) {
        return hash_serialize($data, $prefix, $separator, $sofar);
    } elsif( ref($data) eq "ARRAY" ) {
        return array_serialize($data, $prefix, $separator, $sofar);
    } elsif( ref($data) eq "" ) {
        return scalar_serialize($data, $prefix, $separator, $sofar);
    } else {
        die "Data type ", ref($data), " not (yet) implemented.";
    }
}

###########################################
sub hash_serialize {
###########################################
    my($data, $prefix, $separator, $sofar) = @_;

    my $result = "";

    for my $key (keys %$data) {

        my $newsofar = 
            defined $sofar ? 
              ($sofar . "%5B" . uri_escape($key) . "%5D") :
              uri_escape($key);

        $result .= $separator if length $result;
        $result .= serialize( 
                     $data->{$key},
                     $prefix,
                     $separator,
                     $newsofar,
                   );
    }
    return $result;
}

###########################################
sub array_serialize {
###########################################
    my($data, $prefix, $separator, $sofar) = @_;

    my $result = "";
    my $idx    = 0;

    for my $element (@$data) {

        my $newsofar = 
            defined $sofar                    ? 
              ($sofar . "%5B" . $idx . "%5D") :
              defined $prefix     ? 
                ("$prefix" . "_" . $idx) :
                $idx;

        $result .= $separator if length $result;
        $result .= serialize( 
                     $element,
                     $prefix,
                     $separator,
                     $newsofar,
                   );
        $idx++;
    }
    return $result;
}

###########################################
sub scalar_serialize {
###########################################
    my($data, $prefix, $separator, $sofar) = @_;

    return "$sofar=" . uri_escape($data);
}

1;

__END__