Errata

PHP Hacks

The errata list is a list of errors and their corrections that were found after the product was released. If the error was corrected in a later version or reprint the date of the correction will be displayed in the column titled "Date Corrected".

The following errata were submitted by our customers and approved as valid errors by the author or editor.

Color key: Serious technical mistake Minor technical mistake Language or formatting error Typo Question Note Update

Version Location Description Submitted By Date submitted Date corrected
Printed
Page 2
Last paragraph

http.conf should be httpd.conf.

Anonymous    Aug 01, 2007
Printed
Page 11
Last line

"% mysql --user=root --password=passwordbtest < books.sql"
should be:
"% mysql --user=root --password=password btest < books.sql"

Anonymous    Aug 01, 2007
Printed
Page 24-25
Examples 2-5 and 2-6

All the <? should be <?php

Anonymous    Aug 01, 2007
Printed
Page 26-28
Examples 2-7 & 2-8

All the <? tags should be <?php.

Anonymous    Aug 01, 2007
Printed
Page 36
Example 2-14

bgcolor="#aaa"
should be
bgcolor="#aaaaaa"

Anonymous    Aug 01, 2007
Printed
Page 36-38
Examples 2-14 & 2-15

All the <? tags should be <?php.

Anonymous    Aug 01, 2007
Printed
Page 39
Example 2-16

The function "placegraphic" has a hardcoded argument in the function
call "getimagesize".
getimagesize (rss.png)
should be
getimagesize( $file )

Anonymous    Aug 01, 2007
Printed
Page 41
Example 2-17

--==Multipart_Boundary_<?php echo($random_hash); ?>
should be
--==Multipart_Boundary_<?php echo("$random_hash
"); ?>
, otherwise MIME structure will be broken.

Anonymous    Aug 01, 2007
Printed
Page 51
Example 3-4

The order of the <body> and <html> tags should be reversed.
Likewise with the order of the </html> and </body> tags.

Anonymous    Aug 01, 2007
Printed
Page 59
bottom 3rd of page

Second example starting with start_section("two","Report part two")
using a hidden table within <div> does not work. Text "This is a table of numbers and such:"
displays when spinner is clicked but not table of data.

This has been updated on the code in the download.

Anonymous   
Other Digital Version
61

For hack 16 it should be noted that:
The startlink function fails to increment nextid. It now reads:

function start_link( $text )
{
global $nextid;
$nextid++;

Anonymous    Jul 01, 2008
Printed
Page 61

For hack 16 it should be noted that:
The startlink function fails to increment nextid. It now reads:

function start_link( $text )
{
global $nextid;
$nextid++;

Anonymous    Aug 01, 2008
Printed
Page 62
Inside the javascript function drop(), lines 3-4

Lines 3 and 4 in the function drop():

divobj.style.top = aobj.offsetBottom+10;
divobj.style.left = aobj.offsetLeft+10;
should be:
divobj.style.top = (aobj.offsetBottom+10)+"px";
divobj.style.left = (aobj.offsetLeft+10)+"px";

Anonymous    Aug 01, 2007
Printed
Page 64
Example 3-8; the table tag has a misspelled attribute

cellspaceing="0"
should be:
cellspacing="0"

Anonymous    Aug 01, 2007
Printed
Page 72
First sentence of "Running the Hack"

"...clock.php to your server and navigate to the it..."
should be:
"...clock.php to your server and navigate to it..."

Anonymous    Aug 01, 2007
Printed
Page 85
1st paragraph

flikr
should be
flickr

Anonymous    Aug 01, 2007
Printed
Page 88
Author note about Hack 25

the PHP 5 interpreter needs to be installed with the calendar option for this hack to work, or that
if that is not done the php.net site contains code that can be used as an alternative.


Anonymous   
Printed
Page 88-92
cal.php errors

Page 90:
First occurance of cal_days_in_month() should use month with a one base.

<is>
$dimlm = cal_days_in_month(CAL_GREGORIAN,$lastmonth, $lastyear)

<should be>
$dimlm = cal_days_in_month(CAL_GREGORIAN,$lastmonth + 1, $lastyear)

Page 90:
Previous month ends a day early.
Creating days for previous month needs to subtract 1 from the day value.
<is>
$days []= new Day(0,$lastmonth+1,$dimlm - ($day -$d), $lastyear);
<should be>
$days []= new Day(0,$lastmonth+1,$dimlm - ($day - $d) - 1, $lastyear);

Page 91:
Testing if month/year are set in URL should use isset($_GET[..]) instead of
if($_GET[...]) otherwise January never shows up in the calendar.

Anonymous    Aug 01, 2007
Printed
Page 91
Third line of code

$nexmonth should be $nextmonth

Anonymous    Aug 01, 2007
Printed
Page 102
Table-generating code at the bottom half of the page

The looping construct that creates the rows and columns of the table will output
'bad' HTML depending on the number of images in the pics/ directory.

If pics/ contains 1-4 images, then the table is well-formed (only a single row with
1-4 columns.

If pics/ contains exactly 5 images (or a multiple of 5 images), then the well-formed
table rows will be followed by a row with no td elements ("<tr></tr>"), and the
resulting HTML will fail validation (ie. http://validator.w3.org/)

For any other number of images, the last row of the table will be short 1-4 td
elements (even though the resulting HTML will pass validation).

Anonymous   
Other Digital Version
102, 103
Second Paragragh

The author uses the imagecopyresized() function to make image thumbnails, but in
practice this results in terrible-looking images. Switching to the function
imagecopyresampled(), takes the same arguments and produces a much better looking
image. Side by side, the difference between the functions is quite astounding,
especially when looking at an image that you only cut the dimensions in half.

Replaced imagecopyresized with imagecopyresampled.

Anonymous    Jul 01, 2008
Printed
Page 102, 103
Second Paragragh

The author uses the imagecopyresized() function to make image thumbnails, but in
practice this results in terrible-looking images. Switching to the function
imagecopyresampled(), takes the same arguments and produces a much better looking
image. Side by side, the difference between the functions is quite astounding,
especially when looking at an image that you only cut the dimensions in half.

Replaced imagecopyresized with imagecopyresampled.

Anonymous    Aug 01, 2008
Printed
Page 154
First and second full paragraphs on the page

"New Name" in the explanatory text should not have the question marks on either side of it (ie. "?New Name?").

Anonymous    Aug 01, 2007
Printed
Page 195, 201
Figure 5-17 on page 195; Figure 5-19 on page 201

Figures 5-17 and 5-19 should be swapped.

Anonymous   
Printed
Page 225
Last line of code

'invoked with with...'
should be
"invoked with..."

Anonymous    Aug 01, 2007
Printed
Page 231
Figure 6-9, 2nd (lower) text label on right (response to Second submit)

Change "Accepted" to "Declined because of duplicated ID"

Anonymous   
Other Digital Version
233
3rd line in "Running the Hack"

"mydb" is incorrect since "transtest" is used in trans.php.

'mydb' has been changed to 'transtest'


Anonymous    Jul 01, 2008
Printed
Page 233
3rd line in "Running the Hack"

"mydb" is incorrect since "transtest" is used in trans.php.

'mydb' has been changed to 'transtest'


Anonymous    Aug 01, 2008
Other Digital Version
239
Example 6-18. The logout handler

the code now reads:

<?php
session_start();
$_SESSION = array();
session_destroy();
header( "Location: index.php" );
?>

Anonymous    Jul 01, 2008
Printed
Page 239
Example 6-18. The logout handler

the code now reads:

<?php
session_start();
$_SESSION = array();
session_destroy();
header( "Location: index.php" );
?>

Anonymous    Aug 01, 2008
Printed
Page 240
3rd paragraph from the bottom

"with the 3 value set to 1"
should be:
"with the value for 'bad' set to 1."

Anonymous    Aug 01, 2007
Other Digital Version
247, 249
Last paragraph in p.247 and 1st paragraph in p.249

management.php now reads manage.php.

Anonymous    Jul 01, 2008
Printed
Page 247, 249
Last paragraph in p.247 and 1st paragraph in p.249

management.php now reads manage.php.

Anonymous    Aug 01, 2008
Printed
Page 251
Last sentence

"...handled by PHP in the MDB() function..." should be
"...handled by PHP in the MD5() function..."

Anonymous    Aug 01, 2007
Printed
Page 256
Figures 6-25 and 6-26 should be swapped.

Anonymous   
Printed
Page 261
Last paragraph

"can still link directly to articles by referencing the redirection page and supplying the exact URL..."
should be
"can still link directly to articles by supplying the exact URL"

Anonymous    Aug 01, 2007
Printed
Page 262
example code

example code not included in the code section. Need to add code to the
downloads in a new directory called 'hack62' or something similar.

Anonymous   
Printed
Page 272
Example 6-41

the code line $ip = "64.246.30.37"
is just for debug and should be removed.

Anonymous    Aug 01, 2007
Printed
Page 272
Example 6-41

require_once("cache/lite.php"); is unnecessary.

$geo->getAddress($ip); is missing after constructor of Net_Geo.

Anonymous    Aug 01, 2007
Other Digital Version
272
Sampe code for using Net_Get()

After

$geo = new Net_Geo();

added the line:

$res = $geo->getRecord($ip);


Anonymous    Jul 01, 2008
Printed
Page 272
Sampe code for using Net_Get()

After

$geo = new Net_Geo();

added the line:

$res = $geo->getRecord($ip);


Anonymous    Aug 01, 2008
Printed
Page 274
Example 6-43

code line beginning "$first= ..."
should be:
$first= $card['N'][0]['value'][1][0]
and the code line beginning "$last= ..."
should be:
$last= should be $card['N'][0]['value'][0][0]

Anonymous    Aug 01, 2007
Printed
Page 281
2nd line from the bottom

Insert </td> into its own line before </tr>

Anonymous    Aug 01, 2007
Printed
Page 283
Figure 6-39

Remove "Checkout" link under Shopping Cart

Anonymous   
Printed
Page 308
Figure 7-7

TanleCreator and TanleCreatorImp
should be
TableCreator and TableCreatorImp
respectively.

Anonymous   
Printed
Page 310
Figure 7-8

In the DocumentURLHandler class diagram,
"ImageURLHandler" should be "DocumentURLHandler"

Anonymous   
Printed
Page 312
Example 7-10

StoryURLHandler should be DocumentURLHandler

Anonymous    Aug 01, 2007
Printed
Page 328
Example 7-18

call_user_func( array( $vis, "visitRecord" ), $r );

should be:

$vis->visitRecord( $r );

Anonymous    Aug 01, 2007
Printed
Page 353
Second sentence in paragraph following the push-pin note

"docs/index.html"
should be
"doc/index.html"

Anonymous    Aug 01, 2007
Printed
Page 370
In Handler_message_normal(), "if" clause is unnecessary.

Anonymous    Aug 01, 2007
Printed
Page 372
In NOAA(), $PERSONAL and $NOAA must be specified as "global".

The $PERSONAL and $NOAA variables should be added to the global
line at the top of the function.

Anonymous    Aug 01, 2007
Printed
Page 387
2nd paragraph

"...index.phpfile..." should be
"...index.php file"

Anonymous    Aug 01, 2007
Other Digital Version
407
Just below middle of the page, in the "foreach ($images as $img)" loop

The last line of the loop code looks like:

img: "<?php echo ($img['img']) ?>" },

The "," at the end causes a web browser to stop printing icons
after the first iteration. The comma has been removed and now results in the correct code execution.

Note that the download code from the O'Reilly site dated
05-Dec-2006 also has this bug in it. Removing
this comma verified proper functionality.

Anonymous    Jul 01, 2008
Printed
Page 407
Just below middle of the page, in the "foreach ($images as $img)" loop

The last line of the loop code looks like:

img: "<?php echo ($img['img']) ?>" },

The "," at the end causes a web browser to stop printing icons
after the first iteration. The comma has been removed and now results in the correct code execution.

Note that the download code from the O'Reilly site dated
05-Dec-2006 also has this bug in it. Removing
this comma verified proper functionality.

Anonymous    Aug 01, 2008