Core PHP Programming 1/E Errata

These are issues with the first edition that have come up since the book was published. Some of them have been fixed in subsequent printings.


Tyler Bannister points out that Figure 16-6 uses a timeout value of 3 hours instead of 30 minutes. Use 1800 seconds instead of 10800.

Thanks, Tyler!


Jay Lepore pointed out that the example for mysql_list_fields wasn’t working.
That’s because it needs to be used with mysql_field_name, mysql_field_len,
mysql_feild_type and mysql_field_flags. Here’s a better example:

	// connect to server 

	$Link = mysql_connect("localhost", "httpd", "");

	// get list of fields 
	$Result = mysql_list_fields("store", "customer", $Link);

	//start HTML table

	//loop over each field
	for($i = 0; $i < mysql_num_fields($Result); $i++)
		print("<TD>" . mysql_field_name($Result, $i) . "</TD>\n");
		print("<TD>" . mysql_field_type($Result, $i) . "</TD>\n");
		print("<TD>" . mysql_field_len($Result, $i) . "</TD>\n");
		print("<TD>" . mysql_field_flags($Result, $i) . "</TD>\n");


	//close HTML table

Thanks, Jay!


Matt Van Gundy pointed out that the recursion example on page 58 has a weakness
for numbers between -1 and zero that will cause it to go into an infinite loop!
That's what I get for inventing such a contrived example. The fix it to change
this link:

return(checkInteger((-1) * $Number - 1));


return(checkInteger((-1) * $Number));

Thanks, Matt!


Here are a couple of new codes for the date() function. You can get the number of seconds
on the clock with the s code. You can get the timezone with the T code. This is another
tip from Ezra Freedman.


The mysql_insert_id() function takes one optional argument, the
link identifier. The description of this function doesn't
mention this, and the example mistakenly uses the result identifier.
Here's fixed example.

	// connect to server 
	$mysql_link = mysql_connect("localhost", "httpd", "");

	// select the 'store' database 
	mysql_select_db("store", $mysql_link);

	// insert a row 
	$query = "INSERT INTO customer (name) ";
	$query .= "VALUES('Leon Atkinson') ";
	$mysql_result = mysql_query($query, $mysql_link);

	// get id 
	print("ID is " . mysql_insert_id($mysql_link));

Thanks to Ezra Freedman for letting me know.


The order of the parameters for implode() are reversed. The prototype
should read

string implode(string delimiter, array data)

Thanks to Paul Kulp for pointing this out.


The fread() function was left out of the functional reference. It works exactly
like fgets() except for one important difference. The fread() function is binary
safe. It ignores endlines when returning strings.


The example on page 35 has an error. "$Count = $Count + 1" is not the same as
"$Count += $Count". The correct example should be:

	** this assignment
	$Count = $Count + 1;
	** is the same as this assignment
	$Count += 1;

Thanks to Erico Freitas for pointing this out.


David Cooper pointed out that there's a error in the example for
mysql_field_name(). Change this line

print(mysql_field_name($index) . "<BR>\n");


print(mysql_field_name($mysql_result, $index) . "<BR>\n");

Thanks, David!


Here's a bunch of issues that Paul DuBois sent me. Wow! Check out the
detail! I've only listed the issues that pertain to content, since some
of them were about fonts or typos:

p342. MySQL isn't exactly "free" in the sense that there are conditions
under which you must license it (e.g., if you sell it or a product
that requires it).

p343. The MySQL website is now better referred to as (The MySQL manual and other related documentation
made this change recently.)

p346. Description of mysql_db_query: says that a new link will be
created if necessary. This is also true for mysql_query and
mysql_select_db, but the descriptions of the three functions don't
point this out consistently. It's also not clear what parameters
will be used to make the connection (no doubt because the PHP manual
itself is pretty murky on this point!).

p347 Example for mysql_errno. mysql_errno and mysql_error won't actually
return any useful information after a failed connect call. They require
a valid link. A better example might be, say, a mysql_query with an
illegal query followed by mysql_errno/mysql_error calls.

(You can get the error information after a failed connect call, but you
have to have track-errors turned in in php3.ini and you reference
$php_errormsg instead of the MySQL error functions. I think this is goofy,
but that's how it is.)

p350 Description of mysql_fetch_lengths is incorrect. It returns the
actual lengths of the fields in the current row of the result set, I
believe. (Just like the corresponding C API call.)

p358. mysql_insert_id is missing the argument in the function header
(should have "integer result" in the parens).


On page 71, the second instance of $tempVariable is mis-spelled. Thanks,
Nick Bouton!


On page 233, Figure 11-1 lists I instead of i. Thanks,
John Keklak!


On page 388, the call to ora_logon is missing a comma. Change

ora_logon("leon" "secret")


ora_logon("leon", "secret")

Many thanks to Ron Sprenkels for catching this error!


In Chapter 13, a dollar sign crept into the calls to mysql_select_db(). For example,

$mysql_select_db("store", $mysql_link);

should be

mysql_select_db("store", $mysql_link);

Here's a shout out to Brian Wang for pointing it out!


In Chapter 9, I failed to mention that encrypt() and decrypt()
are from the crypt extension. That means before you use them, you must load
the extension with dl() or inside php3.ini. I also noticed that
the example has a minor error: the password is too short. Here's a fixed example,
with code to load the extention:


	$message = "this is a plain text message";
	$password = "mysecretpassword";
	$data = encrypt($message, 0, $password);
	print(decrypt($data, 0, $password));

Leave a Reply

Subscribe to RSS Feed Follow me on Twitter!