リクエスト詳細
🐛 バグ報告
対応完了
対象アプリ: WasteLog
contractors.php の新規登録フォームで action=new&id=0 の場合に $item 取得ロジックが機能しない(編集フォームが空表示になる)
## 1. 不具合の内容
`pages/contractors.php` の編集フォーム表示ロジックに条件バグがあります。
```php
if (($action === 'edit' || $action === 'new') && $id > 0) {
$stmt = $pdo->prepare('SELECT * FROM contractors WHERE id = ?');
$stmt->execute([$id]);
$item = $stmt->fetch();
if (!$item) die('処理委託先が見つかりません。');
}
```
`action=edit` のときは `id > 0` が正しく機能しますが、`action=new` のときは `id=0`(未指定)であるため条件 `$id > 0` が偽となり `$item = null` のまま進みます。これ自体は新規登録では正しい動作です。
**問題は `$form` の組み立て部分と `$show_form` の連動**にあります。バリデーションエラー後のリダイレクトなしの再表示時に、`$action` がPOST後にGETパラメータから取れなくなり(POSTリクエストにはGETパラメータが引き継がれない場合がある)、`$show_form` が `$errors` だけを頼りに `true` になりますが、`$form` は `$item ?: [...]` のフォールバックで初期値に戻ってしまい、**ユーザーが入力した内容がバリデーションエラー後にすべて消える**という問題が発生します。
同様の問題は `pages/departments.php` にも存在します。
## 2. 根拠・発生条件
- `contractors.php` でバリデーションエラー(例:会社名未入力・種別未選択)が発生した場合、`$item = null` のままなので `$form = $item ?: ['id'=>0,'name'=>'',...]` が初期値配列にフォールバックします。
- フォームの各 `value="<?= h($form['name']) ?>"` などはすべて空文字になり、入力済みの値が失われます。
- ユーザーは入力をやり直す必要があり、UX的に破綻しています。
- `departments.php` でも全く同じパターンが存在します。
## 3. 期待動作
バリデーションエラー時は入力済みの値をフォームに再表示し、ユーザーが修正できる状態を維持すること。
## 4. 修正方針
POST処理でバリデーションエラーが発生した場合、`$_POST` の値から `$form` を組み立てるよう分岐を追加します。
**`pages/contractors.php` の修正箇所:**
```php
// POST バリデーションエラー時は $_POST から $form を復元する
$form = $item ?: ['id'=>0,'name'=>'','type'=>'収集運搬','license_no'=>'','license_expiry'=>'','contact_name'=>'','phone'=>'','email'=>'','note'=>''];
// ↓ この行を追加($errors がある場合は POST 値で上書き)
if ($errors) {
$form = [
'id' => (int)post('id'),
'name' => post('name'),
'type' => post('type'),
'license_no' => post('license_no'),
'license_expiry' => post('license_expiry'),
'contact_name' => post('contact_name'),
'phone' => post('phone'),
'email' => post('email'),
'note' => post('note'),
];
}
```
**`pages/departments.php` も同様に修正:**
```php
if ($errors) {
$form = [
'id' => (int)post('id'),
'name' => post('name'),
'note' => post('note'),
];
}
```
既存の正常系(新規登録・編集・削除)には影響しません。
`pages/contractors.php` の編集フォーム表示ロジックに条件バグがあります。
```php
if (($action === 'edit' || $action === 'new') && $id > 0) {
$stmt = $pdo->prepare('SELECT * FROM contractors WHERE id = ?');
$stmt->execute([$id]);
$item = $stmt->fetch();
if (!$item) die('処理委託先が見つかりません。');
}
```
`action=edit` のときは `id > 0` が正しく機能しますが、`action=new` のときは `id=0`(未指定)であるため条件 `$id > 0` が偽となり `$item = null` のまま進みます。これ自体は新規登録では正しい動作です。
**問題は `$form` の組み立て部分と `$show_form` の連動**にあります。バリデーションエラー後のリダイレクトなしの再表示時に、`$action` がPOST後にGETパラメータから取れなくなり(POSTリクエストにはGETパラメータが引き継がれない場合がある)、`$show_form` が `$errors` だけを頼りに `true` になりますが、`$form` は `$item ?: [...]` のフォールバックで初期値に戻ってしまい、**ユーザーが入力した内容がバリデーションエラー後にすべて消える**という問題が発生します。
同様の問題は `pages/departments.php` にも存在します。
## 2. 根拠・発生条件
- `contractors.php` でバリデーションエラー(例:会社名未入力・種別未選択)が発生した場合、`$item = null` のままなので `$form = $item ?: ['id'=>0,'name'=>'',...]` が初期値配列にフォールバックします。
- フォームの各 `value="<?= h($form['name']) ?>"` などはすべて空文字になり、入力済みの値が失われます。
- ユーザーは入力をやり直す必要があり、UX的に破綻しています。
- `departments.php` でも全く同じパターンが存在します。
## 3. 期待動作
バリデーションエラー時は入力済みの値をフォームに再表示し、ユーザーが修正できる状態を維持すること。
## 4. 修正方針
POST処理でバリデーションエラーが発生した場合、`$_POST` の値から `$form` を組み立てるよう分岐を追加します。
**`pages/contractors.php` の修正箇所:**
```php
// POST バリデーションエラー時は $_POST から $form を復元する
$form = $item ?: ['id'=>0,'name'=>'','type'=>'収集運搬','license_no'=>'','license_expiry'=>'','contact_name'=>'','phone'=>'','email'=>'','note'=>''];
// ↓ この行を追加($errors がある場合は POST 値で上書き)
if ($errors) {
$form = [
'id' => (int)post('id'),
'name' => post('name'),
'type' => post('type'),
'license_no' => post('license_no'),
'license_expiry' => post('license_expiry'),
'contact_name' => post('contact_name'),
'phone' => post('phone'),
'email' => post('email'),
'note' => post('note'),
];
}
```
**`pages/departments.php` も同様に修正:**
```php
if ($errors) {
$form = [
'id' => (int)post('id'),
'name' => post('name'),
'note' => post('note'),
];
}
```
既存の正常系(新規登録・編集・削除)には影響しません。
💬 返信 (3)
🛠 開発を開始しました (バグ修正 (wastelog))
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「WasteLog」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=wastelog
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/wastelog/
ご利用ありがとうございます!
ご要望いただいた「WasteLog」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=wastelog
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/wastelog/
ご利用ありがとうございます!
Echo
Iris