Accessing Incoming PUT Data from PHP

Recently I started writing a REST service. I began in the usual way, writing a php script, calling it with a GET request, accessing the variables using the PHP superglobal variable $_GET. I wrote code to handle a POST request and used the variables I found in $_POST. Then I tried to write a PUT request.

PHP doesn’t have a built-in way to do this, and at first I was a little confused as to how I could reach this information. It turns out that this can be read from the incoming stream to PHP, php://input.

file_get_contents("php://input");

The above line provided me with a query string similar to what you might see on the URL with a GET request. key/value pairs separated by question marks. I was rescued from attempting to parse this monster with a regex by someone pointing out to me that parse_str() is intended for this purpose (seriously, I write a lot of PHP, I don’t know how I miss these things but its always fun when I do “discover” them) – it takes a query string and parses out the variables. Look out for a major health warning on str_parse() – by default it will create all the variables all over your local scope!! Pass in the second parameter though and it will put them in there as an associatvive array instead – I’d strongly recommend this approach and I’ve used it here with my $post_vars variable.

parse_str(file_get_contents("php://input"),$post_vars);

This loads the variable $post_vars with the associative array of variables just like you’d expect to see from a GET request.

Simple Example

Its a bit of a contrived example but it shows use of the REQUEST_METHOD setting from the $_SERVER variable to figure out when we need to grab the post vars. Firstly, here’s the script:

if($_SERVER['REQUEST_METHOD'] == 'GET') {
    echo "this is a get request\n";
    echo $_GET['fruit']." is the fruit\n";
    echo "I want ".$_GET['quantity']." of them\n\n";
} elseif($_SERVER['REQUEST_METHOD'] == 'PUT') {
    echo "this is a put request\n";
    parse_str(file_get_contents("php://input"),$post_vars);
    echo $post_vars['fruit']." is the fruit\n";
    echo "I want ".$post_vars['quantity']." of them\n\n";
}

And here’s what happened when I request the same script using two different HTTP verbs. I’m using cURL to show the example simply because I think it shows it best.

Via GET:

curl "http://localhost/rest_fruit.php?quantity=2&fruit=plum"
this is a get request
plum is the fruit
I want 2 of them

Via PUT:

curl -X PUT http://localhost/rest_fruit.php -d fruit=orange -d quantity=4
this is a put request
orange is the fruit
I want 4 of them

Purists will tell me that I shouldn’t be returning data from a PUT request, and they’d be right! But this does show how to access the incoming variables and detect which verb was being used. If you’re going to write a REST service then the correct naming of resources and the correct response to each resource being accessed in various ways is really important, but its a story I’ll save for another day. If you use this, or perhaps you access the variables another way, then do post a comment – there aren’t a lot of resources available on this topic for PHP.

Flickr Plugin Weirdness

I am an increasingly avid flickr user and have a growing collection of photos on my flickr account. It seems daft to upload photos twice all the time so I tried the flickr plugin for serendipity (my bloggling platform) but I couldn’t get my account to connect correctly. In the box labelled “flickr username” I added my flickr username, “lornajane”, which appears in my photos URL. However the plugin seemed to think my photos should then be at a URL:

http://www.flickr.com/photos/64718621@N00/

which they obviously weren’t. I played around with this for a while, also trying my yahoo user id and getting nowhere.

Eventually I tried another flickr plugin on another site and got identical behaviour – at which point I logged a support ticket with Flickr to ask what I was doing wrong. It turns out that “username” in this case means this label here:

Never noticed that before, and its certainly not how I refer to myself, so I’m a bit confused – but hey my plugin is working! I hope this helps someone (probably me, next time I try to plug flickr in to something else) confused by flickr seeming to think you have the wrong username!

Ibuildings Seminar, Leeds

My employers, Ibuildings, have been running a series of seminars where we invite a few people (and it is a few, they are generally small events), bring some of our developers along, and have some technical tutorials, demonstrations and general discussions, and some food. The previous events have all been well-received and sound very civilised (and there’s food, which is always good!)

I’m happy to announce that Ibuildings is venturing north of the Watford Gap – and the next event will be in Leeds, on the 9th September, the full details are at http://www.ibuildings.com/events/leeds. The main tutorial session will cover source control with Subversion, including advanced concepts such as merging and repository structures. We’ll also look at deployment strategies for different types of software development processes and tools that can be helpful in this area. I’m delivering the main tutorial at this event, and if that wasn’t enough incentive, I’m also bringing the nabaztag as my glamourous assistant!

We’ll be running events in a lot of other areas of the UK as well, so if you can’t make this one then watch out for more announcements or tell us where we should be running the next one! If you have any queries about any of these events then feel free to contact me, I hope I’ll see some of you in Leeds in September.

Announcing the Leeds Girl Geek Dinner

Once upon a time there was a girl geek called Sarah Blow, and she wanted to hang out with her girl friends and geek out at the same time (and who wouldn’t?). So she founded the phenomenon of the Girl Geek Dinner in London. Well this great idea has spread and spread around the world and eventually to the North of England – first to Manchester (next event, this Friday 25th July!) and eventually to Leeds.

So I’m pleased to announce that, on Wednesday 13th August there will be the first Leeds Girl Geek Dinner!! Tickets are £10 and if you needed any further encouragement, I’m one of the speakers for the evening. If you’re going, or have any questions, leave a comment below – and I’ll see you there!

LugRadioLive Wolverhampton 2008

Yesterday I had an outing to the LUGRadio Live event in Wolverhampton. To be honest this isn’t my usual kind of crowd but it was local, the talks looked interesting and so off I went.

Well it was a very interesting day – the highlight was of course meeting Emma from emmajane.net – I enjoyed her talk and also her company for both lunch and dinner. Predictably there was an excellent crowd and I had a wonderful time – a few people were there from WYLUG and I had a really good chat with Robert Collins from Canonical, nominally about bzr but in reality we also put the world to rights which was illuminating and good fun. Here’s me and Emma having dinner:

I met a few IRC friends too, some I knew before, some I was hoping to run into and one who stopped me (in my phpwomen shirt) and went “oh, you’re the UK girl from phpwomen …. lornajane!!” which was very cool :) I was also impressed by the “low tech wiki” and “low tech open streetmap” … large pieces of paper and pens.

I also met Dave and Kat from Pale Purple and had a good long chat with them so all in all it was well worth the trip (there are a few more photos in the flickr set if you’re interested). Well done to the organisers for a great event!!

LugRadio Live UK

I’m attending LUGRadio Live UK this weekend, in sunny Wolverhampton! I’m slightly concerned that this might be too geeky for me and I might be scared but there are people I’d like to meet, the talks look interesting, and I can imagine it will be a pretty good crowd. If you are there, please come and say hi to me – I’m very easy to spot because I am tall and female with curly hair, usually a rare combination at any technical gathering :)

Circuitboard Cake

There’s a birthday in my household this week so I have been making a surprise cake, which I do every year. Apart from the year where all our stuff was in storage and I only had fairy cake tins, where I made surprise fairy cakes instead! This year I went slightly overboard and created a circuitboard cake! In fact it was an astable multivibrator circuit, in case you’re interested – see http://www.play-hookey.com/digital/experiments/rtl_astable.html.

First I made the cake, and dyed a whole load of white roll-out icing green. I also dyed myself green which you would think would give away my secret mission but happily he is less observant than I feared. Then I iced the cake – this was my first mistake because I forgot to put something over the cake to make the roll-out icing stick! Usually either watered-down icing or jam is good.

sponge cake iced sponge cake

I had a whole stack of packets of sweets to use to create the components from. I needed transistors (round liquorice with a flat bit sliced out of them), LEDs (jelly dolly mixtures), capacitors (round dolly mixtures), and resistors. The resistors were easily as complicated as the whole of the rest of the components put together and next time I will just buy as many colours of write-on icing as I need to do the stripes! In the event I made the stripes out of various things wrapped round marshmallows, including red laces, the offcuts of the green icing, bits of liquorice chopped really small, and (for the orange and brown) coloured bits of dolly mixture, separated from the white bits of sweet, mashed together, rolled out, and then cut into strips.

raw materials edible components

So, here’s the finished article (and a closeup of a couple of the components)

completed cake

edible component closeup

Ever Feel Like You’re Being Followed?

I’ve been using twitter for quite a while now, around a year. And so far, its not going brilliantly.

The problem really is that I don’t “get” twitter. I am not online 24/7 so I often only look at my feeds once per day. The conversation in twitter moves faster than that so I rarely reply because usually I’ve missed the moment. Friends in various timezones also don’t help that situation. I haven’t really worked out what to do with twitter … I linked my facebook status to it so that updating one would cause the other to update, thinking I might eventually understand what it was all about.

The only thing that’s really changed since I started using it is the number of followers I have, there are more than I really expected. To put this in perspective, I follow twelve people. But seventy people follow me! Not many are complete strangers, some are colleagues, others are online friends. Some of them I would like to follow myself but they are too noisy and since I don’t keep up with updates in real time, that doesn’t really work for me. I do rather feel like I’m addressing an audience though, slightly spooky.

My twitter timeline is public – this is the point of twitter, its a mass collection of one-liners. It allows clever tools like Summize to show you all posts with given text in it, and things like that. Which is useful if people are talking about you, as I discovered when I was a conference speaker. But it does feel a bit, well, public.

The bottom line is, I’m fed up with twitter, I don’t know what to do with it and having more audience is actually making me post less (a bit like being syndicated on the php-planet feed really!) and its so unreliable that half the time when I remember to update, I can’t. There’s lots of talk of moving to a rival but nobody seems prepared to make the jump. I am completely prepared but I can’t find anything to jump to! I looked at Plurk but I have accessibility needs and it doesn’t come close to being usable for me. At the moment I think my favourite is FriendFeed – which has the added advantage of being configurable to be private other than to people I approve. It also syndicates people’s blogs, flickr accounts, and all sorts of other things, including twitter – so if we all moved to friendfeed then everyone can choose their own twitter replacement, or change it every month, and nobody needs to know because each user manages what goes into their feed that other people see.

I’m not sure if I’m moving away from twitter, stopping using it entirely, or what. Suggestions/comments/experiences are all very welcome!

Home-Sewn Cushions

I have a little sewing machine and a newly-decorated living room. So what could be more obvious than making new cushions for my sofa? I’m planning a whole set but here are the first two:

Two new cushions

The one on the left is my personal favourite, it is felt flowers just cut out and then stitched onto the cushion with embroidery floss and running stitch. The other is the first one I did, with lovely turquoise beads sewn on and then stitching around them. Here are a couple of close-ups:

bead cushion close up flower cushion close up

The first cushion has an interesting overlap on its back, where my spatial awareness failed me when trying to sew layered overlapping things together inside out. The second time, I pinned the first seam while the cushion was the right way out, so I could be sure which way it would end up!

Mysql Error

I was running an import script today taken from a mysqldump from another user, when I saw an error that looked like this:

ERROR 1005 (HY000) at line 123: Cant create table  (errno: 150)

This is caused by a mysqldump or export process exporting tables in alphabetical order and not in the order in which they rely on one another. My tables had foreign keys which fail on import if the other table doesn’t exist when you create the table with the key. In this case I was only importing six or eight tables so I simply opened the script in a text editor and re-ordered the import blocks. On a bigger scale a more technical solution might be required!