リクエスト詳細
🐛 バグ報告
対応完了
対象アプリ: StudyNova(スタディノヴァ)
sn_refresh_user_progress() の戻り値に current_correct_streak が含まれず achievements.php で 0 固定になる不具合
## 1. 不具合の内容
achievements.php の「連続正解」カードでは `$progress['current_correct_streak'] ?? 0` を表示しているが、`sn_refresh_user_progress()` が返す配列(`sn_user_progress` テーブルの行)には `current_correct_streak` カラムが存在しない。
`schema.sql` の `sn_user_progress` テーブルを確認すると、カラムは以下のとおり定義されている:
```
total_xp, level_no, current_streak_days, longest_streak_days,
best_correct_streak, last_active_date, updated_at
```
`current_correct_streak`(現在進行中の連続正解数)カラムが **テーブルに存在しない**。
そのため `$progress['current_correct_streak'] ?? 0` は常に `0` を返し、連続正解中であっても「0 問」と表示される。
また `sn_next_badge_hints()` 内で同キーを参照している場合、`correct_streak` バッジの進捗バーも常に 0% になる。
## 2. 根拠・発生条件
- `schema.sql` の `sn_user_progress` CREATE TABLE に `current_correct_streak` カラムが **存在しない**(`best_correct_streak` のみ)。
- achievements.php 36 行目付近: `(int)($progress['current_correct_streak'] ?? 0)` で参照している。
- PHP `PDO::FETCH_ASSOC` でフェッチした連想配列にキーが無いため、`??` フォールバックで常に 0 になる(PHP Notice は出ないが表示が常時 0 になる機能バグ)。
- `sn_next_badge_hints()` も同じ `$progress` 配列から `current_correct_streak` を参照していると推定されるため、次のバッジヒントの進捗表示も 0 のまま。
## 3. 期待動作
- 直近の解答セッションで連続正解した問題数が「連続正解 N 問」に正しく表示される。
- `correct_streak` バッジの進捗バーが実際の連続正解数を反映する。
## 4. 修正方針
### A. テーブルにカラムを追加 (schema.sql + MIGRATION)
```sql
-- schema.sql の sn_user_progress に追加
current_correct_streak SMALLINT UNSIGNED NOT NULL DEFAULT 0,
```
MIGRATION コメントも追記:
```sql
-- MIGRATION: ALTER TABLE sn_user_progress ADD COLUMN current_correct_streak SMALLINT UNSIGNED NOT NULL DEFAULT 0;
```
既存環境では `sn_ensure_question_columns()` と同様の `sn_ensure_progress_columns()` 関数(または既存の起動時 ALTER チェック処理)で冪等に追加する。
### B. sn_refresh_user_progress() を修正
問題に解答するたびに呼ばれる進捗更新関数内で、正解が続いているうちは `current_correct_streak` をインクリメントし、不正解時に 0 にリセットする処理を追加する。
`best_correct_streak` は `current_correct_streak` が更新されるたびに `MAX` 比較で上書きする(既存ロジックと整合)。
### C. sn_next_badge_hints() の参照キー確認
`correct_streak` バッジの進捗計算で `$progress['current_correct_streak']` を参照している箇所を確認し、カラム追加後に正しい値が渡るようにする。
### 後方互換
- 既存データの `current_correct_streak` は `DEFAULT 0` で初期化されるため、既存ユーザーのスコアや `best_correct_streak` には影響しない。
- achievements.php の `?? 0` フォールバックはカラム追加後も無害なので変更不要。
achievements.php の「連続正解」カードでは `$progress['current_correct_streak'] ?? 0` を表示しているが、`sn_refresh_user_progress()` が返す配列(`sn_user_progress` テーブルの行)には `current_correct_streak` カラムが存在しない。
`schema.sql` の `sn_user_progress` テーブルを確認すると、カラムは以下のとおり定義されている:
```
total_xp, level_no, current_streak_days, longest_streak_days,
best_correct_streak, last_active_date, updated_at
```
`current_correct_streak`(現在進行中の連続正解数)カラムが **テーブルに存在しない**。
そのため `$progress['current_correct_streak'] ?? 0` は常に `0` を返し、連続正解中であっても「0 問」と表示される。
また `sn_next_badge_hints()` 内で同キーを参照している場合、`correct_streak` バッジの進捗バーも常に 0% になる。
## 2. 根拠・発生条件
- `schema.sql` の `sn_user_progress` CREATE TABLE に `current_correct_streak` カラムが **存在しない**(`best_correct_streak` のみ)。
- achievements.php 36 行目付近: `(int)($progress['current_correct_streak'] ?? 0)` で参照している。
- PHP `PDO::FETCH_ASSOC` でフェッチした連想配列にキーが無いため、`??` フォールバックで常に 0 になる(PHP Notice は出ないが表示が常時 0 になる機能バグ)。
- `sn_next_badge_hints()` も同じ `$progress` 配列から `current_correct_streak` を参照していると推定されるため、次のバッジヒントの進捗表示も 0 のまま。
## 3. 期待動作
- 直近の解答セッションで連続正解した問題数が「連続正解 N 問」に正しく表示される。
- `correct_streak` バッジの進捗バーが実際の連続正解数を反映する。
## 4. 修正方針
### A. テーブルにカラムを追加 (schema.sql + MIGRATION)
```sql
-- schema.sql の sn_user_progress に追加
current_correct_streak SMALLINT UNSIGNED NOT NULL DEFAULT 0,
```
MIGRATION コメントも追記:
```sql
-- MIGRATION: ALTER TABLE sn_user_progress ADD COLUMN current_correct_streak SMALLINT UNSIGNED NOT NULL DEFAULT 0;
```
既存環境では `sn_ensure_question_columns()` と同様の `sn_ensure_progress_columns()` 関数(または既存の起動時 ALTER チェック処理)で冪等に追加する。
### B. sn_refresh_user_progress() を修正
問題に解答するたびに呼ばれる進捗更新関数内で、正解が続いているうちは `current_correct_streak` をインクリメントし、不正解時に 0 にリセットする処理を追加する。
`best_correct_streak` は `current_correct_streak` が更新されるたびに `MAX` 比較で上書きする(既存ロジックと整合)。
### C. sn_next_badge_hints() の参照キー確認
`correct_streak` バッジの進捗計算で `$progress['current_correct_streak']` を参照している箇所を確認し、カラム追加後に正しい値が渡るようにする。
### 後方互換
- 既存データの `current_correct_streak` は `DEFAULT 0` で初期化されるため、既存ユーザーのスコアや `best_correct_streak` には影響しない。
- achievements.php の `?? 0` フォールバックはカラム追加後も無害なので変更不要。
💬 返信 (3)
🛠 開発を開始しました (バグ修正 (studynova))
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「StudyNova(スタディノヴァ)」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=studynova
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/studynova/
ご利用ありがとうございます!
ご要望いただいた「StudyNova(スタディノヴァ)」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=studynova
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/studynova/
ご利用ありがとうございます!
Echo
Iris