翔泳社のオンラインショップ

PHP 逆引きレシピ 正誤表

(最終更新日:2011-09-21)

お買い上げになった刷数:
訂正箇所 改訂
刷数
内容
P.105
下から2行目
2刷
三項演算子 [レシピ023] を使った以下の記述と同じ意味になりますが、
三項演算子 [レシピ023] を使った以下の記述と同じ結果になりますが、
P.117
表3.1、\Wの説明
未定
アルファベット、数字、アンダースコア
単語構成文字。[a-zA-Z0-9_]とは異なる可能性があるので注意
以下の本書公式サイトもあわせてご参照ください。
http://php-recipe.com/?p=483
P.132
表3.5
4刷
h | 「全角ひらがな」を「全角カタカナ」に変換
c | 「全角カタカナ」を「全角ひらがな」に変換

h | 「全角ひらがな」を「全角カタカナ」に変換
H | 「半角カタカナ」を「全角ひらがな」に変換
c | 「全角カタカナ」を「全角ひらがな」に変換
P.157
1つ目のリスト
2刷
echo date('Y年m月d日', '1237827055');
echo date('Y年m月d日', 1237827055);
P.157
2つ目のリスト
2刷
echo strtotime('+1 day', '1237827055');
echo strtotime('+1 day', 1237827055);
P.163
本文4行目
2刷
変換できます。
変換できます。なお、P480のNOTEも参照してください。
P.174
中段、「月初日の曜日を元にして第1○曜日の日付を求めます。」の2行目
6刷
if($firstday < 0)
if($firstday <= 0)
P.186
図(実行結果)の下に本文を追加
4刷
追加情報  PEAR::Calendarパッケージのバージョン0.5.4にはバグがあります。
 詳細は、http://php-recipe.com/?p=300を参照してください。
P.257、259
ソースコード
4刷
ファイルを読み取りモードで開きます。
$fp = fopen($fileName, 'rb');

ファイルを読み取りモードで開きます。
$fp = fopen($fileName, 'rb');
if (!is_resource($fp)) {
 die(' ファイルを開けませんでした。 ');
}
P.333
グラフ内のx(下部)
2刷
0 10 20 30 40 50 60 70 80 90 100
1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
P.401
本文3~4行目
2刷
そこで、@(エラー制御演算子)レシピ254でNoticeエラーが出ないようにしています。
そこで、isset()レシピ167変数がセットされているか確認して処理しています。
P.466
本文、下から1行目
4刷
urlencode()関数で元に
urldecode()関数で元に
P.473、476
「NOTE」の上
2刷
以下の文章を追加します。
PHP4またはMySQL 4.0(ロリポップなど)の環境ではサンプルコードの修正が必要となります。P.526のNOTE「MySQLの文字エンコード指定」を参照してください。
P.474
リスト最終行の網掛け部
2刷
$flagの値の判定します。
$flagの値判定します。
P.480
ページ下部
2刷
以下の文章を追加します。
NOTE
strtotimeの2038年問題

32ビットシステム上でのタイムスタンプの有効な範囲は、通常、1901年12月13日 20:45:54 UTCから2038年1月19日 03:14:07 UTCまでです。この範囲を超える日付はstrtotime()関数では扱えませんので注意してください。
PHP5.2以降ではDateTimeクラスを使うことでこの問題を解決できます。
P.503
9~14行目
未定
# getimagesize()関数で画像かどうかの判定をします。
  $checkImage = @getimagesize($_FILES['uploadfile']['tmp_name'][$i]);
  if ($checkImage == FALSE) {
   $error .= '画像ファイルをアップロードしてください<br />';
  } else if ($imgType != $checkImage['mime']) {
   $error .= '拡張子が異なります<br />';
  } else if ($_FILES['uploadfile']['size'][$i] > 102400) {
# getimagesize()関数で画像かどうかの判定をします。
  $checkImage = @getimagesize($_FILES['uploadfile']['tmp_name'][$i]);
  $type = $checkImage[2]; // 画像タイプを取得
  if ($checkImage == FALSE) {
   $error .= '画像ファイルをアップロードしてください<br />';
  } else if ($extension == 'gif' && $type != IMAGETYPE_GIF) {
   $error .= '拡張子が異なります<br />';
  } else if ($extension == 'png' && $type != IMAGETYPE_PNG) {
   $error .= '拡張子が異なります<br />';
  } else if ($extension == 'jpg' && $type != IMAGETYPE_JPEG) {
   $error .= '拡張子が異なります<br />';
  } else if ($_FILES['uploadfile']['size'][$i] > 102400) {
以下の本書公式サイトもあわせてご参照ください。
http://php-recipe.com/?p=457
P.503
下から21~23行目
未定
# ここでは格納ディレクトリの下に「"upfile_" + 現在のタイムスタンプ + 連番 + 拡張子」で配置します。
$moveTo = $filePath . '/upfile_' . time() . $i . '.' . $extension;
# ここでは格納ディレクトリの下に「"upfile_" + 現在のタイムスタンプ + 連番 + "_" + マイクロ秒と元ファイル名とアクセス元IPアドレスに基づくMD5 + 拡張子」で配置します。
$moveTo = $filePath . '/upfile_' . time() . $i . '_' . md5(microtime() . $_FILES['uploadfile']['name'][$i] . $_SERVER['REMOTE_ADDR']) . '.' . $extension;
以下の本書公式サイトもあわせてご参照ください。
http://php-recipe.com/?p=457
P.511
リスト中ほど
2刷
PEAR::Net_POP3をインクルードします。
require_once('Net/POP3.php');
PEAR::Net_POP3をインクルードします。
require_once 'Net/POP3.php';
P.515
リスト内
5刷
echo '<p>' . $ipaddress . ' → ' . gethostbyaddr($ipaddress) . '</p>';
echo '<p>' . h($ipaddress) . ' → ' . h(gethostbyaddr($ipaddress)) . '</p>';
P.515
リスト内
5刷
echo '<p>ユーザー: ' . $ipaddress . ' → ' . gethostbyaddr($ipaddress) . '</p>';
echo '<p>ユーザー: ' . h($ipaddress) . ' → ' .
  h(gethostbyaddr($ipaddress)) . '</p>';

function h($string) { // HTMLでのエスケープ処理をする関数
 return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}
P.516
リスト内
5刷
echo '<p>' . $hostname . ' → ' . gethostbyname($hostname) . '</p>';
echo '<p>' . h($hostname) . ' → ' . h(gethostbyname($hostname)) . '</p>';

function h($string) { // HTMLでのエスケープ処理をする関数
 return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}
P.549
リストの1つ目の網掛け(作成するテーブル~)部分
2刷
$newTable = 'id INT(2) NOT NULL AUTO_INCREMENT PRIMARY KEY, ' .
         'data VARCHAR(100) NOT NULL';
$newTable = '`id` INT(2) NOT NULL AUTO_INCREMENT PRIMARY KEY, ' .
         '`data` VARCHAR(100) NOT NULL';
P.549
リストの2つ目の網掛け(テーブルを追加する~)部分
2刷
$sql = sprintf("CREATE TABLE example2 (%s) ENGINE=MyISAM " .
          "DEFAULT CHARSET=utf8",
          mysql_real_escape_string($newTable));
$sql = sprintf("CREATE TABLE `example2` (%s) ENGINE=MyISAM " .
          "DEFAULT CHARSET=utf8",
          $newTable);
P.549
リストの2つ目の網掛け(// ロリポップの場合)部分
2刷
// $sql = sprintf("CREATE TABLE example2 (%s) ENGINE=MyISAM ",
//          mysql_real_escape_string($newTable));
// $sql = sprintf("CREATE TABLE `example2` (%s) ENGINE=MyISAM ",
//          $newTable);
P.550
2つ目のリスト
2刷
$sql = sprintf("CREATE TABLE example2 (%s) ENGINE=MyISAM ",
         mysql_real_escape_string($newTable));
$sql = sprintf("CREATE TABLE `example2` (%s) ENGINE=MyISAM ",
         $newTable);
P.559
ソースコード中ほど
4刷
$fp = fopen($file, 'r');
while (!feof($fp)) {
 $line = fgets($fp));

$fp = fopen($file, 'r');
if (!is_resource($fp)) {
 die(' ファイルを開けませんでした。 ');
}

while (!feof($fp)) {
 $line = fgets($fp));
P.601
一番下の網囲み
5刷
htmlspecialchars('文字列', ENT_QUOTES)
htmlspecialchars('文字列', ENT_QUOTES, '文字エンコード')
P.602
上から2行目
5刷
可能性があります。
可能性があります。第3引数の詳細は、http://php-recipe.com/?p=377を参照してください。
P.616
「クエリを準備します」の上の部分
2刷
if (mysqli_connect_errno()) {
  die('データベースエラー');
}
if (mysqli_connect_errno()) {
 die('データベースエラー');
}
//文字エンコードの指定
else if (!mysqli_set_charset($link, 'utf8')) {
 die('データベースエラー');

}
1つ目の「die('データベースエラー');」の開始位置も変更します。
P.650
下から2行目
2刷
三項演算子 [レシピ023] を使った以下の記述と同じ意味になりますが、
三項演算子 [レシピ023] を使った以下の記述と同じ結果になりますが、
P.731
INDEX「C」
2刷
CREATE TABLE文・・・・548
CSRF・・・・・・・・・・・・・・・438,608

CREATE TABLE文・・・・548
cron・・・・・・・・・・・・・・・・712,714
CSRF・・・・・・・・・・・・・・・438,608
P.737
INDEX「S」
2刷
strtotime()関数・・・・・157、163、479
 注意点・・・・・・・・・・・175
strtoupper()関数・・・・125

strtotime()関数・・・・・157、163、479
 2038問題・・・・・・・・・480
 注意点・・・・・・・・・・・175
 年の桁数・・・・・・・・・480
strtoupper()関数・・・・125
P.vii
「レンタルサーバー動作確認マークについて」1行目
2刷
ロリップ
ロリップ

ページ上に戻る

正誤表トップに戻る