PHPサーバーサイドプログラミング パーフェクトマスター

概 要

PHPは、Webアプリ開発に広く使われているプログラミング言語です。PHPのメリットのひとつは、情報が多く初心者に優しいことですが、それは情報が多すぎて何から学べばよいかわからなくなってしまう危険と隣り合わせということです。本書は、プログラミング初心者のために、プログラムを作りながらPHPの基礎を対話形式でわかりやすく解説します。PHPの学習をコツコツと一歩ずつ、スムーズにすすめたい人におすすめします。

著者 金城俊哉
価格 本体3400円(税別)
ISBN 978-4-7980-4486-6
発売日 2015/10/27
判型 B5変
ページ数 764
CD/DVD
ダウンロード
表紙イメージ
購入 アマゾンで購入する
楽天で購入する

※リンク先によっては、販売ページが用意されていないことがあります。あらかじめご了承ください。

新しいウィンドウで開く 書籍購入のご案内

サポート

サポート情報は以下からご参照下さい。

サポート情報へのリンク

目次

Chapter 1 PHPの概論、まずはここから始めましょう

1.1 PHPで何ができるの?

1.1.1 インターネットWeb、クライアントサイドとサーバーサイド

1.1.2 Webはインターネット上の基幹技術

1.1.3 同じWebページを扱うのにクライアントとサーバー側では異なる技術が使われる

HTMLがあるのになぜPHPが必要なのか

1.1.4 ところでPHPでプログラミングすると何ができるの?

PHPプログラミングはこうやって動作する

1.2 PHPってどんな言語なの?

1.2.1 PHPの特徴

書いたらすぐに実行できるインタープリター型言語

1.2.2 PHPの特徴はわかったけどプログラムはどうやって作るの?

そもそもインタープリター型って遅くない?

PHPプログラムはこうやって作る

1.3 ペアプログラミング方式でPHPを完全習得

ミドルエンジニアとベテランプログラマーによるペアプロを誌上で再現

気になるところから読み始めたっていいんです!

Chapter 2 開発環境を用意しましょうか、

Windows、それからMacにも

2.1 マシンにサーバー環境を構築する、まずはWindowsから

2.1.1 Webサーバーとアプリケーションサーバーを一体化、それはXAMPP

XAMPP、タダで使える上に面倒な設定もいらないなんて

2.1.2 XAMPPをダウンロード、即インストール

XAMPPのWebサイトからダウンロードする

XAMPPのインストール

2.1.3 XAMPPのコントロールパネルでApache/PHPを起動/終了

ローカルマシンでApache HTTP Server/PHPを稼働させよう

WebブラウザーでApacheにアクセスする

Tips ほかのパソコンからサーバーにアクセスできるようにする

2.2 サーバー環境を構築する、今度はMacに

2.2.1 Mac版XAMPPを入手してインストールする

Mac版XAMPPをダウンロード、そしてインストール

XAMPPのコントロールパネルで操作する

2.3 テキストエディターの用意とPHPの設定ファイルの編集

2.3.1 Windows用のテキストエディターをダウンロードしよう

Notepad++のダウンロードとインストール

Memo そもそもBOMって何?

2.3.2 Macは「テキストエディット」が使える!

フォーマットを「標準テキスト」に設定する

[環境設定]でUTF-8を指定しておく

2.3.3 このままじゃ使えない、ならばPHPの設定ファイルを編集

文字化けの防止とかタイムゾーンの設定とか

FAQ

Chapter 3 PHP言語仕様

3.1 基本的な構文? いまさら? でもソースファイルを

作らなきゃ始まらない

3.1.1 いまさらの「Hello world!」なのです

print命令で文字を書き出す

Memo PHPの書き方

3.1.2 PHPを専用のソースファイルに書いてみる

フォームに入力されたデータを受け取って処理を行う

Memo エラー発生!

Memo HTMLエスケープの必要性

3.2 変数? いやいや楽勝でしょ

3.2.1 PHPの変数って何が違うの?(変数定義)

変数を用意する

前回のプログラムや変数を使用したものに書き換える

Memo 変数名の付け方

Hint 変数のデータ型

変数の再定義

計算結果の代入

3.2.2 変数の値を変数名として使うって? 後々使えそうだね(可変変数)

変数の値を変数名として利用する

Hint 定数の値を変えようとするとどうなる?

3.2.3 変えてはならない、だから定数

当たり前の値、それが定数(定数定義)

Hint const命令

Memo 最初っから決まってるのね、その値(定義済み定数)

3.3 データの種類を分けるのですね、いわゆるPHPの型ですね

3.3.1 まずは基本のスカラー型から

スカラー型に含まれるデータ型

小数点の位置が動くのですね(浮動小数点型)

アルファベットも漢字もひらがなも(文字列型)

Memo PHPのエスケープシーケンス

変数の中身を展開したい場合は「"」で囲む

yesかnoが何でtrueとfalseなのかいつも疑問です(論理型)

Hint 浮動小数点の仕組み

はいはい、何にもないのも型なんですね(NULL)

Hint 一部の要素にだけキーを指定する例

3.3.2 PHPの配列、クライアントとの通信に必須のデータ構造

配列を作成する

Memo PHPの配列はハッシュテーブルで管理されている

3.3.3 キーと値のペア、それがハッシュテーブル

配列のインデックスに名前を付けたよ

Tips 配列要素の削除

3.3.4 配列を配列の中に入れれば階層構造のデータができるぞ!(多次元配列)

配列の配列って?

3.3.5 いやいや、その型では使えません…そっかキャストか(データ型の変換)

データ型の自動変換(暗黙的な型変換)

強制的な型変換(キャスト)

Hint 16進数形式の表記や指数表記の文字列のキャスト

3.4 何をいまさら演算子、でもPHPの演算子だよ

3.4.1 だよね、PHPにおける「式」と「演算」について考えてみなきゃね

オペランドは操作される側でオペレーターは操作する側

3.4.2 PHPの演算子、まとめて覚える

算術演算子

インクリメント演算子(++)とデクリメント演算子(― ―)

Memo 単項プラス演算子(+)、単項マイナス演算子(-)

Hint 複数のオペランドがある場合の処理

Memo 配列同士の加算

xはyである(代入演算子と複合代入演算子)

Memo 複合代入演算子の結合順序

参照を代入すると2つの変数の中身が同じになるって?

Memo 配列のコピーと参照のコピー

「等しい?」「○○以上?」「××以下?」(比較演算子)

Hint 関係式のパターン

「優柔不断な演算子」(論理演算子)

「ビットを並べ替えることに何の意味があるんですか?」(ビット演算子)

シフト演算子

Memo 演算子の優先順位

Chapter 4 PHPでのアルゴリズムの制御と関数

4.1 アルゴリズムはたった3つの制御構造で実現、PHPでもこれが基本

4.1.1 ロジックの流れをわけるのだ(if文)

条件式で処理を分岐するif文

Memo if文の3つの「形」

Memo { }の省略

Hint 論理演算子で複数の条件を設定する

Memo if...else文

4.1.2 10通りの分岐だって楽勝(switch文)

変数に格納したポイント数に応じてメッセージを表示する

Memo switch文の構造と仕組み

Hint case句の複数定義

4.1.3 ループで回せ(for、while、do-while)

きっちり10回、同じ処理を繰り返せばいいんですね(for文)

Memo 同じ処理を繰り返し実行する

Memo for文

Hint for文による処理の流れ

Hint カウンター変数の仕組みと使い方

ループの中でループを回すんですか、そうですか

4.1.4 処理を繰り返すけど、回数はわからないんですよね(while文)

変数の値が100に達した時点で繰り返しを終了する

Memo while文の書き方と処理の流れ

Memo while文で指定した回数の処理を繰り返す際の注意点

falseが返っても必ず1回は処理しなきゃならないんです(do...while文)

Hint while文における{ }の省略

Memo do...while文

4.1.5 無駄な処理はカット!(breakとcontinue)

指定した条件に達した時点で100回繰り返しのfor文を中断する

Memo break文でループを中断

OnePoint 本編のfor文とwhile文の構造

continue文で特定の回の処理をスキップ

Memo continue文

4.1.6 配列専用のループを使うとラクですね(foreach)

foreachで配列要素に順番にアクセス

4.1.7 あそこへ飛んでって!(goto)

gotoで飛んでいきな

Memo goto文の使用にあたっての注意

4.2 関数、それもアルゴリズム

4.2.1 ま、ふつうの関数定義ですね(関数定義と呼び出し)

引数をパラメーターで受け取り結果を戻り値で返す

Memo 関数定義はfunction文で

Hint 関数名の付け方について

Memo function文における注意点など

function文で関数を定義してみよう

関数の中で別の関数を呼び出すんですか?

Memo 関数を定義する位置

Memo PHPにはブロックレベルのスコープは存在しない

4.2.2 そこは圏外! それとも圏内? スコープの落とし穴

いわゆる変数の生息領域ですな(グローバルスコープ/ローカルスコープ)

グローバル変数を関数内部で使いたい

4.2.3 よく使う関数は外部ファイルにまとめちゃうんですね

外部ファイルで定義した関数を呼び出すぞ

え? インクルードしたファイルにもスコープがあるなんて!

Memo パスの設定

Memo 外部ファイルを読み込む命令

4.2.4 この値、処理が終わったあとでも使いたい(静的変数)

処理が終わっても値を保持したい

OnePoint 「>?」の省略

4.3 パラメーターと戻り値、使い方にはいろいろあるぞ

4.3.1 忘れたときのデフォルトパラメーターです

引数を指定しなければパラメーターのデフォルト値が使われるのですね

4.3.2 引数、参照で渡せば中身は同じ(値渡しと参照渡し)

参照渡しにするにはパラメーターを参照型にしとけばいいんですね

4.3.3 え! 引数の数が決まってない?(可変長パラメーター)

引数はいくつ渡してもOKなんですね

Memo func_get_arg()関数で配列要素を1つずつ取り出す

4.3.4 戻り値は1つだけとは限らない!

この関数って処理結果が2つもあるんです

Memo 可変長パラメーターに仮の名前を付ける

4.4 再帰、可変、高階、無名、まだまだあるぞ関数の使い方

Memo 再帰呼び出しで実行された処理

4.4.1 何度も呼び出すのは面倒だから自分で自分を呼び出してね(再帰関数)

同じような処理を連鎖的に起こす場合は関数内部で自分自身を呼び出すのだ!

4.4.2 関数ごと引数にして渡しちゃえば先方で実行してくれる(可変関数と高階関数)

関数を変数に格納するって?(可変関数)

ハメコミの関数なのです(高階関数)

下請け関数を差替えて処理の内容を変えましょうよ

4.4.3 名前のない使い捨ての、使いどころ満載の関数(匿名関数)

その場限りの関数は使いたいところに直接埋め込んじゃえ!

Chapter 5 大規模開発のためのオブジェクト指向

プログラミング

5.1 クラスからオブジェクト、これが鉄則(クラスとメンバー)

5.1.1 クラス、作ります(PHPにおけるクラス定義)

PHPのクラスとメンバー

Memo クラスとクラスメンバーの命名規則

5.1.2 クラスにデータを保持する機能を持たせよう(プロパティ)

PHPのプロパティにはアクセス指定が必須なのです

5.1.3 クラスに関数ですね(メソッド)

PHPのメソッドにもアクセス指定が必須なのです

Memo instanceofで継承をチェックする

5.1.4 クラスを「使える状態」に! それがインスタンス化(クラスのインスタンス化)

まずはクラスを『使える状態』に! それがインスタンス化

5.1.5 始まりと終わり、初期化と末期化のメソッドですね

(コンストラクターとデストラクター)

プロパティに初期値を設定、それが今回作成するコンストラクターの役割

Memo コンストラクターの特徴

Hint コンストラクターのパターン

後処理はデストラクターで

5.1.6 インスタンス化しなくても使えるメソッド?

何か矛盾してますね(静的メソッド)

その場で使えるメソッド、その場限りの処理です

すでに存在する、それが静的プロパティ

Memo 静的メソッドからプロパティにはアクセスできない

Memo クラス定数

5.1.7 プロパティ、壊れないようにしなきゃね(カプセル化)

クラスをカプセル化? クラスごとに何か入れちゃうんですか?

5.2 継承とインターフェイスで本格的なWebアプリケーション開発に備える

5.2.1 クラスからクラスを作る、つまりクラスのクローン(クラスの継承)

親クラスはスーバークラスで、でもって子クラスはサブクラス

実際に継承するにはどうすればいいの?

Hint サブクラス実行時のポイント

Memo 多重継承の禁止

5.2.2 メソッドをすげ替えて新たな機能を実装(メソッドのオーバーライド)

メソッドを自在に上書きして便利に使う、それがオーバーライド

オーバーライドする前のメソッドを使いたいときは?

Memo オーバーライドの条件

5.2.3 基本的な処理はスーパークラスのコンストラクターで

すべてのサブクラスでコンストラクターを定義する

Memo オーバーライドを禁止する

5.2.4 インスタンスを識別してオーバーライドメソッドを呼び分ける

(ポリモーフィズム)

オブジェクト指向におけるポリモーフィズム

3つのサブクラスでポリモーフィズムを表現

5.2.5 中身がない方が便利なの? 使い方だけを決めておくのね?

(抽象メソッドと抽象クラス)

抽象クラスを定義して中身のない抽象メソッドを用意する

5.2.6 メソッドの中身を知らなくても使い方だけ知ってればいい!(インターフェイス)

目的に応じてインターフェイスを実装する

Memo 抽象メソッドを使うに当たっての注意

Memo インターフェイスを使うときの注意点

Memo インターフェイスの実装とメソッドの実装

インターフェイスを作成して実装してみる

Memo クラスやインターフェイスの情報を取得する関数

5.2.7 そのクラス、インターフェイスを実装してる?(型チェック)

instanceofで実装しているインターフェイスをチェックする

5.3 オブジェクト指向、さらに深く(オーバーロード、参照)

5.3.1 何かベタな名前ですね、ぷぷぷ(マジックメソッド)

オーバーロードで未定義のプロパティを処理する①

オーバーロードで未定義のプロパティを処理する②

オーバーロードで未定義のメソッドを処理する

5.3.2 オーバーライドした静的メソッドを呼び出したい(遅延静的束縛)

スーパークラスからオーバーライド後の静的メソッドを呼び出す

5.3.3 参照を極めればオブジェクトを自在に操作できるよ

まずは参照の基本をチェック

Memo オブジェクトのコピー

参照カウントでインスタンスの生存期間をカウント

Hint 自分で自分を参照?(循環参照)

Memo 変数を値渡ししても参照が使われる

5.4 例外発生! でもプログラムを止めないで!

5.4.1 あっ?(例外)

トライして補足するのだ!

Memo Exceptionクラスのメソッド

5.4.2 例外をカスタマイズするって?

自作したクラスで独自の情報を入手して例外処理を行う

Tips エラー情報を例外に変換して処理する

5.5 名前の衝突は名前空間で解決

5.5.1 同名のクラス、名前空間で分ければ別々のクラス

myspace\project名前空間に属するクラスを定義

Memo クラス名などの名前には3つの種類がある

5.5.2 インポートでラクするぞ

名前空間のインポート

Memo 名前空間を利用する際のポイント

Memo エイリアス

Chapter 6 Webブラウザーからのリクエスト、PHPで処理

6.1 HTTPのメソッドで双方向通信だ!

6.1.1 GET、POSTでサーバーと連携だ!

リクエスト情報は$_変数でゲット!

GETメソッドでクエリ送信、処理結果を返す

Memo $_REQUESTは使わないで!

Memo HTMLフォーム

POSTメソッドでポストデータ送信、処理結果を返す

Memo サーバーからの応答(レスポンス情報)

6.1.2 リクエスト情報の真の姿はこれだ!

GETとPOSTのリクエスト情報の中身を見る

フォーム以外からの送信はURLエンコードが必須です

Hint Webページを表示するときのリクエスト

Hint GETとPOST、クエリ情報とポストデータ、違いをはっきりさせておこう

Memo 「開発者ツール」を使ってリクエスト/レスポンス情報を見る

6.2 スーパーグローバル変数とセッション管理

6.2.1 $_SERVERでヘッダーの中身がわかるのね

ヘッダーの中身は「フィールド:値」

リクエストメッセージからヘッダー情報を抜き出す

6.2.2 レスポンスヘッダー、独自に設定して送信

レスポンスヘッダーを設定して別のURLへリダイレクトさせる

OnePoint テーブルの配置

Tips リダイレクト時のステータスコードを301(恒久的な移動)にする

Tips リダイレクト先をスマートに記述する

Memo $_SERVERのサーバーに関する情報

6.2.3 自分の足跡は自分のパソコンに保管してね(Cookie)

Cookie、それはユーザーのパソコンに保管するWebデータ

Memo Cookieの発行から利用までの流れ

Memo ブラウザーにおけるCookieの最大利用可能数

Hint Cookieの保存先

次回アクセス時にユーザー名を自動で表示してあげよう

6.2.4 通信状態を維持するぞ!(セッション)

セッションのデータはサーバー側に保存される

入力されたデータをセッションを使って保持する

セッションはCookieとセッションIDで成立っているのね

Hint セッション用のファイルを確認する

セッションをきっちり切断するぞ!

Hint 明示的に切断できなかった場合はどうなる?

6.2.5 $FILEを使えばファイルをアップロードできるぞ!

クライアントから転送されたファイルを保存する

Hint アップロードされたファイルの一時保管場所

Tips アップロードファイルの操作に各種のエラー処理を組み込む

FAQ

Chapter 7 MySQL、とことん利用してデータベースアプリを 開発するぞ

7.1 何でMySQL? ほかにもいろいろあるのに

7.1.1 まずはデータベース管理システムの構造を知っておこう

RDBMSを使用するシステムもクライアント/サーバー型

Memo RDBMSの種類

7.1.2 データベースを作成してそれからデーブルを作成して

まずは文字化け防止、エンコード方式を指定

MySQLを起動しよう

パスワードを設定、rootユーザーに

phpMyAdminの拡張機能を有効にする

7.1.3 データベースを作成してそれからテーブルを作成して

いざ! phpMyAdminでデータベースを作成

データを登録するためのテーブルを作成

Memo MySQLのデータ型

テーブルにデータを登録する(INSERT文)

Memo SQL文の種類は3種類

Memo SQLの基本的な書き方

7.2 データベース操作専用のクラス、それはPDO

7.2.1 データベースとの懸け橋、データベース抽象化レイヤー

データベースへの操作を共通化する抽象化レイヤー

7.2.2 PHPデータベースに接続、そして切断

PHPでMySQLのデータベースに接続する

Memo データベースへの接続が失敗する

Memo PDOを使用するためのモジュールの有効化

7.2.3 ユーザー登録アプリケーションを作成!

ユーザー登録のためのプログラムを作成!

登録データを確認するページを用意しよう

え? 編集可能な画面を作るんですか

FAQ

Chapter 8 Webアプリのベース、

MVCフレームワークを作成!

8.1 MVCフレームワークの作成

8.1.1 MVC? 何でわざわざフレームワークを使うんですか

MVCフレームワークは「モデル」「ビュー」と「コントローラー」で構成される

8.1.2 MVCの構造を見ればフレームワークの便利さがわかる

オブジェクト指向としてのMVC

8.1.3 MVCのM、V、C以外に用意すべきもの

すべての処理の起点は「フロントコントローラー」なのだ!

リクエストからレスポンスまでの処理の流れ

8.1.4 MVCフレームワークの構造

MVCフレームワークのディレクトリ

Memo MVCフレームワークを利用した開発

8.2 プログラムの起点を用意して必要なクラスを読み込まなくてはね

8.2.1 まずはクラスの自動ローディング機能を実装する(Loaderクラスの作成)

regDirectiry()メソッドの定義

register()メソッドの定義

requireClsFile()メソッドの定義

8.2.2 クラスローダー、どこでインスタンス化するかが問題ね

(bootstrap.phpの作成)

8.2.3 すべての起点となるプログラム、これを用意しなくては

(フロントコントローラー)

フロントコントローラー「index.php」の作成

フロントコントローラーを活かすためのApache側の設定

(.htaccesファイルの設置)

OnePoint RewriteCond%{サーバ変数名}正規表現パターン

8.3 MVCの「C」、アクションを実行するコントローラー

8.3.1 Controllerクラスの作成

プロパティの用意

コンストラクターを定義する

アクションを実行するdispatch()メソッド

認証済みでないとアクションにアクセスできないか判定する

(isAuthentication()メソッド)

え? レンダリング? render()メソッド

Memo MVCフレームワークでの処理の流れ

え? リダイレクト? 指定されたURLへの移動はredirect()メソッドで

CSRF対策は怠りなく、まずは1回限りで使い捨てるワンタイムパスワードを生成

Memo ディスパッチ

Memo password_hash()によるパスワードの暗号化

8.4 MVCの「V」、画面を生成するViewクラス

8.4.1 Viewクラスの作成

Viewクラスとは

3つのプロパティを用意

コンストラクターに渡されたデータをプロパティにセット

ビューファイルを読み込むrender()メソッド

HTMLエスケープを行うescape()メソッド

8.5 MVCの「M」、データアクセスを処理する2つのモデル

8.5.1 データベースへの接続を管理するConnectModelクラス

モデルクラスは2段構造

データベース接続用のPDOオブジェクトを生成するconnect()メソッド

データベース接続用のPDOオブジェクトを返すgetConnection()メソッド

データモデルに対応するデータベース接続を取得する

getModelConnection()メソッド

データモデルオブジェクトを取得するget()メソッド

PDOオブジェクトとデータモデルオブジェクトを破棄するデストラクター

8.5.2 データベースへのアクセスを行うExcecuteModelクラス

コンストラクターでPDOオブジェクトをsetPdo()に渡す

PDOオブジェクトをプロパティに登録するsetPdo()メソッド

SQLのクエリを発行するexcecute()メソッド

クエリの結果をすべて取得するgetAllRecord()メソッド

クエリの結果を1行ぶんだけ取得するgetRecord()メソッド

8.6 アプリケーション本体のベースとなるクラスを用意(AppBaseクラス)

8.6.1 まずは5つのプロパティとコンストラクターを用意する

まずは5つのプロパティを用意

コンストラクターでアプリケーションの初期化と設定、

エラー表示の有無を設定する

8.6.2 アプリケーションの基本処理を行うメソッドを定義する

フレームワークのクラスをインスタンス化するinitialize()メソッド

ルーティング定義を返すgetRouteDefinition()は抽象メソッドにしておく

エラー表示の無効/有効を設定するsetDisplayErrors()メソッド

エラー表示の有無を返すisDisplayErrors()メソッド

リクエストに応答し、レスポンスを送信するrun()メソッド

アクションを実行し、コンテンツをレスポンス情報にセットする

getContent()メソッド

Hint MVCのコントローラーは二重構造

コントローラークラスのインスタンス化を行うgetControllerObject()メソッド

HTTP404エラー画面を作成するdispErrorPage()メソッド

抽象メソッドgetRootDefinition()を用意

データベースへの接続を行うdoDbConnection()メソッド

Request/Response/Session/ConnectModelの

インスタンスを返すメソッドを定義

ディレクトリのパス情報を取得するメソッドをまとめて定義

8.7 リクエストURLを分析して処理を振り分けるためのデータを取得

(Requestクラスの作成)

Memo RequestクラスとResponseクラス

8.7.1 RequestクラスでリクエストURLとリクエストメソッドを処理

ホスト名を取得するgetHostName()メソッド

ホスト部分より後ろの値を返すgetRequestUri()メソッド

フロントコントローラーまでのパスを返すgetBaseUrl()メソッド

フロントコントローラーのあとに続くパスを返すgetPath()メソッド

8.7.2 POST、GETリクエストの処理

リクエストがPOSTかどうかを調べるisPost()メソッド

GET/POSTで送信された情報を取得するgetGet()/getPost()メソッド

8.8 リクエストURLをもとにルーティングで処理を振り分けるのだ

(Router.php)

8.8.1 MVCでのURLの扱い

8.8.2 ルーティングの定義自体はアプリケーション側で行います

8.8.3 Routerクラスを定義する

コンストラクターを定義する用意する

ルーティングの定義を内部用に変換する(routeConverter()メソッド)

そのリクエストはルーティング定義にマッチするか?

(getRouteParams()メソッド)

Memo リクエスト、ルーティング、セッション、レスポンスのオブジェクト化

8.9 処理が済んだらレスポンスデータを送信する(Response.php)

8.9.1 Responseクラスの作成

ステータスラインとコンテンツをプロパティに格納するメソッドを定義

レスポンスヘッダーとレスポンスボディを生成する(send()メソッド)

8.10 クライアントとのセッションを管理するクラスを用意(Sessionクラス)

8.10.1 クライアントとの懸け橋、Sessionクラスを定義する

コンストラクターを呼び出せばセッション開始

$_SESSION変数の設定と取得を行うset()/get()メソッドを用意

セッションIDを生成するgenerateSession()メソッド

setAuthenticateStatus()/isAuthenticated()メソッドで

セッション開始時の処理とログイン中の判定を行う

$_SESSION変数の初期化を行うclear()メソッド

8.11 エラーを処理する例外クラスを作成すればフレームワークの完成だ

Hint スーパーグローバル変数のカプセル化

8.11.1 FileNotFoundException/AuthorizedException例外クラスの作成

Chapter 9 MVCフレームワークによる

アプリケーション開発

9.1 開発用のディレクトリを用意してドキュメントルートは

「weblog.localhost」に

9.1.1 アプリケーション用のルートディレクトリを用意

アプリケーション用フォルダーの用意

9.1.2 Apacheのバーチャルホストの設定

hostsファイルの編集

バーチャルホストの設定を確認しよう

9.1.3 アプリケーション用のデータベースを作成

9.2 アプリケーション独自の処理を行うクラスを作成

(BlogAppクラスとフロントコントローラー)

9.2.1 BlogAppクラスの作成

まずはデータベースに接続(doDbConnection()メソッドのオーバーライド)

ルートディレクトリの取得(getRootDirectory()メソッドのオーバーライド)

ルーティング情報を登録すればクラスの完成だ!

(getRouteDifinition()をオーバーライド)

9.2.2 フロントコントローラー「index.php」の作成

フロントコントローラー(index.php)でアプリケーションを実行!

9.2.3 すべてのページで使用するレイアウトファイルを作成

レイアウトファイルを作成

Memo 制御構造に関する別の構文

CSSファイルを作成

9.3 ユーザーアカウントを登録できるようにする

(UserModelクラス/AccountControllerクラス)

9.3.1 アカウント情報をデータベースに出し入れするUserModelクラスを作成

ユーザーアカウントをテーブルに登録するのはinsert()メソッドで

ユーザーIDに一致するレコードを取得するgetUserRecord()メソッド

ユーザー名がすでに登録済みでないかを調べるisOverlapUserName()メソッド

Memo DateTime::format()メソッド

9.3.2 アカウントに関する処理を制御する(AccountControllerクラス)

フロントコントローラーからアクションが実行される流れを確認

Memo データベース管理システムの集約関数

アカウントの登録画面を表示するsignupアクション(signupAction()メソッド)

9.3.3 アカウント登録画面のビューファイルを作成

ビューファイル(views/account/signup.php)の作成

共通部品の切り出し(erroe.phpとinputs.php)

Memo AppBaseというクラス

9.3.4 アカウント情報を登録するregisterアクション(registerAction()メソッド)

アカウント情報を登録してセッションを開始するregisterAction()メソッド

Memo strlen()関数

9.4 記事を投稿できるようにする

(BlogControllerクラス、StatusModelクラス)

9.4.1 記事の投稿/閲覧を制御するコントローラーを作成する

(controllers/BlogController.php)

記事の投稿/閲覧画面を表示するindexアクション

(BlogController::indexAction()メソッド)

Memo セッションを利用した認証済みユーザーの管理

9.4.2 ユーザー専用のトップページを作成する(views/blog/index.php)

ビューファイル(index.php)の作成

HTMLのフォームを利用してユーザー専用のトップページを作成する

投稿記事を表示する部分を切り出す

viwes/blog/index.phpの完成

9.4.3 アカウント情報を利用してデータの出し入れを行うクラスを作成

(models/StatusModel.php)

投稿記事をテーブルに登録するのはinsert()メソッドで

9.4.4 ユーザーのデータをデータベースから取り出す(getUserData()メソッド)

投稿記事の取り出しはgetUserData()メソッドで

9.4.5 記事の投稿を処理するpostアクション

(BlogController::postAction()メソッド)

投稿された記事をデータベースに登録するのはpostAction()メソッドで

Memo 特定のユーザーの投稿記事を抽出するSQL文

9.5 ユーザーの投稿記事を表示する

9.5.1 投稿記事を表示するビューファイルにリンク先のURLを設定する

ルーティング定義の確認

status.phpにuserアクションとshowアクションを実行する

2つのリンクを設定

9.5.2 ユーザーの投稿一覧を表示する

投稿一覧用のビュー(user.php)を作成

ユーザーの投稿記事の全件取得はgetPostedMessage()メソッドで

ユーザーの投稿記事の一部のみを表示するuserアクション(BlogController::userAction()メソッド)

9.5.3 ユーザーの投稿記事を1件だけ表示する

1件ぶんの投稿記事を表示するビュー(show.php)を作成

ユーザーの投稿記事を1件取得するのはgetSpecificMessage

特定の投稿記事だけを表示するshowアクション

(BlogController::showAction)メソッド)

投稿記事のリンクを確認する

9.6 サインイン/サインアウト機能を実装する

9.6.1 ユーザーのアカウント情報を表示する

ユーザーのアカウント情報を表示するビューを作成

アカウント情報の表示はindexアクションで

9.6.2 サインイン画面を作る

サインイン用の画面を表示するビューを作成(signin.php)

サインイン処理はsigninアクションで(signinAction()メソッド)

ユーザー認証とサインイン処理を行うauthenticateAction()

Memo パスワードハッシュと一致するかを調べるpassword_verify()関数

サインアウトはsignoutアクションで

9.6.3 サインインが必要なアクションの実行を制限する

サインインが必要なアクションと代替で実行するアクションを登録する

Hint パスワードの管理

サインイン/サインアウトを確認してみる

Memo PHPのRCRE関数

9.7 別のユーザーの読者になるための機能を実装する

9.7.1 モデルクラスFollowingModelの作成

フォロー先を登録するのはregisterFollowUser()メソッドで

そのユーザーをフォローしているか?

チェックはisFollowedUser()メソッドで

Memo SQLのCOUNT()関数

9.7.2 ユーザーのトップページに[読者になる]ボタンを出現させる

[読者になる]ボタンを表示できるようにuserAction()メソッドを改造する

ユーザーのトップページに[読者になる]ボタンを出現させる

(views/status/user.phpの修正)

9.7.3 [読者になる]ボタンクリックで実行するfollowアクションを用意する

フォローの登録はfollowアクションで

9.7.4 フォロー先のユーザーIDを表示する

サインイン中のユーザーのフォロー先を取得する

アカウント情報画面を出力するindexアクションを修正する

ユーザーのアカウント情報画面にフォロー中のユーザーIDを表示する

Hint ユーザーのフォロー

やっと完成したぞ! [読者になる]ボタンでフォローしてみよう!

FAQ

Chapter 10 開発者必携! PHP-Webアプリケーション

のセキュリティ対策

10.1 こんなコード書いた覚えないんですけど(スクリプト挿入攻撃)

10.1.1 え? 投稿記事を読もうとしたら怪しげな画面に変わっちゃったよ!

スクリプト挿入攻撃の実際

Memo htmlspecialchars()関数

10.1.2 スクリプト攻撃への対応

HTMLエスケープで挿入されたスクリプトを無力化する

10.2 え! どこのサイトに行っちゃうの?(クロスサイトスクリプティング)

10.2.1 投稿記事を見ただけで私のCookieが盗まれちゃった

XSS脆弱性はこのようにして突かれてしまう

10.2.2 XSS脆弱性を回避するにはHTMLエスケープが鉄則!

HTMLエスケープで挿入されたスクリプトを無力化する

10.3 そのリンクを踏んじゃダメだ!(クロスサイトリクエストフォージェリ)

10.3.1 ユーザーアカウントを使って勝手に登録されちゃった

ログイン中のユーザーにまったく意図しない操作を行わせてしまう

10.3.2 CSRFへの対処

ワンタイムトークンでユーザー自身の操作であることをチェックする

10.4 偽のSQL(SQLインジェクション)

10.4.1 うわーっ、全件削除だって!

SQLインジェクションで未知のSQL文が実行される

10.4.2 SQLインジェクション対策はプレースホルダーで

外部から取得するデータにはプレースホルダーを設定しておく

10.5 もう一人、誰かがログインしてる(セッション固定攻撃)

10.5.1 攻撃者のセッションID

攻撃者がセッションIDを指定するって?

10.5.2 セッション固定攻撃の対策はセッションIDをこまめに変えることから

セッションIDを再生成する

10.6 スパムメールの踏み台になんかならないぞ

(メールヘッダーインジェクション)

10.6.1 BCCで知らない人へ勝手に送信された

メールヘッダーインジェクション攻撃

10.6.2 勝手にメールヘッダーを埋め込まれないようにする

正規表現のパターンで改行コードをチェック

Hint メールアドレスかどうかをチェックする

PR

秀和システム