ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
ダブルクォート vs シングルクォートの違い
| エスケープ | シングル '...' | ダブル "..." | 意味 |
|---|---|---|---|
\n | そのまま \n | 改行 (LF) | Line Feed (0x0A) |
\r | そのまま \r | キャリッジリターン | CR (0x0D) |
\t | そのまま \t | 水平タブ | 0x09 |
\v | そのまま | 垂直タブ | 0x0B |
\f | そのまま | 改ページ | 0x0C |
\0 | そのまま | ヌル文字 | 0x00 |
\\ | バックスラッシュ | バックスラッシュ | 両方OK |
\' | シングルクォート | そのまま \' | - |
\" | そのまま \" | ダブルクォート | - |
\$ | そのまま \$ | $ 記号(変数展開抑止) | - |
\xNN | そのまま | 16進文字 (例 \x41 → A) | - |
\NNN | そのまま | 8進文字 | - |
\u{NNNN} | そのまま | Unicode (PHP 7+) | 例 \u{1F600} → 😀 |
具体例
// シングルクォート: \n はそのまま文字
echo 'Hello\nWorld';
// → Hello\nWorld (改行されない)
// ダブルクォート: \n は改行
echo "Hello\nWorld";
// → Hello
// World
// 変数展開
$name = 'Taro';
echo 'Hello, $name'; // Hello, $name (展開されない)
echo "Hello, $name"; // Hello, Taro
echo "Hello, \$name"; // Hello, $name (\$ でエスケープ)
// 配列・オブジェクト展開
$arr = ['name' => 'Taro'];
echo "Hello, {$arr['name']}"; // Hello, Taro
echo "Hello, $arr[name]"; // Hello, Taro (簡易記法、キーはクォートなし)
// Unicode (PHP 7+)
echo "\u{1F600}"; // 😀
echo "\u{3042}"; // あ
// 16進文字
echo "\x41\x42\x43"; // ABC
heredoc と nowdoc
複数行の文字列リテラルは heredoc / nowdoc がベター:
$name = 'Taro';
// heredoc - ダブルクォートと同じ動作(変数展開あり)
$html = <<<HTML
<div>
Hello, $name
</div>
HTML;
// nowdoc - シングルクォートと同じ動作(変数展開なし)
$raw = <<<'TEXT'
Path: C:\Users\$name
\nは改行しません
TEXT;
// インデント付き heredoc (PHP 7.3+)
function getHtml(): string {
return <<<HTML
<div>
<p>$name</p>
</div>
HTML;
// 終端タグのインデント分が全行から削除される
}
HTML エスケープ (XSS 対策)
ユーザー入力をそのまま HTML に出すと XSS。必ず htmlspecialchars():
// ❌ XSS 脆弱
echo "<p>Hello, $name</p>";
// $name = "<script>alert(1)</script>" だと実行される
// ✅ htmlspecialchars で対策
echo "<p>Hello, " . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . "</p>";
// 第2引数のフラグ
// ENT_QUOTES - シングル+ダブル両方をエスケープ(推奨)
// ENT_HTML5 - HTML5 仕様(XHTML は ENT_XHTML)
// ENT_SUBSTITUTE - 不正バイト列を U+FFFD に置換
// ENT_DISALLOWED - 文書型で許可されない文字を置換
// 推奨フォーム
function h($s): string {
return htmlspecialchars($s ?? '', ENT_QUOTES | ENT_HTML5 | ENT_SUBSTITUTE, 'UTF-8');
}
echo "<p>" . h($name) . "</p>";
// htmlentities - htmlspecialchars + 全文字エンティティ化(重い、通常不要)
echo htmlentities('é', ENT_QUOTES, 'UTF-8'); // é
| 文字 | エスケープ後 |
|---|---|
& | & |
< | < |
> | > |
" | " |
' | ' (ENT_QUOTES) |
SQL Injection 対策 (PDO Prepared Statement)
絶対に文字列連結で SQL を組まないのが鉄則:
// ❌ SQL Injection 脆弱
$id = $_GET['id']; // "1 OR 1=1"
$pdo->query("SELECT * FROM users WHERE id = $id");
// ❌ addslashes だけでは不十分(マルチバイト攻撃に弱い)
$id = addslashes($_GET['id']);
$pdo->query("SELECT * FROM users WHERE id = '$id'");
// ✅ Prepared Statement で安全
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$_GET['id']]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
// ✅ 名前付きバインド
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute([':email' => $email]);
// LIKE 句のワイルドカードエスケープ
$keyword = str_replace(['\\', '%', '_'], ['\\\\', '\\%', '\\_'], $keyword);
$stmt = $pdo->prepare("SELECT * FROM logs WHERE msg LIKE ? ESCAPE '\\\\'");
$stmt->execute(["%{$keyword}%"]);
JSON / URL エスケープ
// JSON
$arr = ['name' => 'Taro', 'msg' => 'Hello "World"'];
echo json_encode($arr); // {"name":"Taro","msg":"Hello \"World\""}
echo json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
// URL
$keyword = 'php 入門';
$url = 'https://example.com/search?q=' . urlencode($keyword);
// → ?q=php+%E5%85%A5%E9%96%80
// rawurlencode - スペースを + ではなく %20 に
$path = 'docs/' . rawurlencode($filename);
// パラメータ全部
$params = ['q' => $keyword, 'page' => 2];
$url = 'https://example.com/search?' . http_build_query($params);
非推奨: addslashes / stripslashes / Magic Quotes
古い記事で出てくる addslashes 系はもう使わないでください:
// ❌ 非推奨(古い解説に出てくる)
$safe = addslashes($input); // ' " \ \0 にバックスラッシュ追加
$orig = stripslashes($safe);
// ❌ Magic Quotes は PHP 5.4 で廃止
get_magic_quotes_gpc(); // 常に false (PHP 5.4+)、PHP 8 で関数自体削除
// ✅ 現代の対策
// SQL → PDO Prepared Statement
// HTML → htmlspecialchars
// JSON → json_encode
// シェル → escapeshellarg / escapeshellcmd
PHP コードを文字列に埋めたいとき
// nowdoc が最強(変数展開もエスケープも不要)
$snippet = <<<'PHP'
<?php
$name = $_POST['name'] ?? '';
echo htmlspecialchars($name);
PHP;
// HTML として出すなら全てエスケープ
echo '<pre>' . htmlspecialchars($snippet, ENT_QUOTES, 'UTF-8') . '</pre>';
FAQ
Q: シングルとダブル、どちらを使うべき?
A: 変数展開・エスケープシーケンスが要らないならシングル(わずかに高速)。展開したいときだけダブル。
Q: 全角スペースもエスケープ必要?
A: 不要。HTML エスケープ対象は & / < / > / " / ' のみ。
Q: str_replace で自前エスケープを書くのは?
A: 危険。順序・抜けが起きやすい。必ず標準関数 htmlspecialchars / json_encode / PDO::prepare を使ってください。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子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
コメントを削除してもよろしいでしょうか?