ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
$_POST とは
PHP のスーパーグローバル変数の 1 つで、HTTP POST リクエストで送信された値が連想配列として格納されています。スーパーグローバルなので、関数の中でも global 宣言不要でアクセスできます。
HTML フォームと $_POST の対応
<!-- form.html -->
<form method="post" action="/register.php">
<input type="text" name="username">
<input type="email" name="email">
<input type="password" name="password">
<input type="checkbox" name="agree" value="1">
<select name="role">
<option value="user">一般</option>
<option value="admin">管理者</option>
</select>
<button type="submit">登録</button>
</form>
↑ HTML フォーム例(上記のような POST フォームを想定)。送信先 register.php での受け取り:
<?php
// register.php
var_dump($_POST);
/*
array(5) {
["username"] => string(4) "Taro"
["email"] => string(13) "taro@test.com"
["password"] => string(8) "secret12"
["agree"] => string(1) "1"
["role"] => string(4) "user"
}
*/
$username = $_POST['username'];
$email = $_POST['email'];
↑ 受信側 PHP で $_POST の中身を確認したイメージ。var_dump や print_r で連想配列の内容が見えます。
未定義キー対策
checkbox が未チェック / select が未選択だと、そのキー自体が $_POST に存在しない。直接アクセスすると Warning:
// ❌ Warning: Undefined array key "agree"
$agree = $_POST['agree'];
// ✅ isset で防御
$agree = isset($_POST['agree']) ? $_POST['agree'] : '0';
// ✅ Null Coalescing (PHP 7+)
$agree = $_POST['agree'] ?? '0';
// ✅ filter_input
$agree = filter_input(INPUT_POST, 'agree', FILTER_VALIDATE_INT);
// 推奨: バリデーション関数にまとめる
function postInput(string $key, string $default = ''): string {
return isset($_POST[$key]) ? trim((string)$_POST[$key]) : $default;
}
$username = postInput('username');
セキュリティ対策の三種の神器
1. XSS 対策(出力時)
$comment = $_POST['comment'] ?? '';
// ❌ XSS 脆弱
echo "<p>$comment</p>";
// $comment = "<script>alert(1)</script>" だと実行される
// ✅ htmlspecialchars で対策
echo '<p>' . htmlspecialchars($comment, ENT_QUOTES, 'UTF-8') . '</p>';
2. SQL Injection 対策
// ❌ SQL Injection 脆弱
$email = $_POST['email'];
$pdo->query("SELECT * FROM users WHERE email = '$email'");
// ✅ PDO Prepared Statement
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ?');
$stmt->execute([$_POST['email']]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
// ✅ 名前付きバインド
$stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (:n, :e)');
$stmt->execute([
':n' => $_POST['username'],
':e' => $_POST['email'],
]);
3. CSRF 対策
session_start();
// トークン生成(フォーム表示時)
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
$token = $_SESSION['csrf_token'];
// HTML 側
// <input type="hidden" name="_token" value="<?= $token ?>">
// 受信時に検証
if (!hash_equals($_SESSION['csrf_token'] ?? '', $_POST['_token'] ?? '')) {
http_response_code(419);
die('CSRF token mismatch');
}
$_POST に入らないケース
| ケース | 取得方法 |
|---|---|
JSON ボディ(Content-Type: application/json) | json_decode(file_get_contents("php://input"), true) |
ファイルアップロード(multipart/form-data) | $_FILES |
| PUT / DELETE / PATCH リクエスト | php://input から自前パース |
| カスタム Content-Type | php://input |
post_max_size 超過 | 空になる + warning。php.ini で post_max_size 拡大 |
// JSON 受信
$raw = file_get_contents('php://input');
$data = json_decode($raw, true);
if (!is_array($data)) {
http_response_code(400);
die('Invalid JSON');
}
$username = $data['username'] ?? '';
// ファイルアップロード
if ($_FILES['avatar']['error'] === UPLOAD_ERR_OK) {
move_uploaded_file(
$_FILES['avatar']['tmp_name'],
__DIR__ . '/uploads/' . basename($_FILES['avatar']['name'])
);
}
$_POST vs $_GET vs $_REQUEST
| 変数 | 取得元 | 用途 |
|---|---|---|
$_GET | URL クエリ文字列 (?key=val) | 検索・ページング・冪等な参照 |
$_POST | POST ボディ (application/x-www-form-urlencoded) | 登録・更新・削除 |
$_REQUEST | GET + POST + COOKIE 混合 | ★ 非推奨。意図不明になる |
$_FILES | multipart アップロード | ファイル受信 |
$_COOKIE | クッキー | セッション識別等 |
$_SERVER | サーバ環境変数 | REMOTE_ADDR 等 |
filter_input でバリデーション
// 整数
$age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT, [
'options' => ['min_range' => 0, 'max_range' => 150]
]);
if ($age === false) {
die('年齢が不正');
}
// メール
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ($email === false) {
die('メール形式不正');
}
// URL
$url = filter_input(INPUT_POST, 'url', FILTER_VALIDATE_URL);
// 配列も一括フィルタ
$data = filter_input_array(INPUT_POST, [
'name' => FILTER_DEFAULT,
'age' => FILTER_VALIDATE_INT,
'email' => FILTER_VALIDATE_EMAIL,
]);
Laravel での書き方
use Illuminate\Http\Request;
public function store(Request $request)
{
// 個別取得
$name = $request->input('name');
$age = $request->input('age', 0); // デフォルト値
// 一括取得
$all = $request->all();
$sub = $request->only(['name', 'email']);
$exc = $request->except(['password']);
// バリデーション
$validated = $request->validate([
'name' => 'required|string|max:100',
'email' => 'required|email|unique:users',
'password' => 'required|min:8|confirmed',
]);
User::create($validated);
}
// FormRequest クラスでバリデーション分離(推奨)
class StoreUserRequest extends FormRequest {
public function rules(): array {
return [
'name' => 'required|string|max:100',
'email' => 'required|email|unique:users',
];
}
}
FAQ
Q: $_POST が空になる
A: enctype="multipart/form-data" でもキー名が一致していれば入ります。post_max_size 超過 / Content-Type 違い / php://input を既に読んだ後だと空になることも。
Q: 配列キーで送信したい
A: <input name="items[]"> や <input name="user[name]"> で $_POST["items"] や $_POST["user"]["name"] として受け取れます。
Q: 受信した値の型は?
A: 基本すべて文字列。数値も "123" として入る。型変換は自前で (int)$_POST["age"] 等。
Q: Magic Quotes でクォートに \ が付く
A: PHP 5.4 で廃止済み。古い環境なら stripslashes() で除去。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?