ひぐぺん工房トップへ 最新サイトはこちら

ひぐぺん工房(松浦健一郎・司ゆき) - HigPen Works
移行先の新ひぐぺん工房ウェブサイトをどうぞご覧ください。
・今までの仕事 ・書籍 ・最近の業務 ・対応可能言語

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

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

サンプルの動作

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

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/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を実行します。

環境構築

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

訂正と補足

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'; ?>

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/10/04
トップページへ
©ひぐぺん工房 禁無断転載
最新刊『 100問でわかるPython 』
このサイトはリンクフリーです。リンクについて
このサイトはChromeで動作検証しています。ブラウザにかかわらず表示に乱れがありましたらどうぞお知らせ下さい。メールを送る