# コードリーディング解説
## 対象ファイル：tokui_list.php / tokui_edit.php

---

# ■ tokui_list.php（得意先一覧画面）

このファイルの役割：
- 得意先マスターの**検索・一覧表示**
- 一覧上で**削除・復活**（論理削除）を実行

---

## ① PHP起動 ＆ 厳格型宣言（1〜2行目）

```php
<?php
declare(strict_types=1);
```

| コード | 説明 | C#との対比 |
|--------|------|-----------|
| `<?php` | PHPコードの開始タグ。これ以降がPHPとして実行される | C#には不要（.csファイルはすべてC#） |
| `declare(strict_types=1)` | 型の厳格チェックを有効化。falseの場合、文字列→数値の暗黙変換などが起きる | C# はデフォルトで厳格。むしろPHPがデフォルトで緩い |

---

## ② 外部ファイルの読み込み（4〜7行目）

```php
require_once __DIR__ . '/../config/app.php';
require_once __DIR__ . '/../config/db_tenant.php';
require_once __DIR__ . '/../common/auth.php';
require_once __DIR__ . '/../common/functions.php';
```

| コード | 説明 | C#との対比 |
|--------|------|-----------|
| `require_once` | 外部PHPファイルを読み込む。`once`付きで2重読み込みを防止 | C#の `using` + アセンブリ参照に近い（ただし物理ファイルを直接ロード） |
| `__DIR__` | 現在のファイルが存在するディレクトリの絶対パス（マジック定数） | `Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)` に近い |
| `'/../config/app.php'` | `__DIR__` から1階層上の `config/app.php` を指す | `..\config\app.php` と同じ意味（スラッシュ方向が逆なだけ） |

> 各ファイルの役割：
> - `app.php` … アプリ全体の定数・設定（`BASE_PATH`など）
> - `db_tenant.php` … DB接続関数（`getTenantDb()`）の定義
> - `auth.php` … 認証関数（`requireLogin()`）の定義
> - `functions.php` … 汎用関数（`get_string()`, `h()`, `redirect()`など）

---

## ③ ログイン確認（9行目）

```php
requireLogin();
```

- `auth.php` で定義された関数。未ログインの場合はログイン画面にリダイレクトして処理を止める。
- C# ASP.NET での `[Authorize]` 属性や `Response.Redirect()` による手動チェックに相当。

---

## ④ DB接続の取得（11行目）

```php
$pdo = getTenantDb();
```

| コード | 説明 | C#との対比 |
|--------|------|-----------|
| `$pdo` | 変数名。PHPでは変数は必ず `$` で始まる | `var pdo = ...` に相当。型宣言は不要（型推論） |
| `getTenantDb()` | `db_tenant.php` で定義。PDOオブジェクト（DB接続）を返す | `new SqlConnection(connectionString)` に相当 |
| `PDO` | PHP Data Objects。PHPの標準DBアクセスクラス | C# の `SqlConnection` / `SqlCommand` を1つにまとめたようなもの |

---

## ⑤ GETパラメータの取得（13〜16行目）

```php
$tokuiManage = get_string('tokui_manage');
$tokuiName   = get_string('tokui_name');
$viewKbn     = get_string('view_kbn', '0'); // 0:有効のみ 1:削除のみ 2:全件
$searched    = get_string('searched', '0');
```

- `get_string()` は `functions.php` で定義された独自ラッパー関数。
- 内部的には `$_GET['tokui_manage'] ?? ''` のような処理をしている（SQLインジェクション対策・型安全）。
- `$_GET` はPHPのスーパーグローバル変数。URLのクエリ文字列（`?tokui_manage=XXX`）を自動で格納する連想配列。
  - C# でいう `Request.QueryString["tokui_manage"]` に相当。
- 第2引数はデフォルト値（パラメータが無い場合に使う値）。

---

## ⑥ メッセージ・エラー変数の初期化（18〜19行目）

```php
$message = get_string('message');
$error   = '';
```

- `$message` … 前画面からリダイレクト時にURLパラメータで受け取る完了メッセージ（例：「削除しました。」）。
- `$error` … このページ内のバリデーションや例外エラーを格納。空文字で初期化。

---

## ⑦ POSTリクエスト処理（削除・復活）（21〜56行目）

```php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
```

- `$_SERVER` はサーバー環境情報を格納するスーパーグローバル変数。
- `REQUEST_METHOD` でHTTPメソッド（GET / POST）を判定。
- C# の `if (Request.HttpMethod == "POST")` または `[HttpPost]` 属性に相当。

```php
    $action = post_string('action');
    $targetTokuiManage = post_string('target_tokui_manage');
```

- `post_string()` は `$_POST[...]` のラッパー（`get_string` のPOST版）。
- `$_POST` … フォームのPOSTデータを格納する連想配列。
  - C# の `Request.Form["action"]` に相当。

```php
    if ($targetTokuiManage === '') {
        $error = '対象の得意先コードが不正です。';
    } else {
```

- `===` は**厳格な等値比較**（型も含めて一致する場合のみtrue）。
- PHPでは `==` は型変換あり（`"0" == false` が true になる）ため、`===` を使うのが安全。
  - C# の `==` は基本的に`===`と同じ動作（参照型は別）。

```php
        try {
            if ($action === 'delete') {
                $sql = "
                    UPDATE M_TOKUI
                    SET DELETEFLG = 1
                    WHERE TOKUI_MANAGE = :tokui_manage
                ";
```

- `$sql` に文字列でSQLを代入。
- `:tokui_manage` は**名前付きプレースホルダー**（パラメータ）。後で`bindValue`で値を紐付ける。
  - C# SqlCommand の `@tokui_manage` に相当。

```php
                $stmt = $pdo->prepare($sql);
```

- `prepare()` … SQLをDBサーバーに事前解析させる（SQLインジェクション対策の第一歩）。
- `$stmt` は `PDOStatement` オブジェクト（C# の `SqlCommand` に相当）。

```php
                $stmt->bindValue(':tokui_manage', $targetTokuiManage, PDO::PARAM_STR);
```

- プレースホルダーに値を紐付ける。
- 第3引数 `PDO::PARAM_STR` で文字列型を明示（C# の `SqlDbType.NVarChar` 指定に相当）。
- これにより**SQLインジェクションを防止**（値はSQL文字列に直接結合されない）。

```php
                $stmt->execute();
```

- SQLを実際に実行。C# の `cmd.ExecuteNonQuery()` に相当（結果セットなしのSQL）。

```php
                redirect('/master/tokui_list.php?searched=1&...' . urlencode($tokuiManage) . ...);
```

- `redirect()` … `functions.php` 定義の独自関数。内部でHTTPヘッダーを送りリダイレクト。
  - C# の `Response.Redirect()` に相当。
- `urlencode()` … URLに安全でない文字（日本語・スペース等）をエンコード。
  - C# の `Uri.EscapeDataString()` に相当。
- PRGパターン（Post/Redirect/Get）の実装。F5で二重送信されないようにするための定石。

```php
        } catch (Throwable $e) {
            $error = '更新中にエラーが発生しました。';
        }
```

- `Throwable` … PHPの例外・エラーの基底インターフェース（`Exception` と `Error` 両方をキャッチ）。
  - C# の `catch (Exception ex)` に相当（ただし C# の `Exception` より広い）。
- エラー詳細（`$e->getMessage()`等）はここでは表示せず、ユーザーには汎用メッセージのみ見せる（セキュリティ上の良い実装）。

---

## ⑧ 検索SQL構築（動的WHERE句）（59〜97行目）

```php
$rows = [];
if ($searched === '1') {
```

- `$rows` … 検索結果を格納する配列。最初は空配列で初期化。
- `$searched === '1'` の場合のみ検索実行（初期表示時は検索しない）。

```php
    $where = [];
    $params = [];
```

- `$where` … WHERE句の条件を文字列配列で収集（後で `AND` でつなぐ）。
- `$params` … バインドするパラメータの連想配列（キー：プレースホルダー名、値：バインド値）。
- この手法は**動的SQL**の定石パターン。C# でも同様のアプローチが使われる。

```php
    $sql = "
        SELECT
            TOKUI_MANAGE,
            TOKUI_NAME,
            ISNULL(DELETEFLG, 0) AS DELETEFLG
        FROM M_TOKUI
        WHERE 1 = 1
    ";
```

- `WHERE 1 = 1` は常にtrueの条件。後続の条件が0件でも構文エラーにならないための定石。
- `ISNULL(DELETEFLG, 0)` … DELETEFLGがNULLの場合は0として扱う（SQL Server構文）。

```php
    if ($tokuiManage !== '') {
        $where[] = "TOKUI_MANAGE LIKE :tokui_manage";
        $params[':tokui_manage'] = '%' . $tokuiManage . '%';
    }
```

- `$where[]` … 配列の末尾に要素を追加（インデックス自動採番）。C# の `list.Add()` に相当。
- `LIKE :tokui_manage` と `'%' . $tokuiManage . '%'` で前後一致検索（あいまい検索）。
- `.` はPHPの**文字列結合演算子**。C# の `+` に相当。

```php
    if ($viewKbn === '0') {
        $where[] = "ISNULL(DELETEFLG, 0) = 0";
    } elseif ($viewKbn === '1') {
        $where[] = "ISNULL(DELETEFLG, 0) <> 0";
    }
    // $viewKbn === '2' の場合は条件追加なし（全件）
```

- `elseif` … C# の `else if` に相当（PHPは `elseif` を1単語でも書ける）。
- `viewKbn === '2'`（全件）のときは何もしないことで全件取得になる。

```php
    if ($where !== []) {
        $sql .= "\n  AND " . implode("\n  AND ", $where);
    }
```

- `$sql .=` … 文字列の末尾に追記（C# の `+= `に相当）。
- `implode("\n  AND ", $where)` … 配列を区切り文字で結合。
  - C# の `String.Join(" AND ", where)` に相当。

```php
    $stmt = $pdo->prepare($sql);
    foreach ($params as $key => $value) {
        $stmt->bindValue($key, $value, PDO::PARAM_STR);
    }
```

- `foreach ($params as $key => $value)` … 連想配列のキーと値をループ。
  - C# の `foreach (var kvp in params) { ... kvp.Key ... kvp.Value ... }` に相当。

```php
    $stmt->execute();
    $rows = $stmt->fetchAll();
```

- `fetchAll()` … 全レコードを2次元連想配列として取得。
  - C# の `DataAdapter.Fill(dt)` や `cmd.ExecuteReader()` でループして `List<T>` に詰めるのに相当。
- `$rows` の各要素は `$row['TOKUI_MANAGE']` のようにカラム名でアクセスできる。

---

## ⑨ HTML部分の開始・ヘッダー（99〜117行目）

```php
?>
<!doctype html>
<html lang="ja">
```

- `?>` でPHPコードブロックを閉じ、以降はHTMLとして出力される。
- PHPでは PHP と HTML を1つのファイルで混在させるのが一般的（テンプレートエンジン的な動作）。
  - C# Razor (.cshtml) の `@{ ... }` と `@variable` の関係に近い。

```php
    <link rel="stylesheet" href="<?= h(BASE_PATH) ?>/assets/css/style.css">
```

- `<?= ... ?>` は `<?php echo ... ?>` の短縮形。値を出力する。
  - C# Razor の `@variable` に相当。
- `h()` … `functions.php` で定義のHTMLエンコード関数（`htmlspecialchars()` のラッパー）。
  - C# の `HttpUtility.HtmlEncode()` に相当。**XSS対策として必須**。
- `BASE_PATH` … `app.php` で定義された定数（`const` 相当）。

---

## ⑩ ヘッダー内のセッション値表示（121〜123行目）

```php
<?= h($_SESSION['company_name']) ?>　
<?= h($_SESSION['user_name']) ?> さん
```

- `$_SESSION` … セッション変数を格納するスーパーグローバル連想配列。
  - C# の `Session["company_name"]` に相当。
- `h()` でXSS対策しながら出力。

---

## ⑪ メッセージ・エラー表示（134〜139行目）

```php
<?php if ($message !== ''): ?>
    <div class="info-box"><?= h($message) ?></div>
<?php endif; ?>
```

- PHPの**代替構文**。`if (...):` 〜 `endif;` の形で HTML 内に埋め込みやすくしている。
  - `if (...) { ... }` と等価。C# Razor の `@if (...) { ... }` に近い書き方。

---

## ⑫ 検索フォーム（141〜170行目）

```php
<form method="get" action="">
    <input type="hidden" name="searched" value="1">
```

- `method="get"` … フォーム送信時にURLのクエリ文字列として送る（ブラウザのアドレスバーに表示される）。
  - 検索フォームは GET が適切（URLで検索条件を共有できる・ブラウザの戻る動作と相性が良い）。
- `type="hidden"` … 非表示のhidden項目。`searched=1` を常に送ることで「検索ボタンが押された」を判定。

```php
<option value="0" <?= $viewKbn === '0' ? 'selected' : '' ?>>有効のみ</option>
```

- `条件 ? 値1 : 値2` … 三項演算子（C# と同じ構文）。
- 現在の `$viewKbn` と一致するオプションに `selected` 属性を付与（選択状態を維持）。

---

## ⑬ 検索結果テーブル（172〜224行目）

```php
<?php if ($searched === '1'): ?>
...
    検索結果：<?= h((string)count($rows)) ?> 件
```

- `count($rows)` … 配列の件数。C# の `rows.Count` に相当。
- `(string)` … 型キャスト。C# の `(string)value` と同じ構文。

```php
<?php if ($rows === []): ?>
    <tr><td colspan="5" class="empty-cell">該当データがありません。</td></tr>
<?php else: ?>
    <?php foreach ($rows as $row): ?>
```

- `foreach ($rows as $row)` … 配列の各要素を `$row` に入れてループ。
  - C# の `foreach (var row in rows)` に相当。

```php
        <?php
        $isDeleted = ((int)$row['DELETEFLG'] !== 0);
        $editUrl = BASE_PATH . '/master/tokui_edit.php?tokui_manage=' . urlencode((string)$row['TOKUI_MANAGE']);
        ?>
```

- `(int)$row['DELETEFLG']` … 文字列を整数に型キャスト（DBからの値は文字列で来ることがある）。
- `$isDeleted` … 削除フラグがtrue/falseかを保持するbool変数。

```php
<form method="post" action="" onsubmit="return confirm('状態を変更します。よろしいですか？');">
    <input type="hidden" name="target_tokui_manage" value="<?= h((string)$row['TOKUI_MANAGE']) ?>">
    <input type="hidden" name="action" value="<?= $isDeleted ? 'restore' : 'delete' ?>">
    <button type="submit" class="btn-secondary"><?= $isDeleted ? '復活' : '削除' ?></button>
</form>
```

- 各行に個別のformを持つパターン。hidden項目で対象コードとアクション種別を送る。
- `onsubmit="return confirm(...)"` … JavaScriptの確認ダイアログ。`false`を返すと送信キャンセル。
- 削除済みなら「復活」ボタン・`restore`アクション、有効なら「削除」ボタン・`delete`アクション。

```php
<?php if ($isDeleted): ?>
    <span class="mode-badge mode-3">削除</span>
<?php else: ?>
    <span class="mode-badge mode-1">有効</span>
<?php endif; ?>
```

- 状態を視覚的に表示するバッジ。CSSクラスで色分け。

---
---

# ■ tokui_edit.php（得意先新規登録・編集画面）

このファイルの役割：
- URLに `tokui_manage` パラメータがある → **編集モード**（既存データ読み込み→UPDATE）
- パラメータがない → **新規登録モード**（INSERT）
- 1つのファイルで新規・編集を兼用するのがPHPでよくあるパターン。

---

## ① 初期化部分（1〜19行目）

※ `tokui_list.php` の①〜④と同様のため省略。

```php
$targetTokuiManage = get_string('tokui_manage');

$isEdit = ($targetTokuiManage !== '');
```

- GETパラメータ `tokui_manage` を取得。
- 値があれば `$isEdit = true`（編集モード）、なければ `false`（新規モード）。
- C# で言うと `bool isEdit = !string.IsNullOrEmpty(targetTokuiManage)` に相当。

```php
$formTokuiManage = '';
$formTokuiName   = '';
$formDeleteFlg   = '0';
```

- フォームに表示する値の初期化。新規モードのデフォルト値。
- バリデーションエラー時もここに入力値を再格納し、フォームに「入力した値」が残るようにする。

---

## ② 編集モードの初期データ読み込み（21〜39行目）

```php
if ($isEdit && $_SERVER['REQUEST_METHOD'] !== 'POST') {
```

- 編集モード かつ 初期表示（POSTではない = GETリクエスト）のときだけ実行。
- 同じ if ブロックをPOST時に実行してしまうと、POSTデータより古いDBデータで上書きしてしまうため。
  - C# の `if (!IsPostBack)` と同じ考え方（WebFormsに馴染みがあれば特に）。

```php
    $stmt->execute();
    $row = $stmt->fetch();

    if (!$row) {
        exit('対象データが見つかりません。');
    }
```

- `fetch()` … 1レコード取得（`fetchAll()` の1件版）。C# の `ExecuteReader()` + `Read()` に相当。
- データが無ければ `exit()` で即終了（エラーページの代わり）。
  - C# の `Response.End()` に近いが、`exit()` はPHP全体を即停止する。

```php
    $formTokuiManage = (string)$row['TOKUI_MANAGE'];
    $formTokuiName   = (string)($row['TOKUI_NAME'] ?? '');
    $formDeleteFlg   = (string)$row['DELETEFLG'];
```

- DBから取得した値をフォーム表示用変数に格納。
- `$row['TOKUI_NAME'] ?? ''` … Null合体演算子。`TOKUI_NAME` がNULLなら空文字を使う。
  - C# の `row["TOKUI_NAME"] ?? ""` と全く同じ構文・意味。

---

## ③ POSTリクエスト処理（41〜106行目）

```php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $isEditPost      = (post_string('is_edit') === '1');
    $formTokuiManage = post_string('tokui_manage');
    $formTokuiName   = post_string('tokui_name');
    $formDeleteFlg   = post_string('deleteflg', '0');
```

- POSTデータからフォーム入力値を取得。
- `$isEditPost` … フォームのhidden項目 `is_edit` で「編集か新規か」を判定。
  - URLパラメータではなくformのhiddenで持つのは、URLを直接いじられた際の誤動作防止。

---

## ④ バリデーション（49〜62行目）

```php
    if ($formTokuiManage === '') {
        $error = '得意先コードを入力してください。';
    } elseif (mb_strlen($formTokuiManage) > 12) {
        $error = '得意先コードは12文字以内で入力してください。';
    } elseif ($formTokuiName === '') {
        $error = '得意先名を入力してください。';
    } elseif (mb_strlen($formTokuiName) > 40) {
        $error = '得意先名は40文字以内で入力してください。';
    } elseif (!in_array($formDeleteFlg, ['0', '1'], true)) {
        $error = '状態の値が不正です。';
    } else {
        // DB処理へ
    }
```

- `elseif` を連ねて入力チェック。最初のエラーが発生した時点で以降はスキップ（早期リターンと同様）。
- `mb_strlen()` … マルチバイト文字（日本語）対応の文字列長取得。
  - 通常の `strlen()` はバイト数を返すため、日本語は1文字3バイトとなり誤カウントになる。
  - C# の `string.Length` は常に文字数（Unicodeコードポイント単位）で正しい。
- `in_array($formDeleteFlg, ['0', '1'], true)` … 値が配列に含まれるか確認。
  - 第3引数 `true` で厳格比較（型も一致）。
  - C# の `new[] {"0", "1"}.Contains(formDeleteFlg)` に相当。
- `!` で否定（C# と同じ）。

---

## ⑤ UPDATE処理（編集時）（63〜76行目）

```php
            if ($isEditPost) {
                $sql = "
                    UPDATE M_TOKUI
                    SET
                        TOKUI_NAME = :tokui_name,
                        DELETEFLG  = :deleteflg
                    WHERE TOKUI_MANAGE = :tokui_manage
                ";
                $stmt = $pdo->prepare($sql);
                $stmt->bindValue(':tokui_name',   $formTokuiName, PDO::PARAM_STR);
                $stmt->bindValue(':deleteflg',    (int)$formDeleteFlg, PDO::PARAM_INT);
                $stmt->bindValue(':tokui_manage', $formTokuiManage, PDO::PARAM_STR);
                $stmt->execute();

                redirect('/master/tokui_list.php?searched=1&message=' . urlencode('更新しました。'));
            }
```

- `PDO::PARAM_INT` … 整数型としてバインド（DELETEFLGは数値型カラムのため）。
  - `(int)$formDeleteFlg` で文字列→整数型キャスト。

---

## ⑥ INSERT処理（新規登録時）（77〜106行目）

```php
            } else {
                $sqlCheck = "
                    SELECT COUNT(*)
                    FROM M_TOKUI
                    WHERE TOKUI_MANAGE = :tokui_manage
                ";
                $stmtCheck = $pdo->prepare($sqlCheck);
                $stmtCheck->bindValue(':tokui_manage', $formTokuiManage, PDO::PARAM_STR);
                $stmtCheck->execute();
                $exists = (int)$stmtCheck->fetchColumn();

                if ($exists > 0) {
                    $error = '同じ得意先コードが既に存在します。';
```

- `fetchColumn()` … 1行1列の値を取得（`COUNT(*)` の結果取得に最適）。
  - C# の `(int)cmd.ExecuteScalar()` に相当。
- INSERT前に重複チェックを行い、既存コードがあればエラーメッセージを設定。

```php
                } else {
                    $sql = "
                        INSERT INTO M_TOKUI (
                            TOKUI_MANAGE,
                            TOKUI_NAME,
                            DELETEFLG
                        )
                        VALUES (
                            :tokui_manage,
                            :tokui_name,
                            :deleteflg
                        )
                    ";
                    $stmt = $pdo->prepare($sql);
                    $stmt->bindValue(':tokui_manage', $formTokuiManage, PDO::PARAM_STR);
                    $stmt->bindValue(':tokui_name',   $formTokuiName, PDO::PARAM_STR);
                    $stmt->bindValue(':deleteflg',    (int)$formDeleteFlg, PDO::PARAM_INT);
                    $stmt->execute();

                    redirect('/master/tokui_list.php?searched=1&message=' . urlencode('登録しました。'));
                }
```

- `prepare → bindValue → execute` のパターンはUPDATE/INSERT/DELETE共通。
- INSERT成功後はリダイレクト（PRGパターン）。

---

## ⑦ HTML部分（108行目〜）

```php
<title><?= h($isEdit ? '得意先マスター編集' : '得意先マスター新規登録') ?> | rerent_web</title>
```

- `$isEdit` の値でタイトルを切り替え。三項演算子で1行に収める。

```php
<h1><?= h($isEdit ? '得意先マスター編集' : '得意先マスター新規登録') ?></h1>
```

- ページ見出しも同様に切り替え。

---

```php
<input type="hidden" name="is_edit" value="<?= $isEdit ? '1' : '0' ?>">
```

- 編集/新規の判定をPOST時に引き継ぐhidden項目。
- URLパラメータを参照しない理由：POST時にURLが変わっても対応できるようにするため。

```php
<input
    type="text"
    name="tokui_manage"
    id="tokui_manage"
    value="<?= h($formTokuiManage) ?>"
    maxlength="12"
    <?= $isEdit ? 'readonly' : '' ?>
>
```

- 編集時は `readonly` 属性付与（得意先コードは変更不可）。
- 新規時は属性なし（空文字が出力される）。
- `maxlength="12"` は**クライアントサイドの制限**（ブラウザ側）。サーバー側の `mb_strlen` チェックと二重防衛。

```php
<select name="deleteflg" id="deleteflg">
    <option value="0" <?= $formDeleteFlg === '0' ? 'selected' : '' ?>>有効</option>
    <option value="1" <?= $formDeleteFlg === '1' ? 'selected' : '' ?>>削除</option>
</select>
```

- `list.php` 側と同様のselected制御。フォームの「状態」ドロップダウン。

---

# ■ 全体のまとめ：重要概念の対比表

| PHP | C# 相当 | 説明 |
|-----|---------|------|
| `$variable` | `var x = ...` | 変数（常に$プレフィックス） |
| `$_GET['key']` | `Request.QueryString["key"]` | GETパラメータ |
| `$_POST['key']` | `Request.Form["key"]` | POSTパラメータ |
| `$_SESSION['key']` | `Session["key"]` | セッション値 |
| `$_SERVER['REQUEST_METHOD']` | `Request.HttpMethod` | HTTPメソッド |
| `require_once 'file.php'` | `using` + アセンブリ参照 | 外部ファイル読み込み |
| `PDO` | `SqlConnection` + `SqlCommand` | DB接続・操作 |
| `prepare() + bindValue()` | `SqlCommand + AddWithValue()` | SQLパラメータ化 |
| `execute()` | `ExecuteNonQuery()` | SQL実行（更新系） |
| `fetchAll()` | `DataAdapter.Fill()` | 全レコード取得 |
| `fetch()` | `reader.Read()` | 1レコード取得 |
| `fetchColumn()` | `ExecuteScalar()` | スカラー値取得 |
| `implode(',', $arr)` | `String.Join(",", arr)` | 配列を文字列結合 |
| `count($arr)` | `arr.Count` | 配列件数 |
| `mb_strlen($str)` | `str.Length` | 文字数取得（日本語対応） |
| `urlencode($str)` | `Uri.EscapeDataString()` | URLエンコード |
| `h($str)` ※独自関数 | `HttpUtility.HtmlEncode()` | HTMLエンコード（XSS対策） |
| `===` | `==`（値型）| 厳格等値比較 |
| `??` | `??` | Null合体演算子（同じ） |
| `(int)$x` | `(int)x` | 型キャスト（同じ構文） |
| `Throwable` | `Exception` | 例外の基底 |
| `exit()` | `Response.End()` | 処理即時終了 |
| `<?= h($var) ?>` | `@Html.Encode(var)` (Razor) | HTML出力 |
| `if (...): ... endif;` | `@if (...) { ... }` (Razor) | テンプレート内if |
