PHP:プロになるためのPHPプログラミング入門 9

公開:2026.05.27(水) 07:33

プロになるためのPHPプログラミング入門 9

以下書籍に付属するサンプルの実行環境を構築する。
プロになるためのPHPプログラミング入門」(ISBN 978-4-7741-4972-1)

環境は以下記事のものを使用
PHP:プロになるためのPHPプログラミング入門 サンプル環境構築

PHP:8.3.30
MySQL:8.0.46

1.6.4 セッション管理を行うアプリケーション (P.77)

サンプルを実行するも当然エラーになる。
http://localhost:8080/prophp_sample/ppa/p16sessq.php

Fatal error: Uncaught TypeError: PpPage::display(): Argument #2 ($elem) must be of type array, stdClass given, called in /var/www/prophp_sample/www/ppa/p16sessa.php on line 36 and defined in /var/www/prophp_sample/www/ppa/ppPage.php:26 Stack trace: #0 /var/www/prophp_sample/www/ppa/p16sessa.php(36): PpPage->display('p16sessa.html', Object(stdClass)) #1 {main} thrown in /var/www/prophp_sample/www/ppa/ppPage.php on line 26

※ 書籍では "p41sassq.php" となっているが "p16sessa.php" の誤りを思われる。

◆ リスト1-17 質問画面テンプレート (p16sessq.php)
オブジェクトを配列に変更、
HTML_Template_Flexy_Element オブジェクトを渡しているところは単純に値のみ配列にセットするようにした。

修正前:
$dobj = new stdClass();
$dobj->qno = (string)($qno + 1);
$dobj->qstr = $qmsg[$qno][0];
$elem['a1'] = new HTML_Template_Flexy_Element;
$elem['a1']->setValue($qmsg[$qno][1]);
$elem['a2'] = new HTML_Template_Flexy_Element;
$elem['a2']->setValue($qmsg[$qno][2]);
if($qno >= $qcnt){
	$elem['a1f'] = new HTML_Template_Flexy_Element;
	$elem['a1f']->attributes['action'] = 'p16sessa.php';
	$elem['a2f'] = new HTML_Template_Flexy_Element;
	$elem['a2f']->attributes['action'] = 'p16sessa.php';
}
修正後:
$dobj = [
  'qno' => (string)($qno + 1),
  'qstr' => $qmsg[$qno][0],
  'a1' => $qmsg[$qno][1],
  'a2' => $qmsg[$qno][2],
];

if ($qno >= $qcnt) {
	$dobj = array_merge($dobj, [
    'a1f' => [
      'action' => 'p16sessa.php',
    ],
    'a2f' => [
      'action' => 'p16sessa.php',
    ],
	]);
}

◆ リスト1-15 質問画面テンプレート (p16sessq.html)
formのaction属性、inputのvalue属性を追加した。

修正前:
<p><span>Q{qno:hs}</span>{qstr:hs}</p>
<form name="a1f" method="post" action="p16sessq.php">
<input type="submit" name="a1">
<p><span>Q{qno:hs}</span>{qstr:hs}</p>
<form name="a1f" method="post"

修正後:
<p><span>Q{{ qno }}</span>{{ qstr }}</p>
<form name="a1f" method="post" action="{{ a1f.action }}">
<input type="submit" name="a1" value="{{ a1 }}">
<form name="a2f" method="post" action="{{ a2f.action }}">
<input type="submit" name="a2" value="{{ a2 }}">

◆ リスト1-18 結果画面プログラム (/ppa/p16sessa.php)
修正前:
$dobj = new stdClass();
$dobj->ans = $amsg[$ans];
$dobj->ok = $ans ? true : false;

修正後:
$dobj = [
	'ans' => $amsg[$ans],
	'ok' => $ans? true: false,
];

◆ 結果画面テンプレート (p16sessa.html)
修正前:
<span>{ans:hs}</span>{if:ok}をおすすめいたします。{end:}

修正後:
<span>{{ ans }}</span>{% if ok %}をおすすめいたします。{% endif %}

参考 (ソース全体)

◆ p16sessa.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>proPHPトラベル</title>
<style type="text/css">
<!--
body { margin:0; padding:0; font-family: Osaka, メイリオ, sans-serif; }
div { margin:20px; }
span { font-size:120%; color:#E61980; padding-right:5px; }
h1 { margin:0; padding:10px; background-color:#0269A8; color:#FFFFFF; }
h2 { border-left: 12px solid #264C73; border-bottom: 2px solid #264C73; padding-left:10px; }
#fm{ padding:20px; background-color: #DCE6F0; border: 1px solid #264C73; }
-->
</style>
</head>
<body>
<h1>proPHPトラベル</h1>
<div>
<h2>おすすめツアー検索結果</h2>
<div id="fm">
<span>{{ ans }}</span>{% if ok %}をおすすめいたします。{% endif %}
</div>
<p><a href="p16sessq.php">おすすめツアー検索にもどる</a></p>
</body>
</html>

◆ p16sessq.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>proPHPトラベル</title>
<style type="text/css">
<!--
body { margin:0; padding:0; font-family: Osaka, メイリオ, sans-serif; }
input {  padding:2px; border: 1px solid #14191E; background: #1980E6; color:#FFFFFF;
font-size: 120%; font-weight: bold; }
input:hover { cursor: pointer; background: #3399FF;}
div { margin:20px; }
span { font-size:120%; color:#E61980; padding-right:5px; }
h1 { margin:0; padding:10px; background-color:#0269A8; color:#FFFFFF; }
h2 { border-left: 12px solid #264C73; border-bottom: 2px solid #264C73; padding-left:10px; }
form { display:inline; }
#fm{ padding:0 20px 20px 20px; background-color: #DCE6F0; border: 1px solid #264C73; }
-->
</style>
</head>
<body>
<h1>proPHPトラベル</h1>
<div>
<h2>おすすめツアー検索</h2>
<p>いくつかの質問に答えていくと、あなたにオススメのツアーを選びます。</p>
<div id="fm">
<p><span>Q{{ qno }}</span>{{ qstr }}</p>
<form name="a1f" method="post" action="{{ a1f.action }}">
<input type="submit" name="a1" value="{{ a1 }}">
</form>
<form name="a2f" method="post" action="{{ a2f.action }}">
<input type="submit" name="a2" value="{{ a2 }}">
</form>
</div>
</div>
</body>
</html>

◆ p16sessa.php
<?php
//!	セッション管理を行うサンプル	proPHPトラベルツアー結果画面
require_once 'ppPage.php';
require_once 'ppSession.php';
//	回答データ
$amsg = array(	'エラーです',
				'西表島ジャングルツアー',	'ボルネオ島鍾乳洞ツアー',
				'夏の熱海温泉ツアー',		'ボラボラ島リゾートツアー',
				'冬の八ヶ岳スキーツアー',	'スイス氷河特急ツアー',
				'紋別流氷ツアー',			'南極クルーズツアー'	);
$ans = 0;

//	セッション管理クラス
$sess = new PpSession('SESSQANDA');
if($sess->sessionExists()){
	$sess->start();
	if($_SERVER['REQUEST_METHOD'] === 'POST'){
		$ans = (int)$sess->get('ans');
		if(isset($_POST['a1'])){
			$ans |= (1 << 2);
		}

		if($ans >= 0 && $ans <= 7){
			$ans ++;
		}
	}
	//	セッション終了処理
	$sess->endProc();
}

//	画面表示処理
$dobj = [
	'ans' => $amsg[$ans],
	'ok' => $ans? true: false,
];
$page = new PpPage;
$page->display('p16sessa.html', $dobj);

◆ p16sessq.php
<?php
//!	セッション管理を行うサンプル	proPHPトラベルツアー質問画面処理
require_once 'ppPage.php';
require_once 'ppSession.php';
//	質問データ
$qmsg = array(	array(	'どこか遠くへ行きたい?', '遠くへ行きた~い', '近場がいいな~'),
				array(	'海と山どっちが好き?', '海が好き', '山が好き'),
				array(	'暑いのと寒いのとでは、どっちが苦手?', '暑いのは苦手', '寒いのは苦手')	);
$ans = 0;					//	回答
$qno = 0;					//	質問番号0~2
$qcnt = count($qmsg) - 1;	//	質問数

//	セッション管理クラス
$sess = new PpSession('SESSQANDA');
if($_SERVER['REQUEST_METHOD'] === 'POST'){
	$sess->start();
	$ans = (int)$sess->get('ans');
	$qno = (int)$sess->get('qno');
	if($qno >= 0 && $qno < $qcnt){
		if(isset($_POST['a1'])){
			$ans |= (1 << $qno);
		}
		$qno ++;
	}
	$sess->set('ans', $ans);
	$sess->set('qno', $qno);
}
else{
	if($sess->sessionExists()){
		$sess->start();
		$sess->endProc();
	}
}

//	画面表示処理
$dobj = [
  'qno' => (string)($qno + 1),
  'qstr' => $qmsg[$qno][0],
  'a1' => $qmsg[$qno][1],
  'a2' => $qmsg[$qno][2],
];

if ($qno >= $qcnt) {
	$dobj = array_merge($dobj, [
    'a1f' => [
      'action' => 'p16sessa.php',
    ],
    'a2f' => [
      'action' => 'p16sessa.php',
    ],
	]);
}
$page = new PpPage;
$page->display('p16sessq.html', $dobj);

◆ ppSession.php
そのまま使用可


0 件のコメント:

その他の記事