ひぐぺん工房トップへ おかげさまで24周年!

ひぐぺん工房(松浦健一郎・司ゆき) - HigPen Works
・今までの仕事 ・書籍 ・最近の業務 ・対応可能言語 ・お見積

kiwi 『確かな力が身につくPHP「超」入門』 Q&A

以下の回答で問題が解決しなかった場合には、 こちらから ご連絡ください。

サンプルの動作

2017/03/18(2019/07/25追記)
Q.Mac OS Xにおけるファイルの書き込み許可(5-7, 5-8)
A.
Mac OS Xにおいて、5-7と5-8のサンプルが動作しない場合には、以下の操作を行った後に、サンプルを実行してみてください。XAMPP/htdocs/phpフォルダに対する、everyoneによるファイルの書き込みを許可します。
  1. Finderで、アプリケーション/XAMPP/htdocsフォルダを開きます(/Applications/XAMPP/xamppfiles/htdocsフォルダの場合もあります)。
  2. phpフォルダを右クリックして、[情報を見る]を選択します。
  3. [phpの情報]ダイアログの[共有とアクセス権]で、everyoneのアクセス権を[読み/書き]にします。
  4. ダイアログの右下にあるロックのアイコンをクリックして、ロックを外します。パスワードを求められたら入力して、[OK]を選択してください。
  5. ダイアログの左下にあるギアのアイコンをクリックして、[内包している項目に適用]を選択します。確認ダイアログが表示されたら、[OK]を選択してください。
(2019/07/25追記)
macOS 10.13.6とXAMPP 7.3.7-1を使用して、5-7と5-8のサンプルが動作することを確認しました。新しいXAMPPのインストールは、次の手順で行いました。
  1. Finderで、アプリケーション/XAMPP/htdocsフォルダを開き、phpフォルダをデスクトップにコピーします。
  2. アプリケーション/XAMPP/uninstall.appを実行して、古いXAMPPをアンインストールします。
  3. 新しいXAMPPのダウンロードファイルを実行し、指示に従ってインストールします。
  4. Finderで、デスクトップにコピーしておいたphpフォルダを、アプリケーション/XAMPP/htdocsフォルダにコピーします。
  5. XAMPPを起動し、本書の手順に沿って、5-7と5-8のサンプルを実行します。

2017/03/18
Q.配列の初期化(6-4)
A.
6-4などのスクリプトにおいて、PHP5.3以前を使用する場合には、array関数(p.116)を使ってスクリプトの一部を変更してください。

2017/04/29
Q.style.cssの読み込み(3-2)
A.
p.57のheader.phpには、2つのlinkタグがあります。

(1) <link ・・・・ "../style.css">
(2) <link ・・・・ "style.css">

(1)は全てのchapterで共通に使用します。
(2)は一部のchapterのみ(chapter7)で使用します。
(p.52のTableをご参照ください。)

例えばchapter7のindex.phpは、2つのstyle.cssを読み込みます。
以下にフォルダとファイルの構成を示します。

style.css((1)のlinkタグで読み込み)
chapter7
  style.css((2)のlinkタグで読み込み)
  index.php(読み込み先のPHPファイル)
  ...

(1)の../style.cssは、index.phpの1つ上のフォルダのstyle.cssを読み込みま す。
(2)のstyle.cssは、index.phpと同じフォルダのstyle.cssを読み込みます。

2017/07/04
Q.Apache再起動時のAH00558というメッセージ(p.315)
A.
Apacheの再起動時に以下のメッセージが出ることがあります。

AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 10.0.2.15. Set the 'ServerName' directive globally to suppress this message

この際に、chapter6のデータベースを使ったサンプルを実行してもサイトに表示されない、というご質問を頂きました。
確認したところ、Apacheの起動時に上記のメッセージが出ますが、chapter6のサンプルは支障なく動作するようです。
そこで、下記をお試し頂けましたら幸いです。

(1) Git bashに戻り、vagrant haltとvagrant upを実行する(p.318)。
(2) sudo service apache2 restartを実行する(p.315)。
もし、
no listening sockets available, shutting down
と表示される場合には、下記のコマンドを実行後、再び(1)を実行してみてください。
sudo service nginx stop
(3) ブラウザでhttp://localhost:8080/php/chapter2/welcome.phpを開く。
もし動かない場合には、Apacheの起動に失敗していると思われます。(2)で出力されたメッセージの全文を教えて頂けましたら幸いです。
(4) ブラウザでhttp://localhost:8080/php/chapter6/all2.phpを開く。
もし動かない場合には、Apacheの起動には成功しているが、mysqlのインストール(p.315)に失敗していると思われます。mysqlのインストール時にエラーメッセージが出ていましたら、教えて頂けましたら幸いです。

2018/01/26
Q.all2.phpの動作(p.195)
A.
all2.phpに関して、データベースを初期化していない場合、「Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\php\chapter6\all2.php…」というエラーが出ることがあります。この場合の問題は、「データベースに接続はできているが、productテーブルの情報を正しく取得できていない」ことです。以下をお試し頂けましたら幸いです。

(1) p.190からの手順に沿って、phpMyAdminを用いて「select * from product;」を実行した際に、商品の一覧が正しく表示されることをご確認ください。
(2) (1)において、もし商品の一覧が表示されない場合には、p.182からの手順に沿って、phpMyAdminを用いてproduct.sqlを実行し、再度(1)をお試しください。
(3) (1)において、もし商品の一覧が表示される場合には、p.195からの手順に沿って、ブラウザからall2.phpを開いてみてください。

2018/10/04
Q.product.sqlを入力欄に貼り付ける(p.183)
A.
以下のような手順で操作します。
(1) テキストエディタでproduct.sqlを開きます。例えばエクスプローラでproduct.sqlを右クリックし、「プログラムから開く」→「メモ帳」をクリックします。「メモ帳」の代わりに、使い慣れているテキストエディタがあれば、そちらを使用することもできます。
(2) メモ帳にproduct.sqlの内容が表示されます。メニューの「編集」→「すべて選択」に続いて、「編集」→「コピー」を実行します。キーボードでCtrl-A、Ctrl-Cを続けて入力しても、同じ操作ができます。
(3) phpMyAdminのSQL入力欄において、Ctrl-Vを入力して、SQLを貼り付けます。
(4) 入力欄の右下にある「実行」をクリックして、SQLを実行します。

2019/01/15
Q.MacにおけるPHPスクリプトの実行(p.32)
A.
Mac(macOS/Mac OS X)でPHPスクリプトを実行する場合、Webブラウザ(Safari)に入力するURL(アドレス)は、本書に記載してあるWindows用と同じURLを入力してください。例えばp.32の場合、次のURLを入力します。

http://localhost/php/chapter2/welcome.php

本書p.32のNoteで言及しているのは、

「MacのWebブラウザに『http://localhost/フォルダ名/ファイル名』というURLを入力したときにアクセスできるファイルは、ディスク上の『Applications/XAMPP/htdocs/フォルダ名/ファイル名』というファイルである」

ということです。Webブラウザに入力するURLは、Macにおいても、本書に記載してあるWindows用と同じURLです。

2019/06/08
Q.最初のPHPスクリプトが実行できない(p.32)
A.
最初のPHPスクリプト(p.32)が実行できない場合、すでにお試し頂いているかもしれませんが、以下をお試しください。
(1) p.27の手順に沿って、XAMPPの紹介ページ(http://localhost/)が表示できることをご確認ください。
(2) p.29の手順に沿って、本書のダウンロードファイルを指定のフォルダに展開してください。
(3) p.32の手順に沿って、最初のPHPスクリプトを実行してください。
(4) 実行できない場合、URL(http://localhost/php/chapter2/welcome.php)が正しいことをご確認ください。
(5) Macについては、こちらのQ&Aもご参照ください。
(6) p.33のようなエラーが表示される場合、同ページの手順に沿って、Apacheの起動やスクリプトの展開先をご確認ください。
(7) それでも実行できない場合、XAMPPのバージョンを変えてみてください。本Q&A作成時には、Windows10/XAMPP7.2.9で動作を確認しました。
(8) それでも実行できない場合、もし別のPCをお持ちでしたら、そちらのPCを使ってお試しください。例えばMacで動かない場合にはWindowsを試す、Windows7で動かない場合にはWindows10で試すといったように、異なるOSで試すことがお勧めです。

2020/02/09
Q.CSSによる表組み(Chapter6)
A.
Chapter6のサンプルを正常に動作させるには、以下の2種類のCSS(スタイルシート)を配置しておく必要があります。
(1) php/style.css
(2) php/chapter6/style.css

上記のファイルは本書のダウンロードファイルに含まれています。もしPHPスクリプトを手で入力する場合には、これらのファイルをダウンロードファイルからコピーしてください。

CSSを配置した後、ブラウザでページを表示する際には、最初にShift+F5キーかShift+Ctrl+Rキーを入力し(Chromeの場合)、キャッシュを含めてページを更新してください。通常のF5キーやCtrl+Rキーによるページの更新では、ブラウザがキャッシュしたCSSを使ってしまい、新たに配置したCSSを読み込まないために、配置したCSSが有効にならない場合があります。

例えばedit2.php(p.245)について、上記(2)のCSSが欠けている状態で実行すると、正しく表組みが行われません。このスクリプトは、複数の入力フォームを表組みするために、(2)のCSSを使っているためです。なお、スクリプト内の「class="ib"」のような部分は、適用するスタイルを選択するための記述です。詳しくはCSSに関するWebサイト等をご覧いただけましたら幸いです。

CSSに関する参考Webサイトの例:
W3CのCSS仕様(英語)
とほほのCSS入門

環境構築

2017/04/13
Q.vagrantにおけるMySQLのインストール(8-2)
A.
本書p.315において、vagrantにおけるMySQLのインストールが上手く動作しない場合には、以下のコマンドを実行してみてください。このコマンドは、apt-getコマンドでインストールするパッケージのリストを更新します。
vagrant...$ sudo apt-get update
続いて、本書に掲載されている以下のコマンドを実行し、MySQLのインストールを試みてください。
vagarnt...$ sudo apt-get install -y mysql-server

2018/09/10
Q.Apacheの起動の確認(2-2)
A.
本書p.27において、ブラウザでURL「http://localhost/」を開いたときに、「このサイトは安全ではありません」と表示される場合には、以下のことをお試しください。

(1) 「このサイトは安全ではありません。」の画面に、「詳細」や「詳細情報」といったリンクが表示されている場合、クリックしてみてください。そして、このサイトを強制的に表示する、といったコマンドが表示された場合には、実行してみてください。
(2) 別のブラウザを使用してみてください。本書は主にChromeで動作を確認していますが、Firefox、Edge、Safariといった他のブラウザもお試しください。
(3) お使いのセキュリティソフトウェアとの相性も考えられます。Webの検索エンジンで「お使いのソフトウェア名 このサイトは安全ではありません」を検索して、同様の問題に対する解決策が記載されていないどうか、ご確認ください。

2018/09/10現在、Windows10において、最新版のXAMPP(バージョン7.2.9)を使い、Chrome/Firefox/Edgeで試したところ、「http://localhost/」は無事に開くことができました。
なお、XAMPPのインストール時に、Apacheに対してネットワーク上の通信を許可するかどうかを決める下記のダイアログが表示された場合には、「プライベートネットワーク」をチェックし、「アクセスを許可する」をクリックしてください。

2019/07/10(2019/10/02更新)
Q.vagrantにおけるPHPのインストール(8-2)
A.
本書p.313において、最初のサンプルスクリプトが上手く実行できない場合、PHPのインストールに失敗している可能性があります。以下をお試しください。

(1) Vagrantfile(本書p.310)を以下のように変更します。この変更により、Linux(Ubuntu)のバージョンが14.04から18.04に変わります。
変更前「trusty64」
変更後「bionic64」

(2) bootstrap.sh(本書p.311)を以下のように変更します。この変更により、PHPのバージョンが7.0から最新版(7.3など)に変わります。
変更前「apt-get install -y php7.0 php7.0-json php7.0-mysql libapache2-mod-php7.0」
変更後「apt-get install -y php php-json php-mysql libapache2-mod-php」

(3) 以上を変更した後に、以下を実行します。「vagrant destroy」については、本書p.314をご覧ください。
$ vagrant destroy
$ vagrant up

(4) あとは本書p.313以下と同じ手順で操作してください。本書p.315において、「vagrant ssh」実行時に表示されるLinuxのバージョンは「Ubuntu 18.04.…」に変わります。

(5) mysql-serverは本書p.315と同じ手順でインストールできますが、パスワードを設定するダイアログは表示されません。サンプルデータベースを構築する操作は、以下のように変更してください。
変更前「mysql -u root -ppassword < /var/www/html/php/chapter7/shop.sql」
変更後「sudo mysql -u root < /var/www/html/php/chapter7/shop.sql」

以上の手順は、以下の環境で動作を確認しました。

訂正と補足

2017/03/18
Q.fetchAll(Chapter6, 7)
A.
SQL文の実行結果を処理する際に、本書ではPDOStatementクラスのfetchAllメソッドを使用しています。
foreach ($sql->fetchAll() as $row) {
一方、SQL文の実行結果はPDOStatementインスタンスに格納されるため、下記のように記述することができます。
foreach ($sql as $row) {
本書のサンプルに関しては、より簡潔な後者の記述が適していたと存じます。誠に申し訳ございません。該当サンプルは下記の通りです。
下記のような場合にはfetchAllメソッドが活用できます。

2017/03/18
Q.セキュリティ
A.
セキュリティに関しては、p.65でhtmlspecialchars関数について、p.227でSQLインジェクションについて触れておりますが、本書では詳細には取り扱っておりません。またp.65で触れておりますように、サンプルにおいてセキュリティ対策を省略しております。誠にお手数をおかけ致しますが、実務で活用される場合には、セキュリティ対策について別途追加で学んで頂けましたら幸いです。

2017/03/18
Q.session_start(Chapter7)
A.
session_start関数はHTMLを出力する前に呼び出す仕様ですが、サンプルが仕様に沿っておりませんでした。誠に申し訳ございません。
本書で使用するXAMPPでは、修正前の状態でも動作します。MAMPを使用する場合には、動作しない場合があるようです。
該当サンプルは以下の通りです。
修正方法は下記の通りです。session_start関数をスクリプトの冒頭で呼び出すように修正します。

2017/03/24
Q.trタグ内のformタグ(Chapter6)
A.
HTMLの仕様では、trタグ内でformタグを使うことはできませんが、サンプルが仕様に沿っておりませんでした。誠に申し訳ございません。
ブラウザによっては修正前の状態でも動作します(例:Chrome、Safari、Edge)。
該当サンプルは以下の通りです。
修正方法としては、tableタグを使わずに、CSSを用いて表のようなレイアウトを実現する方法があります。以下は6-6のupdate-input.phpの修正例です。この修正例では簡単のため、外部のCSSファイルは使わずに、style属性にスタイルを直接記述しています。
<?php require '../header.php'; ?>
<div style="display:table;">
	<div style="display:table-row;">
		<div style="display:table-cell; text-align:center;">商品番号</div>
		<div style="display:table-cell; text-align:center;">商品名</div>
		<div style="display:table-cell; text-align:center;">商品価格</div>
	</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" style="display:table-row;">';
	echo '<input type="hidden" name="id" value="', $row['id'], '">';
	echo '<div style="display:table-cell;">';
	echo $row['id'];
	echo '</div>';
	echo '<div style="display:table-cell; padding:5px;">';
	echo '<input type="text" name="name" value="', $row['name'], '">';
	echo '</div>';
	echo '<div style="display:table-cell; padding:5px;">';
	echo ' <input type="text" name="price" value="', $row['price'], '">';
	echo '</div>';
	echo '<div style="display:table-cell; padding:5px;">';
	echo '<input type="submit" value="更新">';
	echo '</div>';
	echo '</form>';
	echo "\n";
}
?>
</div>
<?php require '../footer.php'; ?>

2018/01/21追記

上記とは少し異なる方法で、表のようなレイアウトにするサンプルを作成しました。このZIPファイル内のファイル(style.css, update-input.php, edit.php, edit2.php, edit3.php)を、サンプルのphp\chapter6フォルダ以下に展開(上書き)してお使いください。

2017/05/09
Q.delete-input.php(6-7)
A.
掲載プログラムの一部に,が抜けている箇所がありました。誠に申し訳ございません。
以下は修正前のプログラムです。
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>';

2017/05/20
Q.customer-output.php(7-3)
A.
掲載プログラムの一部に.が抜けている箇所がありました。誠に申し訳ございません。
以下は修正前のプログラムです。
$sql=$pdo->prepare('update customer set name=?, address=?, '
'login=?, password=? where id=?');
以下は修正後のプログラムです。
$sql=$pdo->prepare('update customer set name=?, address=?, '.
'login=?, password=? where id=?');

2017/10/10
Q.どの項目もチェックしなかった場合への対応(4-7)
A.
Noteで言及しているスクリプトの書き換えは、具体的にはp.129のchecks-output.phpを、以下のように変更します。
<?php require '../header.php'; ?>
<?php
if(isset($_REQUEST['genre'])){
    foreach ($_REQUEST['genre'] as $item) {
        echo '<p>', $item, '</p>';
    }
}
echo 'に関するお買い得情報をお送りさせて頂きます。';
?>
<?php require '../footer.php'; ?>

2018/11/24
Q.update-input.phpの実行結果(第2刷以降、p.231)
A.
「update-input.phpを実行しても、p.231に掲載したような画面にならない?」というお問い合わせを頂いたので、確認してみました。以下が実行画面です。Windows 10 Home 64bit上で、XAMPP7.2.9-0とChrome70.0.3538.102を使用しました。

この環境においては、本書に掲載したような画面になるようでした。お使いのOSやブラウザが違う場合、表示が多少異なる可能性はあります。
なおp.230の説明のように、上記の画面は、HTMLのdivタグと、スタイルファイル(chapter6\style.css)を使って作成しています。このupdate-input.phpでは、複数のformタグを使いますが、「tableタグの内部にformタグを配置すること」がHTMLの文法で禁止されているため、tableタグではなくdivタグを使いました。
他のサンプル、例えばp.238のdelete-input.phpなどでは、divタグではなくtableタグを使っています。これらのサンプルではtableタグの内部にformタグを配置しないので、tableタグを使ってもHTMLの文法に違反しないためです。簡単に表を作ることができるので、これらのサンプルではtableタグを使っています。

最終更新 2020/02/15
トップページへ
©ひぐぺん工房 禁無断転載
動画講座「 AIへまっしぐら! Pythonアニマルズ 」 最新刊『 AWSでつくる AIプログラミング入門 』
このサイトはリンクフリーです。 このサイトはChromeで動作検証しています。ブラウザにかかわらず表示に乱れがありましたらどうぞお知らせ下さい。メールを送る