よくわかるPHPの教科書

たにぐち まこと[著]
ISBN978-4-8399-3314-2
2010/09発売

ダウンロード

本書のサンプルファイルです。Part5-3の完成ファイルにはライブラリ、フレームワークのコードが含まれてしまうため配布しておりません。ご了承ください。

訂正情報

本書にて、以下の誤りがありました。お詫びして訂正します。

----------------------------

P053の「練習問題」(2~3刷りにて修正)

1行目
誤:

<form action="practice03.php" action="get">

正:
<form action="practice04.php" method="get">

13行目に 次のコードが抜けていました。

</form>


----------------------------

P054の「プログラム」の「sample05.php」(3刷りにて修正)

2行目
誤:

print(htmlspecialchars($_POST['gender'], ENT_QUOTES));

正:
print('性別: ' . htmlspecialchars($_POST['gender'], ENT_QUOTES));


----------------------------

P055の「このプログラムのポイント」(2刷りにて修正)

1行目
誤:

<input id="gender_male" type="radiobutton" name="gender" value="男性" /><label for="gender_male">男性</label>

正:
<input id="gender_male" type="radio" name="gender" value="男性" /><label for="gender_male">男性</label>


----------------------------

P075の最初のプログラム(6刷りにて修正)

正:
<input type="checkbox" id="a-1" value="a-1" /><label for="a-1">ガム</label>
<input type="checkbox" id="b-1" value="b-1" /><label for="b-1">チョコレート</label>
<input type="checkbox" id="c-3" value="c-3" /><label for="c-3">クッキー</label>


----------------------------

P094の sample17.php の11行目(5刷りにて修正)

1行目
誤:

setcookie('my_id');

正:
setcookie('my_id', '');


----------------------------

P102のsample19.phpの3行目(6刷りにて修正)

誤:
mb_internal_encoding("UTF8")

正:
mb_internal_encoding("UTF-8")

----------------------------

P102のsample19.phpの5行目(6刷りにて修正)

誤:
if (isset($_POST['email'])) {

正:
if (!empty($_POST['email'])) {


----------------------------

P102のsample19.phpの9行目(6刷りにて修正)

誤:
$from = mb_encode_mimeheader(mb_convert_encoding("たにぐちまこ
と","JIS","UTF8"))."<support@h2o-space.com>";

正:
$from = mb_encode_mimeheader(mb_convert_encoding("たにぐちまこ
と","JIS","UTF-8"))."<support@h2o-space.com>";


----------------------------

P106のサンプル実行画面(正)(2刷りにて修正)

----------------------------

P106のサンプルプログラム(2刷りにて修正)

正:

<?php
print '<p>3000円のものから 100円値引きした場合は、' . floor(100 / 3000 * 100) . '%引きです</p>';
?>
<p>その他の計算</p>
<ul>
<?php
print '<li>元の計算式→' . 100 / 3000 * 100 . '</li>';
print '<li>切り上げ(ceil)→' . ceil(100 / 3000 * 100) . '</li>';
print '<li>四捨五入(round)→' . round(100 / 3000 * 100 ,1) . '</li>';
?>
</ul>

----------------------------

P110のプログラム11~12行目(8刷りにて修正)

$ext = substr($file['name'], -4);
if ($ext == '.gif' || $ext == '.jpg' || $ext == '.png') {

----------------------------

P112の1~7行目(8刷りにて修正)

そこで、3でこの拡張子を検査しています。まず「substr」というファンクションは文字列から一部分だけを切り取ることができます。2番目のパラメータに「-4」と指定しているのは「後ろから4文字目」という意味で、ここではファイル名の後ろから4文字を切り取っているため、拡張子 を抜き出すことができます。
これを「$ext」という変数に代入して、それぞれ「.gif」「.jpg」「.png」と同等であるかを比べています。 「|| 」は論理演算子で「または」という意味でした。つまり、この拡張子のいずれかの場合は画像 として受け入れ、それ以外の場合はエラーメッセージを表示して終了させます。

----------------------------

P118の本文1行目(6刷りにて修正)

誤:PHP5 から採用された「simeplexml_load_file」ファンクション
正:PHP5 から採用された「simplexml_load_file」ファンクション

----------------------------

P131の本文1~2行目(2刷りにて修正)

誤:Fig2 のように横軸を「列」、縦軸を「行」などと呼びますが、
正:Fig2 のように横軸を「」、縦軸を「」などと呼びますが、

----------------------------

P131の本文4行目(2刷りにて修正)

誤:横軸を「フィールド」、縦軸を「レコード」と呼びます。
正:横軸を「レコード」、縦軸を「フィールド」と呼びます。

----------------------------

P131の本文6行目(2刷りにて修正)

誤:また、横軸のことを「カラム」と呼ぶ場合もあるので、
正:また、軸のことを「カラム」と呼ぶ場合もあるので、

----------------------------

P138の「INSERT文の使い方」のソースコード(2刷りにて修正)

誤:

INSERT INTO my_items SET id=1, item_name='いちご', price='200';

正:
INSERT INTO my_items SET id=1, item_name='いちご', price=200;

----------------------------

P139の「行の最後に「;」」のソースコード(2刷りにて修正)

誤:

INSERT INTO my_items SET id=1, item_name='いちご', price='200';

正:
INSERT INTO my_items SET id=1, item_name='いちご', price=200

----------------------------

P176の最初のソースコード、GROUP BYの後ろを変更(5刷りにて修正)

誤:

SELECT i.item_name, SUM(c.count) FROM my_items i, carts c WHERE
i.id=c.item_id GROUP BY c.item_id;

正:
SELECT i.item_name, SUM(c.count) FROM my_items i, carts c WHERE
i.id=c.item_id GROUP BY i.id;

----------------------------

P177の最初のソースコード、GROUP BYの後ろを変更(5刷りにて修正)

誤:

SELECT i.item_name, SUM(count) FROM my_items i LEFT JOIN carts c
ON i.id=c.item_id GROUP BY c.item_id;

正:
SELECT i.item_name, SUM(count) FROM my_items i LEFT JOIN carts c
ON i.id=c.item_id GROUP BY i.id;

----------------------------

P177の最初の本文を変更(5刷りにて修正)

誤:これで、Fig3 のようにバナナも表示されるようになりました。
正:これで、Fig3 のようにバナナとブルーベリーも表示されるようになりました。


----------------------------

P177の最初の図を変更(正)(5刷りにて修正)


----------------------------

P203の図Fig1の変更(正)(6刷りにて修正)


----------------------------

P236の本文、下から10行目(6刷りにて修正)

誤:「empty($_POST)」の戻り値がtrueである場合、つまりフォームが送信されていた場合~

正:「!empty($_POST)」の戻り値がtrueである場合、つまりフォームが送信されていた場合~


----------------------------

P253の「2」のプログラム12行目を変更(6刷りにて修正)

誤:

$record = mysql_query($sql) or die(mysql_query());

正:
$record = mysql_query($sql) or die(mysql_error());


----------------------------

P253の「2」のプログラム24行目を変更(6刷りにて修正)

誤:

<dt><?php echo $member['name']; ?>さん、メッセージをどうぞ</dt> …2

正:
<dt><?php echo htmlspecialchars($member['name']); ?>さん、メッセージをどうぞ</dt> …2


----------------------------

P273の「1」のindex.phpのプログラム17行目に追加、18行目を修正(7刷りにて修正)

16行目(そのまま)

$start = ( $page -1 ) * 5;

17行目(この行を追加)

$start = max(0, $start);

18行目(赤字部分を修正)

$sql = sprintf('SELECT m.name, m.picture, p.* FROM members m,posts p WHERE m.id=p.member_id ORDER BY p.created DESC LIMIT %d,5', …2


補足情報(1)

以下は、書籍中のコードをそのまま実用で使うことを考えた場合に、セキュリティ上の配慮を追加する情報です。

----------------------------

P085のsample14.phpの4行目(8刷りにて修正)

誤:

if (preg_match("/^\d{3}\-\d{4}$/", $zip)) {

正:

if (preg_match("/\A\d{3}\-\d{4}\z/", $zip)) {


----------------------------

P086の1段落目最後のプログラム(8刷りにて修正)

正:

/\A\d{3}\-\d{4}\z/

----------------------------

P086の2段落目(8刷りにて修正)

正:
まず、先頭と最後にある「/(スラッシュ)」は正規表現の始まりと終わりを示すための記号で、必ず付加します。次の「\A」とそれに続く「\d」は、まず「\d」が「数字」であることを示 し(Decimalのd)、それが「先頭にある」ということを「\A」が表してします。そのため、例えば

/\A\d/

----------------------------

P086の3段落目5行目(8刷りにて修正)

正:
そして、最後の「\z」は「最後」という意味です。つまり、「\A」と「\z」に挟まれていれば、 その前後に余計な文字が付加されていないことを検査することができます。ということで、この正規表現は全体で、次のような意味になります。

----------------------------

P088の「使うファンクション」と「プログラム」(8刷りにて修正)

正:

(使うプログラム)

header、exit

(プログラム「sample15.php」)

<?php
header('Location: http://h2o-space.com/');
exit();
?>

----------------------------

P089の1段落目最後に追記(8刷りにて修正)

正:

移動先のURL には、「http://」から始まる他のサイトのURL や「../」などから始まる相対パス、「/」 から始まる「ルート相対パス」などが利用できます。
こうして、好きなときに別のページに移動させることができます。
なお、ページを移動するときは、それ以降のプログラムが実行されないように「exit()」ファンクションを合わせて記述しておきます。
こうしておけば、これ以降のプログラムを止めることができます。セットで利用すると覚えてしまうと良いでしょう。

----------------------------

P236のプログラム22行目に追加(8刷りにて修正)

  header('Location: check.php');
exit();
}

----------------------------

P239のプログラム21行目に追加(8刷りにて修正)

  header('Location: check.php');
exit();
}

----------------------------

P242のプログラム6行目に追加(8刷りにて修正)

  header('Location: index.php');
exit();
}

----------------------------

P244の手順4のプログラム7行目に追加(8刷りにて修正)

  header('Location: index.php');
exit();
}

----------------------------

P245のプログラム15行目(紙面上)を修正(8刷りにて修正)

正:

mysql_real_escape_string(sha1($_SESSION['join']['password'])),

----------------------------

P245のプログラム22行目(紙面上)に追加(8刷りにて修正)

  header('Location: thanks.php');
exit();
}

----------------------------

P243のプログラム5行目に追加(8刷りにて修正)

  header('Location: check.php');
exit();
}

----------------------------

P253の「2」のプログラム17行目に追加(8刷りにて修正)

  header('Location: login.php');
exit();
}

----------------------------

P255のプログラム19行目に追加(8刷りにて修正)

  header('Location: index.php');
exit();
}

----------------------------

P260のプログラム2行目を修正、3行目に追加(8刷りにて修正)

  header('Location: index.php');
exit();
}

----------------------------

P261のプログラム12行目に追加(8刷りにて修正)

  header('Location: index.php');
exit();
}

----------------------------

P263のプログラム7行目に追加(8刷りにて修正)

  header('Location: index.php');
exit();
}

----------------------------

P272のプログラム21行目に追加(8刷りにて修正)

  header('Location: index.php');
exit();
}

----------------------------

P276のプログラム20行目に追加(8刷りにて修正)

  header('Location: login.php');
exit();
}

----------------------------

P284の手順2のプログラム9行目に追加(8刷りにて修正)

  header('Location: index_mobile.php');
exit();
}

----------------------------

P286のプログラム9行目に追加(8刷りにて修正)

  header('Location: index.php');
exit();
}

補足情報(2)

以下は、お寄せいただいた問い合わせをもとに、よくあるご質問やそれに対する補足、またはトラブルと対策法などをまとめたものです。

----------------------------

P041(2刷りにて修正)

「その他のエスケープシークエンス」にて、分かりにくい表現がありました。実行後の文章が改行されるとありますが、 これはブラウザ上で文章が改行されるのではなく、あくまでソースコードに出力される文章が改行されるということです。


Lecture1-3.4(p.097)

sample18_second.phpで、入力したIDが反映されず「さんの情報はまだ残っています」と表示されてしまう場合、Webサーバーの設定によるものである可能性があります。前ページと同様、php.iniというファイルが書き換えられる場合、次の設定を見なおしてみましょう。


session.use_cookies

この値が 0の場合、Cookieが利用できない設定になっているためセッションが利用できません。そのため、これを「1」にしてWebサーバーを再起動するとよいでしょう。


サーバにファイルをアップロードして検証する場合の文字コードについて

ファイルの転送画面にて、文字コードを設定する項目がある場合、UTF-8になっているかをご確認ください。エディタの文字コードが正しく設定されていても、転送時に変えられてしまう場合があります。


プログラム実行時に警告が出る場合

XAMPPのphp.iniの設定により警告が出る場合があります。こちらの記事を参考にしてください。


P202の「1」のプログラム実行時にエラーが出る場合

これはmysql_real_escape_stringの書き方の例示なので、要点だけを書いています。実際に実行する場合には、1行目<?phpの行の後ろに下記3行を入れる必要があります。

mysql_connect('localhost', 'root', '') or die(mysql_error());
mysql_select_db('mydb');
mysql_query('SET NAMES UTF8');


プログラム実行時、「Notice」から始まる警告が表示される場合

サーバの設定により、警告が出る場合があります。こちらの記事を参考にしてください。