ソースコードで学ぶWebプログラミング

Webプログラミングの基礎

プログラミング初心者が、独学でWebプログラミングを習得するための 基本となる学習事項を解説します。

Webプログラムの基本構成

プログラムは起動から終了まで様々な処理を行っていきますが、 Webプログラムでは、下記のいずれかの処理に分類できます。

Webプログラムのライフサイクル

・入力データの受取 ・データの変換 ・データの出力処理

このサイトではこの3分類を元に、効率良く学べるように解説していきます。

具体的にソースコードを見てみます。

<?php /* 入力用変数 */ $input = ''; /* 入力データの処理 */ if (isset($_GET['a'])) { $input = $_GET['a']; } /* データの変換 */ $input = htmlspecialchars($input, ENT_QUOTES, 'UTF-8'); /* データの出力処理 */ echo $input;

やっている事

・変数 $input を用意 ・$_GET にキー a がセットされているか判定 ・セットされていた場合 $input に代入 ・$input のデータをエスケープ処理で安全なデータに変換 ・echo でデータを出力

Webプログラムは、この一連の流れで構成されています。

Webプログラムで入力データを受け取る方法

PHPプログラムでは、入力データは主に下記のいずれかから取得します。

入力データの受取元

$_GET $_POST $_SERVER $_COOKIE $_FILES $_SESSION ファイル データベース 外部取得データ メモリ

入力とはブラウザから受け取ったもの、データベースに保存していたものなど様々ですが、 通常、一時的に変数に代入してから処理を行います。

基本的な処理対象(初級者向け)

$_GET は、URL情報 $_POST は、フォームから送信されたもの $_SERVER は、そのアクセス時のサーバやユーザー情報 $_COOKIE は、ブラウザから送られてきたクッキー情報 ファイル は、サーバに設置されたファイルデータ

上の入力処理を扱えるだけでも十分にWebプログラムを開発する事が出来ます。

一般的な処理対象(中級者以上)

$_FILES は、ファイルアップロード時のファイル情報 $_SESSION は、そのアクセス時のセッション情報 データベース は、DBサーバに保存されたデータ 外部取得データ は、外部URLなどから取得したデータ メモリ は、サーバ上のメモリに保存されたデータ

他者のプログラムをカスタマイズしたり、フレームワークを使いこなすためには 上の入力処理を扱える必要があります。

フレームワークとは、プログラムの骨組みが構築済のプログラム群です。 よく使われる処理が洗練されたかたちで実装されています。 フレームワークごとのルールや仕様を覚える必要があるため 初学者には不向きですが、開発の生産性を上げるために利用されています。

入力データの処理は、下記の要点にまとめられます。

・データを取得し、処理分けを行う ・適切な変数を用意して代入する

<?php /* $_POSTデータ受取 */ function gPOST($k){ return isset($_POST[$k]) ? $_POST[$k]: ''; } /* 処理分けの例 */ switch(gPOST('mode')){ /* 登録処理 */ case 'regist': regist(); break; /* フォーム処理 */ case 'contact': contact(); break; } function regist(){ /* 適切な変数を用意して代入 */ $data = array( 'name'=>gPOST('name'), 'email'=>gPOST('email'), 'table'=>'users' ); $DB->save($data); } function contact(){ /* 適切な変数を用意して代入 */ $data = array( 'subject'=>gPOST('subject'), 'text'=>gPOST('text'), 'table'=>'contact' ); $DB->save($data); }

やっている事

・function gPOST(){} でPOST送信データを受け取れるように ・switch(){} でPOST送信データ内の mode の値により処理分け ・連想配列 $data を作成し、保存処理へ受渡し

Webプログラムでは、例えば会員登録や商品購入など、全体として複数の処理を行う必要がありますが、 取得データの内容によって「処理分け」を行っています。

さらに詳しく

フレームワークでは、ルーティングに該当し、リクエストのURLから、割り当てのコントローラクラス(特定の処理群) を読みこんで、メソッド(特定の処理関数)を実行したりします。

<?php /* URL情報からコントローラクラスを判定 */ $path = explode('/',$_SERVER['QUERY_STRING']); /* クラス名 */ $class = $path[0]; /* メソッド */ $method = isset($path[1]) ? $path[1]: 'index'; if (file_exists($class.'.php')) { require $class.'.php'; $ctrl = new $class(); if (method_exists($ctrl, $method)) { $ctrl->$method(); } }

Webプログラムでのデータ変換とは

プログラムのメイン処理となる部分です。入力データを出力するために、適切な状態へ変換を行う処理となります。

例えばブラウザに表示するためにエスケープしたり、データ保存を行うために 連想配列に入力したり、ajaxのレスポンスを返すためにjsonデータに変換するなどがあります。

データの変換は、以下の要点にまとめられます。

・表示するためのデータ変換 ・保存するためのデータ変換

さらに詳しく

データの変換を行うためには、入力データの状態を把握している必要があり、 また出力データの状態も把握している必要があります。 具体的には、入力データのフォーマットやあり得る種類を設計しておいたり、 出力データのフォーマットの知識や設計が必要になります。

例えば入力データ $_GET、$_POST の状態は、基本的にその処理に遷移する前画面となる HTMLタグに依存するので、リンクURLやFORM要素を把握するようにします。

また出力では、保存先となるDBやテキストデータの仕様に合わせて、 保存前の変数の状態を適切なものへと操作することになります。

/* カンマを除去する処理 */ $text = str_replace(',','',$text); /* カンマをエスケープする */ $text = '"'.$text.'"';

csvファイルに保存する場合、「,」は制御文字に使われるため、エスケープする必要があります。 完全に除去してしまうか、「"」で括るなどの変換処理を行います。

/* DBへidとtextの連想配列で保存する仕様の場合 */ $data = array( 'id'=>$id, 'text'=>$text ); $DB->save($data);

フレームワークなどでDBへ保存する場合、連想配列へ割り当てるだけで保存できる事が多いです。 この場合は、DB処理が実装済なので、その仕様を理解した上で、目的の連想配列を作成する事になります。

Webプログラムのデータ出力処理

変換が行われた入力データを、ブラウザに表示したり、データベースに保存したりします。 出力処理は、表示用のHTMLタグや修飾用のcss、DB処理のSQL文など、コーディングを行っている プログラミング言語以外の知識が重要となってきます。

入力データを再利用するためには、データベースに保存、ファイルに保存、メモリに保存などの保存処理が必要となります。 また負荷対策としてキャッシュ化したり、効率良く処理するためにデータ構造を設計したりしますが、 出力処理のコーディングに影響します。

データの出力処理は、以下の要点にまとめられます。

・変数を表示 ・変数を保存

<?php /* 表示用PHPコード */ ?> <div> <?php foreach($DATA as $d): ?> <?php /* 連想配列から表示したいキーを指定 */ ?> <?php eh($d['text']); ?> <?php endforeach; ?> </div>

さらに詳しく

データの出力処理は、フレームワークではビューやモデルに該当します。ビューでは表示テンプレート用に変数を用意する必要があるため、 データの変換処理と密結合になりがちです。

密結合とは、処理が互いに依存していて分離しにくい状態を意味します。メンテナンス対象となるプログラムコードを 最小限にするためには、コードの再利用性を高める必要があります。そのための考え方として、フレームワークのMVCがあります。

フレームワークの「MVC」

Model(モデル):データを扱う View(ビュー):データを表示する Controller(コントローラ):データの作成、受渡しを行う

モデルでは、データベースの状態やバリデーションルール、SQL文などを定義します。 処理の内容を定義していく、決めておくと考えることで、分離しやすくなります。 ビューでは、表示用の変数を処理するだけで、テンプレート化しておくものと考えます。 コントローラでは、モデルに定義した処理を呼び出し、ビューで表示する変数を作成していきます。

このサイトでは、さらに効率良く学習するために、入力処理、変換処理、出力処理で考えていきます。

モデルには、入力処理と出力処理が存在し、データ取得、データ保存を行います。 ビューには、変換処理と出力処理が存在し、ブラウザ表示用の変換処理を行います。 コントローラには、入力処理と変換処理、出力処理のすべてが存在し、 ブラウザからのデータ受取、表示・保存のための変換処理、ページ遷移やダウンロードなどの出力処理を行います。