pyてよn日記

一寸先は闇が人生

PHP の勉強 その1 - PHP の文法,フロントエンドとのデータのやり取り

 PHP の基礎を Progate で勉強し始めたのでその経過をまとめていく.解説記事ではないので情報はまとまっていない.PHP の基礎というよりは Web の基礎の基礎という感じ.

PHP とは?

ものすごく大雑把に PHP を説明.

  • HTML に埋め込むことのできる,サーバーサイドで使用されるスクリプト言語
  • 動的に HTML を生成することができる.
  • クライアントがリクエスト -> サーバー側で index.php を index.html に変換(HTML を動的に生成) -> クライアント側でレンダリングされる(みたいな理解でいいだろうか...)
  • JavaScript はクライアントサイド,PHP はサーバーサイドで実行される(Node.js は一旦置いておいて).

以下を参照した.

PHP の概要

  • hoge.php というファイルに HTML を書き,その中に <?php ~ ?> を埋め込んで PHP を書くことができる(~ の部分に PHP のコードが入る).
  • 行末にセミコロンが必要.
  • hoge.php<?php ~ ?> の部分は HTML に変換され,HTML として出力される.
  • 文字列の出力:echo 'hoge'(クオーテーションはシングル,ダブル両方可)
  • echo で出力する文字列をダブルクオーテーションで囲むと {} で変数を埋め込める.

基礎

データの型

  • 数値型
  • 文字列型
  • bool型(truefalse

変数の定義

  • 変数名には頭に $ をつけて定義することができる(予め定義済みの $GLOBALS$_GET などのグローバル変数は使えない).
<?php

$hoge = 'hello,';
echo $hoge, 'everyone!';

?>

echo で複数出力したい場合は カンマ , で区切る(このとき間にスペースは入らないため,hello,everyone!のように単語間にスペースがないまま出力される).

変数と演算

<?php

// 中身は上書きできる
$name = 'Bob';
echo 'Hello, ', $name, '!';
$name = 'Alice';
echo 'Hello, ', $name, '!';

// 演算
$x = 1;
$x = $x + 10;
echo $x;  // 11

// 省略表記ができる
$x += 5;
$x -= 5;
$x %= 5;

// インクリメント・デクリメント
$x = 3;
$y = 3;
$x++;
$y--;

// 演算の順序(インクリメント・デクリメント)
$x = 3;
$y = 3;
// echo の前にインクリメント
echo ++$x;  // 4
// echo の後にインクリメント
echo $y++;  // 3

?>

文字列の連結

  • echo で出力時,. で文字列を連結できる.
  • echo で出力する文字列をダブルクオーテーションで囲むと {} で変数を展開できる.
<?php

$foo = 'hello, ';
$bar = 'world';
$fruit = 'apples';
echo $foo.'world!';
echo $foo.$bar;
echo 'hello, '.$bar;
echo 'hello, '.'world!';
echo "I like {$fruit}.";  // I like apples.
echo 'I like {$fruit}.';  // I like {$fruit}.

?>

条件分岐

if, else, elseif

<?php

if (cond1) {
    // 処理 1
} elseif (cond2) {
    // 処理 2
} else {
    // 処理 3
}

?>

switch 文

<?php

$x = 33;
$y = $x%2;
switch ($y) {
    case 0:
        echo 'OK!';
        break;
    case 1;
        echo 'NO...';
        break;
    default:
        echo 'None';
        break;
}

?>

配列

  • 複数の値を一つの変数にまとめて扱う.
<?php

// 配列の定義
$hoge = array('foo', 'bar', 'baz');

// 配列へのアクセス
echo $hoge[1];  // bar を出力(0-origin)

// 要素の上書き
$hoge[0] = 'hoge';

// 配列の末尾への要素の追加
$hoge[] = 'qux';
echo $hoge[3];  // qux

?>

https://qiita.com/ka_/items/3727c3f16dc69fed935c

連想配列

  • key と value のセットで値を保存する.
  • key で value にアクセスできる.

大枠

array(
    key1 => value1,
    key2 => value2,
    ...
);

<?php

$exam = array(
    'Math' => 80,
    'P.E.' => 70,
    'English' => 55,
);

$exam['English'] += 20;
echo "Math score: {$exam['Math']}";
echo 'English score: '.$exam['English'];

?>

繰り返し処理

for 文

<?php

$sum = 0;
$end = 50;
for ($i = 1; $i <= $end; $i++) {
    $sum += $i;
}
echo "1 から {$end} までの総和は"."<br />";
echo "{$sum} です."."<br />";

?>

while 文

<?php

$cnt = 0;
$end = 33;

while ($cnt <= $end) {
    // 3 の倍数の時だけ出力
    if ($cnt%3 == 0) {
        echo $cnt."<br />";
    }
    $cnt++;
}

?>

break 文

<?php

// 251 以上を出力させない
$end = 250;
for ($i = 1; $i <= 500; $i++) {
    echo $i."<br />";
    if ($i >= $end) {
        echo "ここでループ終了"."<br />";
        break;
    }
}

// while
$i = 0;
$end = 251;
while (true) {
    echo "現在の数字は {$i}"."<br />";
    $i++;
    if ($i >= $end) {
        echo "ここでループ終了"."<br />";
        break;
    }
}

?>

continue 文

<?php

for ($i = 1; $i <= 30; $i++) {
    if ($i%3 == 0 || $i%5 == 0) {
        continue;  // 現在のループをスキップ
    }
    echo $i."<br />";
}

?>

foreach 文

配列,連想配列の要素を先頭から順に取り出して処理をする.

大枠

  • 要素を取り出す
$data = array(var1, var2, var3, ...);
foreach ($data as $var) {  // $data の要素を $var として(as)取り出す
    // 処理
}
  • key とセットで要素を取り出す
foreach ($data as $key => $value) {
    // 処理
}

  • 要素を取り出す
<?php

$classes = array("Mathematics", "Physics", "Biology");

forenach ($classes as $cls) {
    echo $cls."<br />";
}

?>
  • key とセットで要素を取り出す
<?php

$imageColors = array(
    "Mathematics" => "Blue",
    "Physics" => "Green",
    "Biology" => "Yellow"
    );

foreach ($imageColors as $key => $value) {
    echo $key.": ".$value."<br />";
}

?>

関数

まとまった処理を行い,値を返すもの.

PHP での組み込み関数(Progate で出てきたもの)

  • strlen('hoge'):文字数を返す.
  • count($arr):配列の要素数を返す.
  • rand(n1, n2):n1 ~ n2 の整数をランダムで返す.

自作関数

引数が一つ,戻り値なし

function printSquareNumber($num) {
    echo $num * $num;
}

引数が二つ,戻り値なし

function printAddNumber($num1, $num2) {
    echo $num1 + $num2;
}

引数が二つ,戻り値あり

function addNumber($numn1, $num2) {
    return $num1 + $num2;
}

問い合わせフォームを作る

  • 見た目の部分(フロントエンド):HTML
  • 値を受け取って処理する部分(バックエンド):PHP

ここでは明確には分かれていない.

form タグ

 フォーム部分は HTML の <form> タグを使って書く.

 <form> は入力,送信フォームを作成する際に使用する.<form> タグの間に <input><select><textarea> などの入力操作を受け取るテキストボックス,ボタン等を設置する.

フォームに入力されたデータの送信

  • 送信先<form>action 属性に指定された URI に送信される
  • 転送方法:<form>method 属性に指定された HTTP メソッドで送信される.get だと URL に内容が表示され,post だと表示されない(暗号化されている訳ではない).
  • 送信されるデータ:<input>name 属性で付けたデータ名とフォームに入力されたデータを一組にして送信される.

 テキストボックスの name 属性がバックエンド側でデータを扱うときに必要なデータ名であることは意識しておきたい(後述).

 以下の例では,(ここでは明確ではないが index.php から)sent.php へ,userID というデータ名をもつデータを送信するフォームの例を示す.

<form action="sent.php" method="post">
    User ID
    <input name="userID" type="text">
</form>

テキストボックス

 上で少し触れたが,<form> タグの中で使うテキストボックスをいくつか紹介する.

<form action="hoge.php" method="post">
    // 1 行のテキストボックス
    User ID
    <input name="user-id" type="text">

    // 1 行のテキストボックス:パスワード用(暗号化されている訳ではない)
    Password
    <input name="pass" type="password">

    // 複数行のテキストボックス
    <textarea name="content1">
    </textarea>

    // 複数行のテキストボックス:行数,列数の指定
    <textarea name="content2" rows="3" cols="30">
    // 入力フィールドの表示サイズであり,
    // 入力可能な桁数,文字数の指定ではない
    </textarea>

    // 送信ボタン type="submit"
    <input type="submit">

    // 送信ボタン type="submit"
    // value でボタン上に表示される文字を変えられる
    <input type="submit" value="hoge">
</form>

フォームの最後に設置した送信ボタンを押すことによって,

  • <form> タグの action 属性で指定した URL へ,
  • <form> タグの method 属性で指定した HTTP メソッドで,
  • 各テキストボックスの name 属性で指定した値とテキストを一組として,

データが送信される仕組みになっている.

$_POST:バックエンド側で送信されたデータを受け取る

 データの送信方法が分かったところで,フォームから送信されたデータをバックエンド側で受け取る方法を学ぶ.

 送信されたデータは,<form> タグの action 属性で指定された URI へ送信される.先ほどの例では,action="sent.php" と指定していた.そのため,送信されたデータを sent.php で処理しなければならない.sent.php でどうやってフォームから送信されたデータを受け取るかを学んでいく(念の為補足しておくとファイル名は任意のファイル名で良い).

$_POST の基本

 フォームからデータが送信されると,php 側で $_POST という定義済みグローバル変数に格納される.$_POST は,フォームの name 属性を key,フォームの内容を value とした連想配列である.以下,index.php のお問い合わせフォームから送信されたデータを sent.php で(受け取って)表示する例を示す.

index.php

<div id="form">
    <form action="sent.php" method="post">
        <h1>お問い合わせフォーム</h1>
        <div>
            <h2>お名前</h2>
            <input name="name" type="text">
        </div>

        <div>
            <h2>E-mail Address</h2>
            <input name="email" type="text">
        </div>

        <div>
            問い合わせ内容
            <textarea name="content">
            </textarea>
        </div>
        <input type="submit" value="送信">
    </form>
</div>

sent.php(index.php と同じディレクトリ内)

<div id="form">
    <h1>お問い合わせフォーム</h1>
    <div>
        <h2>あなたのお名前</h2>
        <?php
        echo $_POST['name'];
        ?>
    </div>

    <div>
        <h2>あなたの E-mail アドレス</h2>
        <?php
        echo $_POST['email'];
        ?>
    </div>

    <div>
        <h2>問い合わせ内容</h2>
        <?php
        echo $_POST['content'];
        ?>
    </div>
</div>

セレクトボックス:選んだ選択肢の値を渡す

セレクトボックスの基礎

 <form> 内で,<select><option> タグを以下のように使う.<option> タグで挟まれている値はボタンのラベルであり,$_POST の値として実際に送信されるのは <option> タグの value 属性の中身である.

<form action="sent.php" method="post">
    <select name="exam">
        <option value="Math">数学</option>
        <option value="English">英語</option>
        <option value="Chemistry">化学</option>
    </select>
</form>

 上記の例だと,実際に sent.php 側で表示されるのは,Math,English などになる.

オプションタグを for 文で生成する

 セレクトボックスと for 文を用いて,生年月日を選択するフォームを作ってみる.

index.php

<div>
    <h2>生年月日</h2>
    <!-- 年 -->
    <select name="year">
        <option value="未選択">未選択</option>
        <?php
        $start = 1950;
        $end = 2019;
        for ($i = $start; $i <= $end; $i++) {
            echo "<option value{$i}>{$i}</option>";
        }
        ?>
    </select>

    <!-- 月 -->
    <select name="month">
        <option value="未選択">未選択</option>
        <?php
        $start = 1;
        $end = 12;
        for ($i = $start; $i <= $end; $i++) {
            echo "<option value{$i}>{$i}</option>";
        }
        ?>
    </select>
    
    <!-- 日 -->
    <select name="day">
        <option value="未選択">未選択</option>
        <?php
        $start = 1;
        $end = 31;
        for ($i = $start; $i <= $end; $i++) {
            echo "<option value{$i}>{$i}</option>";
        }
        ?>
    </select>
</div>

sent.php

<div>
    <h2>生年月日</h2>
    <?php
    echo "{$_POST['year']}/{$_POST['month']}/{$_POST['day']}";
    ?>
</div>

foreach 文でオプションを作る

 配列を定義して foreach 文で echo するだけ.

<select name="year">
    <option value="未選択">未選択</option>
    <?php
    $fruits = array('banana', 'orange', 'grape');
    foreach ($fruits as $fruit) {
        echo "<option value={$fruit}>{$fruit}</option>";
    }
    ?>
</select>

連想配列を用いると日本語と英語とかでやり取りもできそう.

ポイントまとめ

PHP の基礎

  • 変数定義は先頭に $ をつける.
  • 配列は array(foo, bar, ...)
  • 連想配列array(key1 => value1, key2 => value2, ...)

入力フォームによるデータのやりとり

  • <form> の action 属性でデータを送信する先(URI)を指定する.
  • バックエンド側(action 属性で指定した URI)で,$_POST として HTTP メソッドで送信されたデータを受け取れる.

感想

 以前 Python の Flask から HTML へのレンダリングするときに Jinja というテンプレートエンジンを使ってフロントエンドとバックエンドのデータのやり取りを書いていた.それに比べると PHP ではすっきり HTML へ埋め込めそうという印象を抱いた.まだ PHP の勉強も Web の勉強も始まったばかりなので何とも言えないがそれが現時点での印象.

補足:PHP サーバーをローカルで起動して,.php ファイルをブラウザに表示

index.php が存在するディレクトリで以下を実行.

$ ls
index.php

$ php -S localhost:8080;

 本記事の続きは以下.

pyteyon.hatenablog.com