よくわかるPHPの教科書
たにぐち まこと[著]
ISBN978-4-8399-3314-2
2010/09発売
サポートブログ
著者によるサポートブログです。
ダウンロード
本書のサンプルファイルです。Part5-3の完成ファイルにはライブラリ、フレームワークのコードが含まれてしまうため配布しておりません。ご了承ください。
訂正情報
本書にて、以下の誤りがありました。お詫びして訂正します。
----------------------------
P041(2刷りにて修正)
「その他のエスケープシークエンス」にて、分かりにくい表現がありました。実行後の文章が改行されるとありますが、 これはブラウザ上で文章が改行されるのではなく、あくまでソースコードに出力される文章が改行されるということです。
----------------------------
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>
----------------------------
P065の表、最後の行(6刷りにて修正)
正:| 記号 | 意味 | 例 |
|---|---|---|
| % | 剰余算 | $i = 10 % 5; |
----------------------------
P065、表の下の本文2行目(6刷りにて修正)
誤:また、「除算」というのは正:また、「剰余算」というのは
----------------------------
P069の本文冒頭(6刷りにて修正)
誤:府県や商品リスト、正:都道府県や商品リスト、
----------------------------
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>----------------------------
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()」ファンクションを合わせて記述しておきます。
こうしておけば、これ以降のプログラムを止めることができます。セットで利用すると覚えてしまうと良いでしょう。
----------------------------
P090の項目見出し(6刷りにて修正)
誤:一行ごとにテーブルセルの色を変える─ 除数正:一行ごとにテーブルセルの色を変える─ 剰余算
----------------------------
P090の本文3行目(6刷りにて修正)
誤:プログラムでこれを作るには「除数」を使うのが一番です。正:プログラムでこれを作るには「剰余算」を使うのが一番です。
----------------------------
P091の本文1行目(6刷りにて修正)
誤:「除数」はLECTURE 1-2.1 でも紹介した算術演算記号で、正:「剰余算」はLECTURE 1-2.1 でも紹介した算術演算記号で、
----------------------------
P091の本文2行目(6刷りにて修正)
誤:計算式としてこの除数を使いたいことはあまりないのですが正:計算式としてこの剰余算を使いたいことはあまりないのですが
----------------------------
P092の本文1行目(6刷りにて修正)
誤:除数を使ったプログラムは、応用次第で正:剰余算を使ったプログラムは、応用次第で
----------------------------
P092の1つ目のプログラム下の本文4行目(6刷りにて修正)
誤:これも除数をうまく使えば簡単に作ることができます。正:これも剰余算をうまく使えば簡単に作ることができます。
----------------------------
P092の本文下から3行目(6刷りにて修正)
誤:$i%7が除数で、7 で割った余りなので0 から6 の値が繰り返されます。正:$i%7が剰余算で、7で割った余りなので0 から6 の値が繰り返されます。
----------------------------
P094の sample17.php の11行目(5刷りにて修正)
1行目
誤:
setcookie('my_id');正:
setcookie('my_id', '');----------------------------
P097の「使うファンクション」に追加(8刷りにて修正)
session_start
$_SESSION
header
isset
unset
htmlspecialchars
----------------------------
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>";----------------------------
P105の「このプログラムのポイント」(4刷にて修正)
下から3行目
誤:0 であれば「sample21-1.html」に、そうでなければ(つまり1 なら)「sample21-2.html」
に
正:0 であれば「sample20-1.html」に、そうでなければ(つまり1 なら)「sample20-2.html」
に
----------------------------
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>
----------------------------
P108の「練習問題の答え」(3刷りにて修正)
最初に<select>、最後に</select>が必要です。
正:
<select>
<?php
$platforms = array('win'=>'Windows', 'mac'=>'Machintosh',
'iphone'=>'iPhone 3GS', 'ipad'=>'iPad', 'android'=>'Android');
foreach($platforms as $platformId => $platformValue) {
?>
<option value="<?php echo $platformId; ?>"><?php echo
$platformValue; ?></option>
<?php
}
?>
</select>
----------------------------
P109の「使うファンクション」(6刷りにて修正)
誤:move_uploaded_files
正:move_uploaded_file
----------------------------
P110のプログラム11~12行目(8刷りにて修正)
$ext = substr($file['name'], -4);
if ($ext == '.gif' || $ext == '.jpg' || $ext == '.png') {
----------------------------
P111の本文6行目(6刷りにて修正)
誤:これを移動するファンクションが「move_uploaded_files」です。
正:これを移動するファンクションが「move_uploaded_file」です。
----------------------------
P111の1つ目の書式(6刷りにて修正)
誤:ブール値 = move_uploaded_files (【コピー元】, 【コピー先】);」
正:ブール値 = move_uploaded_file (【コピー元】, 【コピー先】);」
----------------------------
P111の図(move_uploaded_filesから末尾の「s」を削除)(6刷りにて修正)

----------------------------
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」ファンクション
----------------------------
P126の手順1の本文2行目(2刷りにて修正)
誤:入力し、「照会順序」を「utf8_general_ci」に合わせて「作成」ボタンをクリックします。
正:入力し、「照合順序」を「utf8_general_ci」に合わせて「作成」ボタンをクリックします。
----------------------------
P129のCOLUMN、本文3行目(2刷りにて修正)
誤:これは、照会順序(=文字コード)が正しく設定されていないため
正:これは、照合順序(=文字コード)が正しく設定されていないため
----------------------------
P130の「データベース(データベーススペース)、本文後ろから4行目(2刷りにて修正)
誤:また、この時に「照会順序」
正:また、この時に「照合順序」
----------------------------
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である場合、つまりフォームが送信されていた場合~
----------------------------
P236のプログラム22行目に追加(8刷りにて修正)
header('Location: check.php');
exit();
}
----------------------------
P239のプログラム21行目に追加(8刷りにて修正)
header('Location: check.php');
exit();
}
----------------------------
P242のプログラム6行目に追加(8刷りにて修正)
header('Location: index.php');
exit();
}
----------------------------
P243のプログラム5行目に追加(8刷りにて修正)
header('Location: check.php');
exit();
}
----------------------------
P244の手順4のプログラム7行目に追加(8刷りにて修正)
header('Location: index.php');
exit();
}
----------------------------
P245のプログラム14行目(紙面上)を修正(8刷りにて修正)
正:
mysql_real_escape_string(sha1($_SESSION['join']['password'])),
----------------------------
P245のプログラム22行目(紙面上)に追加(8刷りにて修正)
header('Location: thanks.php');
exit();
}
----------------------------
P253の「2」のプログラム12行目を変更(6刷りにて修正)
誤:
$record = mysql_query($sql) or die(mysql_query());
正:
$record = mysql_query($sql) or die(mysql_error());----------------------------
P253の「2」のプログラム17行目に追加(8刷りにて修正)
header('Location: login.php');
exit();
}
----------------------------
P253の「2」のプログラム24行目を変更(6刷りにて修正)
誤:
<dt><?php echo $member['name']; ?>さん、メッセージをどうぞ</dt> …2
正:
<dt><?php echo htmlspecialchars($member['name']); ?>さん、メッセージをどうぞ</dt> …2----------------------------
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();
}
----------------------------
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補足情報
Lecture1-3.4(p.097)
sample18_second.phpで、入力したIDが反映されず「さんの情報はまだ残っています」と表示されてしまう場合、Webサーバーの設定によるものである可能性があります。前ページと同様、php.iniというファイルが書き換えられる場合、次の設定を見なおしてみましょう。
session.use_cookies
この値が 0の場合、Cookieが利用できない設定になっているためセッションが利用できません。そのため、これを「1」にしてWebサーバーを再起動するとよいでしょう。
サーバにファイルをアップロードして検証する場合の文字コードについて
ファイルの転送画面にて、文字コードを設定する項目がある場合、UTF-8になっているかをご確認ください。エディタの文字コードが正しく設定されていても、転送時に変えられてしまう場合があります。
プログラム実行時に警告が出る場合
XAMPPのphp.iniの設定により警告が出る場合があります。H2O Collageの投稿を参考にしてください。
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」から始まる警告が表示される場合
サーバの設定により、警告が出る場合があります。H2O Collageの投稿など、参考にしてください。



