2016.11.18

『確かな力が身につく「PHP」超入門』正誤情報

確かな力が身につくPHP「超」入門

本書内の記載のうち、以下の項目で誤りがありました。
修正内容を提示させていただきます。
ご迷惑をおかけいたしました事、深くお詫び申し上げます。

※初版第2刷
▽130ページ Note内のリスト

if (isset($_REQUEST[‘genre’])) {
 foreach ($_REQUEST[‘genre’] as $item) {
  …
 }
}


<?php require ‘../header.php’;?>
<?php
if(isset($_REQUEST[‘genre’])){
 foreach ($_REQUEST[‘genre’] as $item) {
  echo ‘<p>’, $item, ‘</p>’;
 }
}
echo ‘に関するお買い得情報をお送りさせて頂きます。’;
?>
<?php require ‘../footer.php’;?>

▽208ページ search-output.php

foreach ($sql->fetchAll() as $row) {


foreach ($sql as $row) {

▽211ページ

書式 execute
変数->execute([値])


書式 execute
PDOStatementの変数->execute([値])

▽212ページ

SQLスクリプトを実行した結果の取得(fetchAllメソッド)
 SQLスクリプトをexecuteメソッドで実行した結果は、PDOStatementクラスのfetchAllメソッドで取得することができます。取得した結果を処理するときには、foreachループ(p.116)と組み合わせて、次のように記述します。$sqlはPDOStatementインスタンス(p.210)を代入した変数です。

foreach ($sql->fetchAll() as $row) {

書式 fetchAll
foreach (PDOの変数->fetchAll() as 結果を代入する変数)

 ここでは結果を・・・


SQLスクリプトを実行した結果の処理
 SQLスクリプトをexecuteメソッドで実行した結果を処理するには、PDOStatementインスタンス(p.210)とforeachループ(p.116)を組み合わせて、次のように記述します。$sqlはPDOStatementインスタンスを代入した変数です。

foreach ($sql as $row) {

書式 SQLスクリプトの実行結果を処理する
foreach (PDOStatementの変数 as 結果を代入する変数)

 ここでは結果を・・・

▽214ページ search-output2.php

foreach ($sql->fetchAll() as $row) {


foreach ($sql as $row) {

▽230ページ

このスクリプトは、6-3のStep5(p.200)で作成した、商品一覧を表示するスクリプト(chapter6all4.php)によく似ています。異なる部分を赤字で示しました。


このスクリプトは、6-3のStep5(p.200)で作成した、商品一覧を表示するスクリプト(chapter6all4.php)と構造が似ています。異なる部分を赤字で示しました。HTMLの表(テーブル)の中に複数のフォームを配置するのは少し難しいので、ここでは<div>タグとスタイルファイル(chapter6style.css)を使って、表のようなレイアウトを作りました。

▽231ページ  update-input.php

<?php require ‘../header.php’;?>
<table>
<tr><th>商品番号</th><th>商品名</th><th>商品価格</th></tr>
<?php
$pdo=new PDO(‘mysql:host=localhost;dbname=shop;charset=utf8’,
‘staff’, ‘password’);
foreach ($pdo->query(‘select * from product’) as $row) {
 echo ‘<tr><form action=”update-output.php” method=”post”>’;
 echo ‘<input type=”hidden” name=”id” value=”‘, $row[‘id’], ‘”>’;
 echo ‘<td>’, $row[‘id’], ‘</td>’;
 echo ‘<td>’;
 echo ‘<input type=”text” name=”name” value=”‘, $row[‘name’], ‘”>’;
 echo ‘</td>’;
 echo ‘<td>’;
 echo ‘<input type=”text” name=”price” value=”‘, $row[‘price’], ‘”>’;
 echo ‘</td>’;
 echo ‘<td><input type=”submit” value=”更新”></td>’;
 echo ‘</form></tr>’;
 echo “n”;
}
?>
</table>
<?php require ‘../footer.php’;?>


<?php require ‘../header.php’;?>
<div class=”th0″>商品番号</div>
<div class=”th1″>商品名</div>
<div class=”th1″>商品価格</div>
<?php
$pdo=new PDO(‘mysql:host=localhost;dbname=shop;charset=utf8’,
‘staff’, ‘password’);
foreach ($pdo->query(‘select * from product’) as $row) {
 echo ‘<form action=”update-output.php” method=”post”>’;
 echo ‘<input type=”hidden” name=”id” value=”‘, $row[‘id’], ‘”>’;
 echo ‘<div class=”td0″>’, $row[‘id’], ‘</div> ‘;
 echo ‘<div class=”td1″>’;
 echo ‘<input type=”text” name=”name” value=”‘, $row[‘name’], ‘”>’;
 echo ‘</div>’;
 echo ‘<div class=”td1″>’;
 echo ‘ <input type=”text” name=”price” value=”‘, $row[‘price’], ‘”>’;
 echo ‘</div>’;
 echo ‘<div class=”td2″><input type=”submit” value=”更新”></div>’;
 echo ‘</form>’;
 echo “n”;
}
?>
<?php require ‘../footer.php’;?>

▽238ページ delete-input.php

echo ‘<td>’$row[‘id’]'</td>’;
echo ‘<td>’$row[‘name’]'</td>’;
echo ‘<td>’$row[‘price’]'</td>’;


echo ‘<td>’, $row[‘id’], ‘</td>’;
echo ‘<td>’, $row[‘name’], ‘</td>’;
echo ‘<td>’, $row[‘price’], ‘</td>’;

▽243ページ edit.php

<?php require ‘../header.php’;?>
<table>
<tr><th>商品番号</th><th>商品名</th><th>商品価格</th></tr>
<tr>
<form action=”edit3.php” method=”post”>
<input type=”hidden” name=”command” value=”insert”>
<td></td>
<td><input type=”text” name=”name”></td>
<td><input type=”text” name=”price”></td>
<td><input type=”submit” value=”追加”></td>
</form>
</tr>
</table>
<?php require ‘../footer.php’;?>


<?php require ‘../header.php’;?>
<div class=”th0″>商品番号</div>
<div class=”th1″>商品名</div>
<div class=”th1″>商品価格</div>
<form action=”edit3.php” method=”post”>
<input type=”hidden” name=”command” value=”insert”>
<div class=”td0″></div>
<div class=”td1″><input type=”text” name=”name”></div>
<div class=”td1″><input type=”text” name=”price”></div>
<div class=”td2″><input type=”submit” value=”追加”></div>
</form>
<?php require ‘../footer.php’; ?>

▽245ページ edit2.php

<?php require ‘../header.php’;?>
<table>
<tr><th>商品番号</th><th>商品名</th><th>商品価格</th></tr>
<?php
$pdo=new PDO(‘mysql:host=localhost;dbname=shop;charset=utf8’,
 ’staff’, ‘password’);
foreach ($pdo->query(‘select * from product’) as $row) {
 echo ‘<tr>’;
 echo ‘<form action=”edit3.php” method=”post”>’;
 echo ‘<input type=”hidden” name=”command” value=”update”>’;
 echo ‘<input type=”hidden” name=”id” value=”‘, $row[‘id’], ‘”>’;
 echo ‘<td>’, $row[‘id’], ‘</td>’;
 echo ‘<td>’;
 echo ‘<input type=”text” name=”name” value=”‘, $row[‘name’], ‘”>’;
 echo ‘</td>’;
 echo ‘<td>’;
 echo ‘<input type=”text” name=”price” value=”‘, $row[‘price’], ‘”>’;
 echo ‘</td>’;
 echo ‘<td><input type=”submit” value=”更新”></td>’;
 echo ‘</form>’;
 echo ‘<form action=”edit3.php” method=”post”>’;
 echo ‘<input type=”hidden” name=”command” value=”delete”>’;
 echo ‘<input type=”hidden” name=”id” value=”‘, $row[‘id’], ‘”>’;
 echo ‘<td><input type=”submit” value=”削除”></td>’;
 echo ‘</form>’;
 echo ‘</tr>’;
 echo “n”;
}
?>
<tr>
<form action=”edit3.php” method=”post”>
<input type=”hidden” name=”command” value=”insert”>
<td></td>
<td><input type=”text” name=”name”></td>
<td><input type=”text” name=”price”></td>
<td><input type=”submit” value=”追加”></td>
</form>
</tr>
</table>
<?php require ‘../footer.php’;?>


<?php require ‘../header.php’;?>
<div class=”th0″>商品番号</div>
<div class=”th1″>商品名</div>
<div class=”th1″>商品価格</div>
<?php
$pdo=new PDO(‘mysql:host=localhost;dbname=shop;charset=utf8’,
 ’staff’, ‘password’);
foreach ($pdo->query(‘select * from product’) as $row) {
 echo ‘<form class=”ib” action=”edit3.php” method=”post”>’;
 echo ‘<input type=”hidden” name=”command” value=”update”>’;
 echo ‘<input type=”hidden” name=”id” value=”‘, $row[‘id’], ‘”>’;
 echo ‘<div class=”td0″>’;
 echo $row[‘id’];
 echo ‘</div>’;
 echo ‘<div class=”td1″>’;
 echo ‘<input type=”text” name=”name” value=”‘, $row[‘name’], ‘”>’;
 echo ‘</div>’;
 echo ‘<div class=”td1″>’;
 echo ‘<input type=”text” name=”price” value=”‘, $row[‘price’], ‘”>’;
 echo ‘</div>’;
 echo ‘<div class=”td2″>’;
 echo ‘<input type=”submit” value=”更新”>’;
 echo ‘</div>’;
 echo ‘</form>’;
 echo ‘<form class=”ib” action=”edit3.php” method=”post”>’;
 echo ‘<input type=”hidden” name=”command” value=”delete”>’;
 echo ‘<input type=”hidden” name=”id” value=”‘, $row[‘id’], ‘”>’;
 echo ‘<input type=”submit” value=”削除”>’;
 echo ‘</form>’;
 echo “n”;
}
?>
<form action=”edit3.php” method=”post”>
<input type=”hidden” name=”command” value=”insert”>
<div class=”td0″></div>
<div class=”td1″><input type=”text” name=”name”></div>
<div class=”td1″><input type=”text” name=”price”></div>
<div class=”td2″><input type=”submit” value=”追加”></div>
</form>
<?php require ‘../footer.php’;?>

▽247ページ edit3.php

<?php require ‘../header.php’;?>
<table>
<tr><th>商品番号</th><th>商品名</th><th>商品価格</th></tr>
<?php
$pdo=new PDO(‘mysql:host=localhost;dbname=shop;charset=utf8’,
 ’staff’, ‘password’);
if (isset($_REQUEST[‘command’])) {
 switch ($_REQUEST[‘command’]) {
 case ‘insert’:
  if (empty($_REQUEST[‘name’]) ||
   !preg_match(‘/[0-9]+/’, $_REQUEST[‘price’])) break;
  $sql=$pdo->prepare(‘insert into product values(null,?,?)’);
  $sql->execute(
   [htmlspecialchars($_REQUEST[‘name’]),        $_REQUEST[‘price’]]);
  break;
 case ‘update’:
  if (empty($_REQUEST[‘name’]) ||
   !preg_match(‘/[0-9]+/’, $_REQUEST[‘price’])) break;
  $sql=$pdo->prepare(
   ’update product set name=?, price=? where id=?’);
  $sql->execute(
   [htmlspecialchars($_REQUEST[‘name’]),  $_REQUEST[‘price’],
$_REQUEST[‘id’]]);
  break;
 case ‘delete’:
  $sql=$pdo->prepare(‘delete from product where id=?’);
  $sql->execute([$_REQUEST[‘id’]]);
 break;
 }
}
foreach ($pdo->query(‘select * from product’) as $row) {
 echo ‘<tr>’;
 echo ‘<form action=”edit3.php” method=”post”>’;
 echo ‘<input type=”hidden” name=”command” value=”update”>’;
 echo ‘<input type=”hidden” name=”id” value=”‘, $row[‘id’], ‘”>’;
 echo ‘<td>’, $row[‘id’], ‘</td>’;
 echo ‘<td>’;
 echo ‘<input type=”text” name=”name” value=”‘, $row[‘name’], ‘”>’;
 echo ‘</td>’;
 echo ‘<td>’;
 echo ‘<input type=”text” name=”price” value=”‘, $row[‘price’], ‘”>’;
 echo ‘</td>’;
 echo ‘<td><input type=”submit” value=”更新”></td>’;
 echo ‘</form>’;
 echo ‘<form action=”edit3.php” method=”post”>’;
 echo ‘<input type=”hidden” name=”command” value=”delete”>’;
 echo ‘<input type=”hidden” name=”id” value=”‘, $row[‘id’], ‘”>’;
 echo ‘<td><input type=”submit” value=”削除”></td>’;
 echo ‘</form>’;
 echo ‘</tr>’;
 echo “n”;
}
?>
<tr>
<form action=”edit3.php” method=”post”>
<input type=”hidden” name=”command” value=”insert”>
<td></td>
<td><input type=”text” name=”name”></td>
<td><input type=”text” name=”price”></td>
<td><input type=”submit” value=”追加”></td>
</form>
</tr>
</table>
<?php require ‘../footer.php’;?>


<?php require ‘../header.php’;?>
<div class=”th0″>商品番号</div>
<div class=”th1″>商品名</div>
<div class=”th1″>商品価格</div>
<?php
$pdo=new PDO(‘mysql:host=localhost;dbname=shop;charset=utf8’,
 ’staff’, ‘password’);
if (isset($_REQUEST[‘command’])) {
 switch ($_REQUEST[‘command’]) {
 case ‘insert’:
  if (empty($_REQUEST[‘name’]) ||
   !preg_match(‘/[0-9]+/’, $_REQUEST[‘price’])) break;
  $sql=$pdo->prepare(‘insert into product values(null,?,?)’);
  $sql->execute(
   [htmlspecialchars($_REQUEST[‘name’]), $_REQUEST[‘price’]]);
  break;
 case ‘update’:
  if (empty($_REQUEST[‘name’]) ||
   !preg_match(‘/[0-9]+/’, $_REQUEST[‘price’])) break;
  $sql=$pdo->prepare(
   ’update product set name=?, price=? where id=?’);
  $sql->execute(
   [htmlspecialchars($_REQUEST[‘name’]), $_REQUEST[‘price’],
$_REQUEST[‘id’]]);
  break;
 case ‘delete’:
  $sql=$pdo->prepare(‘delete from product where id=?’);
  $sql->execute([$_REQUEST[‘id’]]);
  break;
 }
}
foreach ($pdo->query(‘select * from product’) as $row) {
 echo ‘<form class=”ib” action=”edit3.php” method=”post”>’;
 echo ‘<input type=”hidden” name=”command” value=”update”>’;
 echo ‘<input type=”hidden” name=”id” value=”‘, $row[‘id’], ‘”>’;
 echo ‘<div class=”td0″>’;
 echo $row[‘id’];
 echo ‘</div>’;
 echo ‘<div class=”td1″>’;
 echo ‘<input type=”text” name=”name” value=”‘, $row[‘name’], ‘”>’;
 echo ‘</div>’;
 echo ‘<div class=”td1″>’;
 echo ‘<input type=”text” name=”price” value=”‘, $row[‘price’], ‘”>’;
 echo ‘</div>’;
 echo ‘<div class=”td2″>’;
 echo ‘<input type=”submit” value=”更新”>’;
 echo ‘</div>’;
 echo ‘</form>’;
 echo ‘<form class=”ib” action=”edit3.php” method=”post”>’;
 echo ‘<input type=”hidden” name=”command” value=”delete”>’;
 echo ‘<input type=”hidden” name=”id” value=”‘, $row[‘id’], ‘”>’;
 echo ‘<input type=”submit” value=”削除”>’;
 echo ‘</form>’;
 echo “n”;
}
?>
<form action=”edit3.php” method=”post”>
<input type=”hidden” name=”command” value=”insert”>
<div class=”td0″></div>
<div class=”td1″><input type=”text” name=”name”></div>
<div class=”td1″><input type=”text” name=”price”></div>
<div class=”td2″><input type=”submit” value=”追加”></div>
</form>
<?php require ‘../footer.php’; ?>

▽261ページ login-output.php

foreach ($sql->fetchAll() as $row) {


foreach ($sql as $row) {

▽266ページ

 SQL文をexecuteメソッドで実行した結果は、fetchAllメソッド(p.212)で取得することができます。foreachループ(p.116)と組み合わせて、取得した結果を処理します。

foreach ($sql->fetchAll() as $row) {


 SQL文をexecuteメソッドで実行した結果を、foreachループ(p.116)を使って処理します(p.212)。

foreach ($sql as $row) {

▽273ページ customer-output.php

$sql=$pdo->prepare(‘update customer set name=?, address=?, ‘


$sql=$pdo->prepare(‘update customer set name=?, address=?, ‘.

▽275ページ

 いずれの場合も、検索結果が空ならば、ログイン名が重複している他のユーザーはいないということです。検索結果が空かどうかは、変数が空であるかどうかを調べるempty関数(p.226)を使います。引数に指定した変数や式が空であるとき、empty関数はTRUEを返します。

if (empty($sql->fetchAll())) {


 いずれの場合も、検索結果が空ならば、ログイン名が重複している他のユーザーはいないということです。検索結果が空かどうかは、変数や配列が空であるかどうかを調べるempty関数(p.226)を使います。引数に指定した変数や配列が空であるとき、empty関数はTRUEを返します。

if (empty($sql->fetchAll())) {

 検索結果の取得には、PDOStatementクラスのfetchAllメソッドを使います。fetchAllメソッドは、検索結果を配列で返します。検索結果が空ならば、空の配列を返します。

書式 fetchAll
PDOStatementの変数->fetchAll()

▽278ページ product.php

foreach ($sql->fetchAll() as $row) {


foreach ($sql as $row) {

▽279ページ detail.php

foreach ($sql->fetchAll() as $row) {


foreach ($sql as $row) {

▽281ページ

SQL文の実行結果をfetchAllメソッド(p.212)で取得し、foreachループを使って、商品情報を表示します。


SQL文の実行結果をforeachループを使って処理し(p.212)、商品情報を表示します。

▽296ページ favorite.php

foreach ($sql->fetchAll() as $row) {


foreach ($sql as $row) {

▽298ページ

foreach ($sql->fetchAll() as $row) {


foreach ($sql as $row) {

▽327ページ

fetchAll 212


fetchAll 275

※初版第1刷

15ページ サンプルデータの構成

chapter2 Chapter2のスクリプトを収録したフォルダ
chapter3 Chapter3のスクリプトを収録したフォルダ
chapter4 Chapter4のスクリプトを収録したフォルダ
chapter5 Chapter5のスクリプトを収録したフォルダ
chapter6 Chapter6のスクリプトを収録したフォルダ
chapter7 Chapter7のスクリプトを収録したフォルダ
header.php HTMLドキュメントの先頭部分
footer.php HTMLドキュメントの末尾部分
logo.png ページに表示するロゴ画像
style.css Webページの外観をよくするためのスタイルシート


chapter2 Chapter2のスクリプトを収録したフォルダ
chapter3 Chapter3のスクリプトを収録したフォルダ
chapter4 Chapter4のスクリプトを収録したフォルダ
chapter5 Chapter5のスクリプトを収録したフォルダ
chapter6 Chapter6のスクリプトを収録したフォルダ
chapter7 Chapter7のスクリプトを収録したフォルダ
chapter8 Chapter8のスクリプトを収録したフォルダ
header.php HTMLドキュメントの先頭部分
footer.php HTMLドキュメントの末尾部分
logo.png ページに表示するロゴ画像
style.css Webページの外観をよくするためのスタイルシート

30ページ phpフォルダの構成

chapter2 Chapter2のスクリプトを収録したフォルダ
chapter3 Chapter3のスクリプトを収録したフォルダ
chapter4 Chapter4のスクリプトを収録したフォルダ
chapter5 Chapter5のスクリプトを収録したフォルダ
chapter6 Chapter6のスクリプトを収録したフォルダ
chapter7 Chapter7のスクリプトを収録したフォルダ
chapter8 Chapter8のスクリプトを収録したフォルダ
header.php HTMLドキュメントの先頭部分
footer.php HTMLドキュメントの末尾部分
logo.png Webページに表示するロゴの画像
style.css Webページの外観を設定するためのスタイルシート
product.sql Chapter6で使用するSQLスクリプト
shop.sql Chapter7で使用するSQLスクリプト


chapter2 Chapter2のスクリプトを収録したフォルダ
chapter3 Chapter3のスクリプトを収録したフォルダ
chapter4 Chapter4のスクリプトを収録したフォルダ
chapter5 Chapter5のスクリプトを収録したフォルダ
chapter6 Chapter6のスクリプトを収録したフォルダ
chapter7 Chapter7のスクリプトを収録したフォルダ
chapter8 Chapter8のスクリプトを収録したフォルダ
header.php HTMLドキュメントの先頭部分
footer.php HTMLドキュメントの末尾部分
logo.png Webページに表示するロゴの画像
style.css Webページの外観を設定するためのスタイルシート
※「product.sql」は「chapter6」フォルダ、「shop.sql」は「chapter7」フォルダにそれぞれ移動して収録されています。

73ページ
Fig 変数に値を代入して利用する

$price=5;
echo 10 * $tanka, ‘円’;


$price=5;
echo 10 * $price, ‘円’;

196ページ all2.php
誤:<?php require ‘../footer.php’:?>
正:<?php require ‘../footer.php’;?>

256ページ Fig テーブル間の関係 右側1つめのテーブル
誤:customer(顧客)テーブル
正:purchase(購入)テーブル

271ページ customer-input.php  上から11行目
誤:<input type=test”
正:<input type=text

Mac OS Xにおけるファイルの書き込み許可5-7(p.158)と5-8(p.165)のサンプルが動作しない場合には、以下の操作を行った後に、サンプルを実行してみてください。XAMPP/htdocs/phpフォルダに対する、everyoneによるファイルの書き込みを許可します。①Finderで、アプリケーション/XAMPP/htdocsフォルダを開きます。②phpフォルダを右クリックして、[情報を見る]を選択します。③[phpの情報」ダイアログの[共有とアクセス権]で、everyoneのアクセス権を[読み/書き]にします。④ダイアログの右下にあるロックのアイコンをクリックして、ロックを外します。パスワードを求められたら入力して、[OK]を選択してください。⑤ダイアログの左下にあるギアのアイコンをクリックして、[内包している項目に適用]を選択します。確認ダイアログが表示されたら、[OK]を選択してください。

○Mac OS Xにおけるファイルの書き込み許可
5-7(p.158)と5-8(p.165)のサンプルが動作しない場合には、以下の操作を行った後に、サンプルを実行してみてください。XAMPP/htdocs/phpフォルダに対する、everyoneによるファイルの書き込みを許可します。

①Finderで、アプリケーション/XAMPP/htdocsフォルダを開きます。
②phpフォルダを右クリックして、[情報を見る]を選択します。
③[phpの情報」ダイアログの[共有とアクセス権]で、everyoneのアクセス権を[読み/書き]にします。
④ダイアログの右下にあるロックのアイコンをクリックして、ロックを外します。パスワードを求められたら入力して、[OK]を選択してください。
⑤ダイアログの左下にあるギアのアイコンをクリックして、[内包している項目に適用]を選択します。確認ダイアログが表示されたら、[OK]を選択してください。

○208ページ search-output.php
PHP5.3以前を使用する場合には、array関数(p.116)を使ってスクリプトの一部を変更してください。
変更前:$sql->execute([$_REQUEST[‘keyword’]]);
変更後:$sql->execute(array($_REQUEST[‘keyword’]));

○以下のスクリプトにおいて、内容を一部修正しております。
p.261, login-output.php
p.268, logout-output.php
p.270, customer-input.php
p.273, customer-output.php
p.283, cart-insert.php
p.291, cart-delete.php
p.293, favorite-insert.php
p.299, favorite-delete.php
p.300, favorite-show.php
※PHPでセッションを使用する場合には、session_start関数を呼び出します。この関数はHTMLなどを出力する前に実行する必要があるので、スクリプトの先頭で呼び出しています。

修正前
<?php require ‘../header.php’;?>
<?php require ‘menu.php’;?>
<?php
session_start();

修正後
<?php session_start();?>
<?php require ‘../header.php’;?>
<?php require ‘menu.php’;?>
<?php