PHPの基本知識をゼロから学ぶハンズオン学習

フォーム

目次

1. フォームとは
2. HTTPリクエスト・HTTPレスポンスとは
3. HTTPリクエスト
4. HTTPリクエストの値確認
5. API

1. フォームとは

フォームとは、決められた形式で必要項目にデータの入力や選択を効率よくできるように作成された入力欄、Webページ、アプリの入力画面を指します。

このフォームはユーザーが入力した情報を送信ボタンを押下することで、WebサーバにHTTPリクエストとして送られます。

2. HTTPリクエスト・HTTPレスポンスとは

下図において、フォームはWebブラウザに当たります。

① リクエストは、WebブラウザからWebサーバに対して出される依頼です。
② Webサーバで、リクエストされた内容からあらかじめ決められた処理を行い、その結果を返します。
 リクエストされた情報をDBに登録し完了したら、「登録が完了しました」のメッセージを返すなど
③ リクエストに対するWebサーバからの返事
 「登録が完了しました」のメッセージをWebブラウザに表示されるなど

3. HTTPリクエスト

HTTPリクエストには、複数のHTTPリクエストメソッドがあります。
今回挙げているのは一部ですが、その他のHTTPリクエストメソッドはこちらをご覧ください。

HTTPリクエストメソッド概要
GETURLにパラメータという情報を付与してデータを送信する方法。
URLの中に情報が埋め込まれるため、データの取得時のみ使用。
POSTURLの中に情報を埋め込まずにデータを送信する方法。
個人情報やログイン情報を入力するような秘匿情報を送信するときに使用。
PUTHTTPを通じてサーバ上のリソース(ファイルなど)の追加あるいは上書き保存を指示するためのメソッド。
DBの情報更新などで使用。
DELETEHTTPを通じてサーバ上の指定した資源(ファイルなど)の削除を行うよう依頼するメソッド。
DBの情報削除などで使用。

3-1. GETリクエストによるフォーム送信

ブラウザで入力された情報をGETリクエストを使用して送信し、その結果をブラウザで表示するプログラムを作成していきます。
下画像は、完成した入力フォーム画面です。

まず、ファイル管理しやすいようにフォルダを作成します。
で新しいフォルダを作成します。
そのフォルダ内に以下の2ファイルを作成します。

  • form.html
  • result.php

今回はHTTPリクエストメソッドの説明なので、各HTMLタグについての説明は省略します。

form.html

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Demoフォーム</title>
</head>
<body>
    <h1>Demoフォーム</h1>
    <form method="GET" action="result.php"> //①
        <div>
            <p>名前</p>
            <input type="text" name="name" placeholder="名前を入力"/>
        </div>
        <div>
            <p>性別</p>
        </div>
        <div>
            <input type="radio" name="gender" value="男性" checked="default"/>男性
            <input type="radio" name="gender" value="女性"/>女性
        </div>
        <div>
            <p>計算を行います、1〜10までの数字を入力してください。</p>
            <input type="number" name="num1" min="0" max="10" value="0"/>+
            <input type="number" name="num2" min="0" max="10" value="0"/>
        </div>
        <br>
        <input type="submit" value="送信"> //②
    </form>
</body>
</html>

① フォーム中の情報はformタグを使用して送信します。
 method属性にはHTTPリクエストメソッドを指定します。
 action属性にはformの情報の送信先を指定します。
② type属性にsubmitを指定し、このボタンを押下することでformの情報が送信されるようにしています。
 value属性はボタンに表示される文字です。

次にform.htmlで入力された情報を処理するphpファイルに処理をコーディングしていきます。
result.php

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>結果</title>
</head>
<body>
    <h1>フォームで送られた結果</h1>
    <p>名前は<?php echo $_GET["name"] ?>です。</p>
    <p>性別は<?php echo $_GET["gender"] ?>です。</p>
    <div>
        <?php
            $result = $_GET["num1"] + $_GET["num2"];
            echo "計算結果:{$result}";
        ?>
    </div>
</body>
</html>

GETリクエストの値は、$_GETで受け取る必要があります。

$_GET["取得したいinputタグのname属性"]

form.htmlで情報が入力されresult.phpへGETリクエストされ、その結果がレスポンスとなりWebブラウザに表示されます。

URLに注目すると、?の後にフォームで送られた情報がパラメータとして記載されています。このようにGETリクエストはURLに反映されてしまうため、個人情報などの秘匿情報を扱う場合は使用しません。

3-2. POSTリクエストによるフォーム送信

次にブラウザで入力された情報をPOSTリクエストを使用して送信し、その結果をブラウザで表示するプログラムを作成していきます。
先程のGETリクエストのプログラムを利用していきます。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Demoフォーム</title>
</head>
<body>
    <h1>Demoフォーム</h1>
    <form method="POST" action="result.php">
        <div>
            <p>名前</p>
            <input type="text" name="name" placeholder="名前を入力"/>
        </div>
        <div>
            <p>性別</p>
        </div>
        <div>
            <input type="radio" name="gender" value="男性" checked="default"/>男性
            <input type="radio" name="gender" value="女性"/>女性
        </div>
        <div>
            <p>計算を行います、1〜10までの数字を入力してください。</p>
            <input type="number" name="num1" min="0" max="10" value="0"/>+
            <input type="number" name="num2" min="0" max="10" value="0"/>
        </div>
        <br>
        <input type="submit" value="送信">
    </form>
</body>
</html>

formタグのmethod属性をGETからPOSTに変更しました。
result.phpもPOSTリクエストを取得できるように修正します。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>結果</title>
</head>
<body>
    <h1>フォームで送られた結果</h1>
    <p>名前は<?php echo $_POST["name"] ?>です。</p>
    <p>性別は<?php echo $_POST["gender"] ?>です。</p>
    <div>
        <?php
            $result = $_POST["num1"] + $_POST["num2"];
            echo "計算結果:{$result}";
        ?>
    </div>
</body>
</html>

POSTリクエストの値は、$_POSTで受け取る必要があります。

$_POST["取得したいinputタグのname属性"]

では、結果のブラウザを確認してみます。

URLを確認すると、フォーム情報が記載されていません。このようにPOSTリクエストは秘匿情報を扱う際に使用します。

4. HTTPリクエストの値確認


$_POSTや$_GETの値の有無を確認するには、isset()を使用します。
引数に指定した変数に値が設定されており、かつ nullではない場合にtrueを返します。

isset(変数)

5. API

クラスとオブジェクト

目次

1. オブジェクト指向
2. クラス

1. オブジェクト指向

「もの」や「物体」を英訳するとオブジェクトと言い、オブジェクト指向のオブジェクトはここから来ています。
この剣を持ったキャラクターを想像してみてください。

このキャラクターには、名前や体力、攻撃をする動作、移動をする動作などがあります。
キャラクター自体をオブジェクトといい、名前や体力などキャラクター固有の情報をプロパティ、攻撃をする動作や移動をする動作など他のキャラクターと共有できる操作をメソッドといいます。
また、このプロパティとメソッドをまとめてメンバといいます。

プロパティ・名前
・体力
メソッド・攻撃の動作
・移動の動作
・休むの動作

このように、オブジェクト毎に管理し、それらを組み合わせてシステムを構築していくことをオブジェクト指向といいます。

2. クラス

「1. オブジェクト指向」でキャラクターを例にオブジェクトについて説明しました。他にもキャラクターが必要なので作成していきたいと考えています。
キャラクターを作成するには設計図が必要であり、この設計図にあたるものをクラスといいます。

2-1. クラスの定義

クラスの定義方法は以下のとおりです。
プロパティとメソッドは複数定義可能です。

class クラス名 {
    プロパティの定義; //①

    function メソッド名(引数) {
        処理
    }
}

① プロパティとはクラス内に定義できる変数です。
② メソッドとはクラス内で利用できる関数のことです。

2-2. プロパティ

2-2-1. プロパティの定義

プロパティの定義方法は以下のとおりです。

アクセス修飾子 プロパティ変数;

※アクセス修飾子については、後の「2-4. アクセス修飾子」で紹介しています。

例文

public $number;
2-2-2. プロパティへアクセス

プロパティにアクセスするには、以下のとおりにします。

変数名 -> メンバ

※「->」はアロー演算子といいます。

2-2-3. $this(擬似変数)

$thisは、自分自身のインスタンスを指す変数であり、プロパティにアクセスすることができます。

$this -> メンバ変数名 -> メンバ は同じ意味

2-3. メソッド

2-3-1. メソッドの定義

メソッドの定義方法は、関数の定義方法と同じです。
関数の「1-2. 関数の定義」をご確認ください。

2-3-2. メソッドの呼び出し

メソッドにアクセスするには、以下のとおりにします。

変数名 -> メソッド名();

2-4. アクセス修飾子

アクセス修飾子とはメンバへのアクセス範囲を指定するもので、PHPには以下3つあります。

アクセス修飾子概要
publicどのクラスからでもアクセス可能
protectedクラス内、または子クラスからアクセス可能
privateクラス内のみからアクセス可能

なお、アクセス修飾子を省略することも可能ですが、省略した場合はpublicとなります。

2-5. 他のPHPファイルを読み込む

他のPHPファイルを読み込むには、require_once()を使用します。

require_once("読み込むPHPファイル");

2-6. インスタンス化

クラスから作成されたオブジェクトのことをインスタンスといいます。
すなわち、クラスが無ければオブジェクトは作成できず、1つのクラスから何個もインスタンスを作成できます。
インスタンスを作成することをインスタンス化といいます。
インスタンス化するには以下のように定義します。

変数 = new クラス名();

1つのクラスから複数インスタンス化することができます。

$demo1 = Demo();
$demo2 = Demo();

demo1とdemo2のインスタンスは共に同じメンバを持っていますが、全く別のオブジェクトとして扱われ、それぞれに対しての影響はありません。

2-7. コンストラクタ

2-7-1. コンストラクタの呼び出し

「2-5. インスタンス化」において、new クラス名();と定義しました。
このインスタンス化を行う際に、「クラス名();」の部分はコンストラクタと呼ばれるメソッドで、一度だけ呼び出されます。

2-7-2. コンストラクタの定義

呼び出し元でインスタンス化を行なった時点で、一度だけ呼び出されます。
コンストラクタの定義方法は以下のとおりです。

function _construct(引数) {
}

カプセル化

目次

1. カプセル化とは
2. アクセスメソッド(getter, setter)

1. カプセル化とは

カプセル化とは、オブジェクトの情報を隠蔽し、不整合を引き起こすような操作を防ぐための仕組みです。
プロパティは原則的に private で外部からアクセスできないようにし、必要があるもののみメソッドを使ってアクセスできるようにします。
このprivateのメンバにアクセスできるメソッドをアクセスメソッドといいます。

2. アクセスメソッド(getter, setter)

2-1. アクセスメソッドとは

アクセスメソッドには、セッター(Setter)と呼ばれる値を設定するためのメソッドと、ゲッター(getter)と呼ばれる値を取得するためのメソッドに分けられます。
読み書き両方を許可するプロパティには、セッター・ゲッターの両方が必要で、クラス内部だけで利用し外部からのアクセスを禁止するようなプロパティの場合アクセスメソッドは定義しません。

2-2. アクセスメソッドの定義

アクセスメソッドの定義方法は、メソッドの定義方法と同じですがgetter, setterが区別できるようにメソッド名の命名には以下のように定義します。

function setメソッド名(引数) {
    $this -> プロパティ = 引数;  //引数からプロパティの値を変更
}

function getメソッド名() {
    return $this -> プロパティ;  //プロパティの値を取得
}

静的メンバ

目次

1. 静的メンバとは
2. 静的メンバの定義
3. 静的メンバの呼び出し
4. self::

1. 静的メンバとは

今までインスタンス化して利用できるメンバの紹介を行なってきました。これに対しインスタンス化することなく利用できるメソッドやプロパティのことを静的メンバ(クラスメンバ)といいます。
インスタンスメンバはインスタンスごとにそれぞれのメソッドとプロパティを持ちますが、静的メンバはクラス1つに対し1つしか持つことができません。

2. 静的メンバの定義

静的メンバを定義するにはstatic修飾子を付与します。

アクセス修飾子 static メンバ名;

3. 静的メンバの呼び出し

静的メンバの呼び出すには、以下のとおりにします。

クラス名::メンバ名;

4. self::

self::は、クラス内の静的メンバを呼び出すときに先頭に付ける修飾子です。selfが自分自身のクラスを表します。

self::メンバ名;

継承

目次

1. 継承とは
2. 抽象クラス
3. オーバーライド

1. 継承とは

継承とは、あるクラスのメンバをほかのクラスに引き継ぐ(継承させる)効果があります。
継承元となるクラスをスーパークラスや親クラス、基底クラスと呼びます。
継承先のクラスを子クラス、サブクラス、派生クラスなどと呼びます。

1-1. 継承の方法

継承を行うには、extendsを使用します。

class サブクラス extends スーパークラス {
}

1-2. protectedアクセス修飾子

アクセス修飾子であるprotectedは、外部からはアクセスできませんが、子クラスからはアクセスを許可する修飾子です。

2. 抽象クラス

2-1. 抽象クラスとは

抽象クラスとは、抽象メソッドが1つ以上定義されたクラスのことです。
抽象なので、メソッド名と引数は定義されているが処理が定義されていない状態です。
なお、抽象クラスでインスタンス化できません。

2-2. 抽象クラス・抽象メソッドの定義

抽象クラス・抽象メソッドを定義するには、abstractを使用します。
抽象メソッドは処理を定義しません。

abstract class クラス名 {
    abstract アクセス修飾子 function 抽象メソッド名(引数);
}

3. オーバーライド

抽象クラスは後に継承され抽象メソッドが実装されることが前提となるクラスです。
なので、継承先であるサブクラス内に抽象メソッドを具象メソッドとなるようにします。このように処理を定義することをオーバーライドといいます。
オーバーライドとは、子クラスで親クラスにあるメソッドと同じ名前、同じ型の引数、同じ型の戻り値を返すメソッドを定義することです。

abstract class SuperClass {
    abstract function method();  //抽象メソッド
}

class SubClass extends SuperClass {
    function method() { //オーバーライド
        // 処理
    }
}

cookieとsession

目次

1. cookie
2. session
3. cookieとsessionの連携
4. sessionの利用方法

1. cookie

cookie(クッキー)とは、Webに関連する情報をブラウザに保存させり仕組みです。
例えば、ログイン認証が必要なサイトがあり、ログイン後一度ページを離れて再度アクセスした際にログイン認証を行うことなくログインした状態となっているのはcookieのおかげです。

2. session

session(セッション)とはWebサーバ内に情報を保存し、複数ページ間で共有する仕組みです。
例えば、ECサイトのカート機能などは、複数の商品ページを移動し、カートに追加した各商品の情報をずっと保持している必要があります。
このような場合、セッションを利用することで、複数ページ間でデータを共有できます。
なお、セッションには生成時にWebサーバでセッションIDと呼ばれるIDが割り振られ、それによって区別されます。

3. cookieとsessionの連携

Webアプリではこのクッキーとセッションを連携させます。
例えば、ECサイトにIDとパスワードを入力してログインすると、サーバからセッションIDが割り振られ、それらの値がクッキーに保存されます。
次回アクセス時には、このクッキーに保存されたIDとパスワードでログインできるうえに、セッションIDがサーバに送付され、そこに紐付けられたカートを開くことができます。
SNS複数人がアクセスした際、それぞれのユーザーを特定できるのは、異なるセッションIDが割り振られるためです。セッションIDによってアクセスするユーザーを特定できるので、複数の人が同時にサイトにアクセスしても、それぞれのユーザーが自分のマイページにアクセスすることが可能なのです。

4. sessionの利用方法

sessionを利用するには以下の手順があります。
① session_start();でセッション処理をスタートする。

session_start();

② session_id()でセッションIDを取得する。

session_id();

③ セッション変数$_SESSION()でセッション情報を保存します。
 セッション変数は、セッションに値を保存するために利用する連想配列が入る特殊変数です。

$_SESSION["data"]

データベース

目次

1. XAMPPのMySQLを起動
2. テーブルの作成
3. SELECT文
4. INSERT文
5. UPDATE文
6. DELETE文
7. サブクエリ(IN句、 EXISTES句)
8.

1. XAMPPのMySQLを起動

XAMPPにはMySQLが含まれています。
起動するには、XAMPP起動後、http://localhost/phpmyadmin/にアクセスします。

1-1. データベースの作成

「データベース」のタブを押下後、データベース名と照合順序を設定し、作成ボタンを押下します。
今回は以下のように設定してDBを作成しました。

  • データベース名:lesson_db
  • 照合順序:utf8_unicode_ci

2. テーブルの作成

「SQL」タブ内でCREATE文を用いて、テーブルを作成します。
今回作成する情報は以下のとおりです。

CREATE TABLE person (
    id INT PRIMARY KEY
    , name VARCHAR(100)
    , age INT  
);

personテーブルで3つのカラムが作成されました。