リクエスト詳細
🐛 バグ報告
対応完了
対象アプリ: StudyNova(スタディノヴァ)
sn_refresh_user_progress() の戻り値に total_correct / total_attempts が含まれず achievements.php で未定義キー参照になる不具合
## 1. 不具合の内容
achievements.php の以下の箇所が `$progress['total_correct']` および `$progress['total_attempts']` を直接参照している:
```php
<div class="value"><?= (int)$progress['total_correct'] ?> / <?= (int)$progress['total_attempts'] ?></div>
```
しかし `sn_user_progress` テーブルの定義 (schema.sql) には `total_correct` および `total_attempts` 列が存在しない。同テーブルが持つのは `total_xp / level_no / current_streak_days / longest_streak_days / best_correct_streak / current_correct_streak / last_active_date / updated_at` のみである。
## 2. 根拠・発生しそうな条件
- schema.sql の `sn_user_progress` CREATE TABLE 定義に `total_correct` / `total_attempts` 列が見当たらない。
- `sn_refresh_user_progress()` はこのテーブルを SELECT して返す関数と推測されるため、戻り値配列にも両キーが含まれない。
- 結果として `$progress['total_correct']` および `$progress['total_attempts']` は未定義キーとなり、PHP Notice が発生し値は常に `(int)null = 0` と表示される。
- ログイン済みユーザーが実績ページ (`?page=achievements`) を開くたびに再現する。
## 3. 期待動作
累計正解数・累計解答数が正しく表示されること。
## 4. 修正方針
**方針A(推奨)**: `sn_refresh_user_progress()` 内で `sn_user_progress` を SELECT した後、`sn_attempts` テーブルから該当 `user_id` の `COUNT(*)`(total_attempts)および `SUM(is_correct)`(total_correct)を集計し、戻り値配列にマージして返す。テーブル定義は変更不要。
```php
// sn_refresh_user_progress() の戻り値構築部分に追記
$st2 = app_db()->prepare(
"SELECT COUNT(*) AS total_attempts, SUM(is_correct) AS total_correct
FROM sn_attempts WHERE user_id = ?"
);
$st2->execute([$user_id]);
$agg = $st2->fetch();
$row['total_attempts'] = (int)($agg['total_attempts'] ?? 0);
$row['total_correct'] = (int)($agg['total_correct'] ?? 0);
return $row;
```
**方針B(予防)**: achievements.php 側で `?? 0` を追加し Notice だけ抑止する(根本解決ではないが即時対応として):
```php
<div class="value"><?= (int)($progress['total_correct'] ?? 0) ?> / <?= (int)($progress['total_attempts'] ?? 0) ?></div>
```
方針A と方針B を両方適用することで、根本的な正しい値の表示と Notice 抑止を同時に達成できる。既存のテーブル構造・他ページへの影響なし。
achievements.php の以下の箇所が `$progress['total_correct']` および `$progress['total_attempts']` を直接参照している:
```php
<div class="value"><?= (int)$progress['total_correct'] ?> / <?= (int)$progress['total_attempts'] ?></div>
```
しかし `sn_user_progress` テーブルの定義 (schema.sql) には `total_correct` および `total_attempts` 列が存在しない。同テーブルが持つのは `total_xp / level_no / current_streak_days / longest_streak_days / best_correct_streak / current_correct_streak / last_active_date / updated_at` のみである。
## 2. 根拠・発生しそうな条件
- schema.sql の `sn_user_progress` CREATE TABLE 定義に `total_correct` / `total_attempts` 列が見当たらない。
- `sn_refresh_user_progress()` はこのテーブルを SELECT して返す関数と推測されるため、戻り値配列にも両キーが含まれない。
- 結果として `$progress['total_correct']` および `$progress['total_attempts']` は未定義キーとなり、PHP Notice が発生し値は常に `(int)null = 0` と表示される。
- ログイン済みユーザーが実績ページ (`?page=achievements`) を開くたびに再現する。
## 3. 期待動作
累計正解数・累計解答数が正しく表示されること。
## 4. 修正方針
**方針A(推奨)**: `sn_refresh_user_progress()` 内で `sn_user_progress` を SELECT した後、`sn_attempts` テーブルから該当 `user_id` の `COUNT(*)`(total_attempts)および `SUM(is_correct)`(total_correct)を集計し、戻り値配列にマージして返す。テーブル定義は変更不要。
```php
// sn_refresh_user_progress() の戻り値構築部分に追記
$st2 = app_db()->prepare(
"SELECT COUNT(*) AS total_attempts, SUM(is_correct) AS total_correct
FROM sn_attempts WHERE user_id = ?"
);
$st2->execute([$user_id]);
$agg = $st2->fetch();
$row['total_attempts'] = (int)($agg['total_attempts'] ?? 0);
$row['total_correct'] = (int)($agg['total_correct'] ?? 0);
return $row;
```
**方針B(予防)**: achievements.php 側で `?? 0` を追加し Notice だけ抑止する(根本解決ではないが即時対応として):
```php
<div class="value"><?= (int)($progress['total_correct'] ?? 0) ?> / <?= (int)($progress['total_attempts'] ?? 0) ?></div>
```
方針A と方針B を両方適用することで、根本的な正しい値の表示と Notice 抑止を同時に達成できる。既存のテーブル構造・他ページへの影響なし。
💬 返信 (4)
🛠 開発を開始しました (バグ修正 (studynova))
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
[管理者]
📡 GitHub Actions の deploy workflow を再トリガーしました
PR #796 の merge から 16 分経過しても workflow run が見つからなかったため、手動で再起動しました。
通常 5〜10 分で完了します。
📡 GitHub Actions の deploy workflow を再トリガーしました
PR #796 の merge から 16 分経過しても workflow run が見つからなかったため、手動で再起動しました。
通常 5〜10 分で完了します。
✅ リリース完了のお知らせ
ご要望いただいた「StudyNova(スタディノヴァ)」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=studynova
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/studynova/
ご利用ありがとうございます!
(deploy 自動リカバリにより通知が遅延した可能性があります。 DEPLOY-RECOVERY-01)
ご要望いただいた「StudyNova(スタディノヴァ)」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=studynova
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/studynova/
ご利用ありがとうございます!
(deploy 自動リカバリにより通知が遅延した可能性があります。 DEPLOY-RECOVERY-01)
Echo
Iris