基礎から順番に、全部読む
- PHPがどこで動いているか
- 変数・条件分岐・ループの読み方
- フォームと安全対策の考え方
PHP(ピー・エイチ・ピー)は、WordPressやネットショップ、社内システムの裏側で動いているプログラミング言語です。この教材では、コードを書けるようになるのではなく、エンジニアやAIが書いたPHPを読んで「何をしているか」が分かるところを目指します。各章にある「このコードは何を表示する?」という問題に、予想してから答え合わせをしていきます。
$name = "山田"; echo "こんにちは、" . $name . "さん";
各章の最後にある「この章を読み終えた」を押すと、目次に印が付きます。記録はお使いのブラウザの中だけに保存されます。
この章のゴール:PHPが「どこで」「何のために」使われているかを、自分の言葉で説明できる。
PHPは、Webサイトを動かすためのプログラミング言語です。1995年に生まれ、今もサーバー側(後述)の言語が分かっているWebサイトのうち、約7割で使われているとされます。世界のWebサイトの4割以上を占めるWordPressも、PHPで作られています。
Webページを見る流れは、レストランでの注文によく似ています。
| レストラン | Webの世界 | 説明 |
|---|---|---|
| お客さん | ブラウザ | ChromeやSafariなど。ページを「注文」する側 |
| 厨房 | サーバー | インターネットの向こうにある、ページを作って返すコンピューター |
| 料理人とレシピ | PHP | 注文に応じて、その場でページを組み立てる |
| 出来上がった料理 | HTML | ブラウザに届く完成品のページ |
ポイントは、PHPは厨房(サーバー)で動き、お客さん(ブラウザ)には完成品だけが届くということです。同じページでも、ログインした人の名前や今日の日付などを、PHPがその都度組み立てています。
この章のゴール:PHPファイルの「どこからどこまでがPHPか」を見分けられる。
PHPのファイルは、名前の最後が .php になっています(例:contact.php)。中身は、普通のHTML(ページの見た目を書く言語)の中に、PHPの命令を埋め込んだ形をしています。
news.php<h1>本日のお知らせ</h1> <p>今日は <?php echo date("Y年n月j日"); ?> です。</p>
| 書き方 | 意味 |
|---|---|
<?php 〜 ?> | この間がPHP。外側は普通のHTML。ファイル全体がPHPのときは、最後の ?> を省略することが多い |
echo | 「画面に表示する」という命令。PHPで最もよく見る言葉 |
;(セミコロン) | 命令の終わり。日本語の「。」に当たる。付け忘れるとエラーになる |
サーバーはこのファイルを上から順に読み、<?php の部分だけを実行して、結果の文字に置き換えます。そのためブラウザに届くのは「今日は 2026年10月22日 です。」というHTMLだけで、PHPのコードそのものは届きません。
コードの中には、人間向けのメモが書かれていることがあります。これをコメントと呼び、実行されません。読むときの大きな手がかりになります。
// 1行のメモはスラッシュ2本から /* 複数行のメモは この記号で囲む */ echo "こんにちは"; // 行の途中から書くこともできる
<?php から先がPHP。echo は「表示する」; を付ける// や /* */ はメモ(コメント)で、実行されないこの章のゴール:$ の付いた言葉が「値を入れた箱」だと分かり、中身の種類を見分けられる。
PHPでは、$(ドル記号)で始まる言葉を変数と呼びます。変数は、名前の付いた箱のようなものです。= は「等しい」ではなく、右の値を左の箱に入れるという意味です。
// 請求書1枚分の情報を、箱に入れておく $customer = "株式会社サガ商事"; // 取引先名 $amount = 50000; // 請求金額 $taxRate = 0.1; // 消費税率 $isPaid = false; // 入金済みか echo $customer;
Excelにたとえると、変数は「名前を付けたセル」です。セルに名前を付けておけば、あとから =請求金額*消費税率 のように使えるのと同じです。
| 種類 | 例 | 見分け方 |
|---|---|---|
| 文字列 | "株式会社サガ商事" | " " か ' ' で囲まれている |
| 整数 | 50000 | 囲まれていない、小数点のない数 |
| 小数 | 0.1 | 小数点のある数 |
| 真偽値 | true / false | 「はい/いいえ」の2択 |
| null | null | 「何も入っていない」ことを表す |
"100" と 100 は別物です。引用符で囲むと「文字としての100」になります。CSVから読み込んだ金額が文字列のままになっていて、並べ替えがおかしくなる、という不具合はよくあります。同じ変数に新しい値を入れると、前の値は消えて上書きされます。
$status = "未入金"; $status = "入金済み"; echo $status; // → 入金済み
$ で始まるのが変数(値を入れる箱)= は「右の値を左に入れる」"100" と 100 は別物この章のゴール:金額計算のコードを読み、表示される結果を予想できる。
| 記号 | 意味 | 例 | 結果 |
|---|---|---|---|
+ | 足し算 | 100 + 20 | 120 |
- | 引き算 | 100 - 20 | 80 |
* | 掛け算 | 100 * 3 | 300 |
/ | 割り算 | 100 / 4 | 25 |
% | 割った余り | 10 % 3 | 1 |
PHPでは、文字と文字をつなぐときに .(ドット)を使います。Excelの & と同じ役割です。+ ではない点に注意してください。
$price = 12000; // 単価 $qty = 3; // 数量 $subtotal = $price * $qty; // 小計 36000 $tax = $subtotal * 0.1; // 消費税 3600 echo "合計:" . number_format($subtotal + $tax) . "円";
number_format は、数字に3桁ごとのカンマを付ける命令です。このように、PHPにはよく使う処理があらかじめ用意されています(第7章で詳しく扱います)。
ダブルクォート " " の中に変数を書くと、中身に置き換えてくれます。シングルクォート ' ' では置き換わりません。
$name = "山田"; echo "担当:{$name}"; // → 担当:山田 echo '担当:{$name}'; // → 担当:{$name}(そのまま表示)
0.1 + 0.2 がわずかに 0.3 からずれます。そのため金額は「円単位の整数」で計算し、端数処理を明示するのが基本です。floor(切り捨て)、round(四捨五入)、ceil(切り上げ)という命令がよく使われます。+ - * / %。文字をつなぐのは ." " の中の変数は中身に置き換わるこの章のゴール:if の文を「もし〜なら、〜する」と日本語に置き換えて読める。
プログラムの多くは「条件によって処理を変える」ことでできています。そのための書き方が if(もし)です。Excelの IF関数 と考え方は同じです。
// 購入金額によって送料を決める if ($total >= 10000) { $shipping = 0; // 1万円以上なら送料無料 } elseif ($total >= 5000) { $shipping = 300; // 5千円以上なら300円 } else { $shipping = 500; // それ以外は500円 }
日本語に置き換えると、こうなります。
if (条件) { … }:もし条件に当てはまるなら、{ } の中を実行するelseif (条件) { … }:そうでなくて、この条件に当てはまるならelse { … }:どれにも当てはまらないなら上から順に調べ、最初に当てはまったところだけを実行します。{ }(波かっこ)は「ここからここまでが1つのまとまり」という印です。
| 記号 | 意味 |
|---|---|
== | 等しい(種類の違いは大目に見る) |
=== | 種類まで含めて完全に等しい(こちらが安全) |
!=、!== | 等しくない |
>、>= | より大きい、以上 |
<、<= | より小さい、以下 |
&& | かつ(両方当てはまる) |
|| | または(どちらかが当てはまる) |
! | 〜ではない(反対にする) |
= は「入れる」、== と === は「比べる」です。if ($a = 5) と書くと比べずに5を入れてしまい、いつも条件に当てはまる不具合になります。// 「かつ」を使った例:未入金で、期限を過ぎていたら督促 if ($isPaid === false && $today > $dueDate) { echo "督促メールを送る対象です"; }
if / elseif / else は「もし/そうでなくもし/それ以外」= は入れる、=== は比べるこの章のゴール:一覧データ(配列)と、それを1件ずつ処理する foreach を読める。
変数には1つの値しか入りませんが、配列には複数の値を順番に並べて入れられます。[ ](角かっこ)で囲み、カンマで区切ります。
$items = ["コピー用紙", "ボールペン", "クリアファイル"]; echo $items[0]; // → コピー用紙 echo $items[2]; // → クリアファイル echo count($items); // → 3(件数を数える)
[0]、2件目が [1] です。番号の代わりに名前(キー)を付けて値を入れることもできます。これを連想配列と呼びます。Excelの1行に、列見出しが付いているイメージです。
$invoice = [
"no" => "INV-0012",
"customer" => "株式会社サガ商事",
"amount" => 50000,
];
echo $invoice["customer"]; // → 株式会社サガ商事
=> は「この名前に、この値」という対応を表します。
配列の中身を1件ずつ取り出して、同じ処理を繰り返すのが foreach(それぞれについて)です。このような繰り返しをループと呼びます。
$sales = [120000, 98000, 143000]; // 3か月分の売上 $sum = 0; foreach ($sales as $s) { $sum = $sum + $s; // 1件ずつ足していく } echo number_format($sum) . "円";
foreach ($sales as $s) は「$sales の中身を1件ずつ $s という箱に入れて、{ } の中を繰り返す」と読みます。3件あれば3回繰り返します。Excelで列の合計を出すSUM関数を、手順として書いたものと考えると分かりやすいでしょう。
for や while という繰り返しの書き方もあります。どれも「{ } の中を何度も実行する」点は同じです。[ ] で複数の値をまとめたもの。番号は0から"名前" => 値 で、名前で取り出せるforeach は1件ずつ取り出して繰り返すこの章のゴール:function で作られた処理の「入力」と「出力」を読み取れる。
関数とは、決まった処理に名前を付けたものです。材料を渡すと、加工した結果を返してくれる「小さな機械」と考えてください。Excelの SUM や ROUND も関数です。
| 関数 | 働き | 例 → 結果 |
|---|---|---|
number_format | 3桁ごとにカンマ | number_format(1234567) → 1,234,567 |
count | 配列の件数 | count([5, 8, 2]) → 3 |
round | 四捨五入 | round(2.5) → 3 |
floor | 切り捨て | floor(2.9) → 2 |
date | 日付や時刻 | date("Y-m-d") → 2026-10-22 |
mb_strlen | 日本語の文字数 | mb_strlen("経理部") → 3 |
// 税込金額を求める関数(1円未満は切り捨て) function withTax($price) { return floor($price * 110 / 100); } echo withTax(1980); // → 2178 echo withTax(500); // → 550
| 部分 | 意味 |
|---|---|
function withTax | 「withTax」という名前の関数を作る |
($price) | 受け取る材料。引数(ひきすう)と呼ぶ |
return … | 結果を返す。返された値を戻り値と呼ぶ |
withTax(1980) | 作った関数に1980を渡して使う |
$price * 1.1 ではなく $price * 110 / 100 と書いているのは、第4章で触れた小数の誤差を避けるためです。こうした工夫がコメントに書かれていることも多いので、注目してみてください。
return が結果を返す場所この章のゴール:入力された値がPHPにどう届くかを説明できる。
PHPがもっとも活躍するのは、利用者が入力した内容を受け取って処理する場面です。お問い合わせフォームを例に見てみましょう。
form.html<form method="post" action="contact.php"> 会社名:<input name="company"> メール:<input name="email"> <button>送信する</button> </form>
action="contact.php":送信したら contact.php に届けるmethod="post":送り方(後述)name="company":この入力欄に付けた名前。PHP側はこの名前で受け取るcontact.php<?php $company = $_POST["company"] ?? ""; if ($company === "") { echo "会社名を入力してください"; } else { echo $company . " 様、送信ありがとうございました"; }
| 部分 | 意味 |
|---|---|
$_POST["company"] | フォームの「company」欄に入力された値。$_POST はPHPが自動で用意する連想配列 |
?? "" | 値が送られてこなかったときは、空の文字 "" を使う |
if ($company === "") | 空なら注意を表示する(入力チェック) |
POST($_POST) | GET($_GET) | |
|---|---|---|
| 送り方 | 見えない形で送る | URLの後ろに付けて送る 例: list.php?page=2 |
| 使う場面 | 問い合わせ、ログイン、注文など | 検索、ページ送り、絞り込みなど |
| 注意 | パスワードや個人情報はこちら | URLが履歴に残るので秘密の情報は送らない |
name の名前で、PHP側が値を受け取るこの章のゴール:PHPのコードで「危ない書き方」を3つ見分けられる。
Webサイトは世界中の誰でも使えます。そのため、入力欄には悪意のある文字が入ってくる前提で作る必要があります。PHPでよく問題になるのは、次の3つです。
入力された値をそのまま echo すると、そこにプログラムが仕込まれていた場合、ほかの利用者の画面で動いてしまいます。これをXSS(クロスサイト・スクリプティング)と呼びます。
// 危ない:入力をそのまま表示 echo $_POST["company"]; // 安全:htmlspecialchars で無害な文字に変えてから表示 echo htmlspecialchars($_POST["company"], ENT_QUOTES, "UTF-8");
htmlspecialchars は、< などプログラムとして働く記号を、ただの文字として表示されるように変換する関数です。利用者が入力したものを表示するときは必ず通す、と覚えてください。
会員情報や請求データはデータベース(大量のデータを保存・検索する仕組み)に保存され、SQL(エスキューエル)という命令文で出し入れします。このSQLを入力値とつなぎ合わせて作ると、命令文そのものを書き換えられ、データを盗まれたり消されたりします。
// 危ない:入力値をSQLに直接つなげている $sql = "SELECT * FROM customers WHERE name = '" . $_POST["name"] . "'"; // 安全:? の場所に、あとから値を当てはめる(プリペアドステートメント) $stmt = $pdo->prepare("SELECT * FROM customers WHERE name = ?"); $stmt->execute([$_POST["name"]]);
見分け方は簡単です。SQLの文の中に . で $_POST や $_GET がつながれていたら危険、prepare と ? を使っていれば安全な書き方です。
// 危ない:入力されたパスワードをそのまま保存 $saved = $_POST["password"]; // 安全:元に戻せない形に変換して保存 $saved = password_hash($_POST["password"], PASSWORD_DEFAULT);
万一データが漏れても元のパスワードが分からないよう、password_hash で変換して保存します。
| 危ない書き方 | 安全な書き方 |
|---|---|
入力値をそのまま echo | htmlspecialchars を通して表示 |
SQLに入力値を . でつなぐ | prepare と ? を使う |
| パスワードをそのまま保存 | password_hash で変換して保存 |
htmlspecialcharsprepare と ? で組み立てるpassword_hash で変換して保存この章のゴール:これまでの知識を組み合わせて、20行ほどのコードの動きを説明できる。
未入金の請求だけを一覧にして、合計を表示するプログラムです。まず自分で読んでみて、何が表示されるか予想してください。
unpaid.php<?php // 請求データ(本来はデータベースから取り出す) $invoices = [ ["customer" => "サガ商事", "amount" => 50000, "paid" => true], ["customer" => "有明フーズ", "amount" => 32000, "paid" => false], ["customer" => "唐津工業", "amount" => 78000, "paid" => false], ]; // 金額を「50,000円」の形にする関数 function yen($n) { return number_format($n) . "円"; } $unpaid = 0; foreach ($invoices as $inv) { if ($inv["paid"] === false) { $unpaid = $unpaid + $inv["amount"]; echo htmlspecialchars($inv["customer"]) . ":" . yen($inv["amount"]) . "<br>"; } } echo "未入金の合計:" . yen($unpaid);
| 部分 | 読み方 | 章 |
|---|---|---|
$invoices = [ … ] | 請求3件を、連想配列の配列として入れる。表の3行分にあたる | 3・6 |
function yen($n) | 数字を受け取り、カンマと「円」を付けて返す関数を作る | 4・7 |
$unpaid = 0; | 未入金の合計を入れる箱を0で用意する | 3 |
foreach ($invoices as $inv) | 請求を1件ずつ $inv に入れて繰り返す(3回) | 6 |
if ($inv["paid"] === false) | 入金済みでない請求だけ、中の処理をする | 5 |
$unpaid = $unpaid + … | その請求の金額を合計に足す | 4 |
echo htmlspecialchars(…) | 取引先名を安全な形にして、金額と一緒に表示する | 9 |
最後の echo | 繰り返しが終わった後に、合計を1回だけ表示する | 2 |
知らない書き方に出会ったら、AIに説明してもらうのが近道です。そのときは、コードを貼り付けて次のように頼むと、分かりやすい答えが返ってきます。
次のPHPのコードを、プログラミング未経験の経理担当者にも分かるように、1行ずつ日本語で説明してください。
このPHPのコードに、XSS・SQLインジェクション・パスワードの扱いなど、安全面の問題がないか確認してください。問題があれば、直したコードも見せてください。
このコードで金額を計算している部分について、小数の誤差や端数処理(切り捨て・四捨五入)に問題がないか確認してください。
htmlspecialchars があるか ② SQLに入力値を . でつないでいないか ③ 金額の計算で端数処理がはっきりしているか。$ で始まる、値を入れておく名前付きの箱true(はい)か false(いいえ)の2択のデータif を使い、条件によって処理を変えることforeach などWordPressのテーマファイルや、社内システムのコードを開いて、$・if・foreach・echo を探してみてください。全部は分からなくても「ここで条件を分けている」「ここで一覧を繰り返している」と分かれば、この教材の目標は達成です。