Wednesday, August 5, 2009

strtok in PHP - a common mistake

strtok, that splits a string into tokens is a very useful function for the programmers. Here is an example code that shows the use of strtok function to extract integers from a comma separated string.

$list = "1,2,4,10,8,0,20,30,9";

$token = strtok($list, ",");
while($token)
{
print $token."\n";
$token = strtok(",");
}
?>

Using the code we get this output:

1
2
4
10
8

Where are the other four integers? Actually when the value of $token is zero (0) - the sixth integer in the list, while ($token) evaluates to False and the loop is broken there. Lets use while($token != FALSE) instead.

$token = strtok($list, ",");
while($token != FALSE)
{
print $token."\n";
$token = strtok(",");
}

Still the same output. Oh, the mistake is we used the '!=' operator which tests the equality between $token and FALSE. Here zero (0) is equal to FALSE. A stupid way to avoid the problem is to calculate the length - while(strlen($token)) and it will work definitely! as the length of the string '0' is 1. But best solution (to me) is to use the '!==' operator which means not identical. So the following code works fine:

$list = "1,2,4,10,8,0,20,30,9";

$token = strtok($list, ",");
while($token !== FALSE)
{
print $token."\n";
$token = strtok(",");
}
?>

Output:

1
2
4
10
8
0
20
30
9

It's always useful to know details about operators in PHP.

Wednesday, May 13, 2009

Trouble with Facebook Client API

I have working on facebook application development (it's a game named Fighter Jets), and facing some weired problem. I have decided to share my experience here.

Today I tried the post link feature of the facebook API. First I tried the following code:
$facebook->api_client->links_post($user_id, 'http://khaaan.com/','Best. Website. Ever.');
I got it from their API documentation.

I got error using it. It says that 'The url you supplied is invalid'. May be it's invalid. Then I changed the URL to http://www.google.com, which is valid definitely! Still getting the same problem!! WTF!

Then I searched their forum and found that I am not the only victim, some people already faced this problem and one of them solved the problem in the following way:
$facebook->api_client->links_post('http://khaaan.com/','Best. Website. Ever.', $user_id);

Which works! Needed to use the user id as the third parameter, but from the example in the API documentation we see that it's the first parameter.

I really don't understand why the documentation is wrong.