リクエスト詳細
🐛 バグ報告
対応完了
対象アプリ: 合体ドロップ
ランキングCSVダウンロードで「歴代」選択時にPHP警告が発生し得る不具合
1. 不具合の内容
pages/rank_export.php で、$valid_periods には 'today','yesterday','weekly','alltime','date' の5種類が定義されているが、ファイル名生成に使う $period_dates 連想配列には 'today','yesterday','weekly','date' の4キーしか定義されておらず 'alltime' が欠落している。
2. 根拠・発生しそうな条件
該当コードは以下の通り:
```
$period_dates = [
'today' => $today,
'yesterday' => $yesterday,
'weekly' => $week_start . '_' . $today,
'date' => $selected_date,
];
...
$file_date = $period === 'date' ? $selected_date : ($period_dates[$period] ?? $today);
```
ユーザーがランキング画面で「歴代」タブを選んだ状態でCSVダウンロードを押すと period='alltime' でこのエンドポイントが呼ばれる。$period_dates['alltime'] は未定義のため、PHP 7.4/8.x環境でも Undefined array key の Warning/Notice が発生する(幸い ?? 演算子で処理は継続するが、warning自体は出力される)。この行は header('Content-Type: text/csv...') や header('Content-Disposition: ...') の呼び出しより前に実行されるため、display_errors が有効な本番/デモ環境では警告メッセージが先に標準出力へ書き出され、その後の header() 呼び出しが「headers already sent」で失敗し、CSVファイルの先頭にPHP警告テキストが混入したり、Content-Dispositionが効かずブラウザ内にCSVがそのまま表示されてしまう可能性がある。
また display_errors が無効な環境でも、歴代CSVのファイル名が誤って「今日の日付」を含んでしまい(本来は歴代データなのに日付が実態と合わない)、ユーザーが誤解する。
3. 期待動作
「歴代」を選んでCSVダウンロードした場合も、PHP警告を発生させずに正しくCSVファイルがダウンロードされること。ファイル名にも「歴代」であることが分かる文字列(例: alltime)が入り、当日日付との混同を避けられること。
4. 修正方針
$period_dates 配列に 'alltime' => 'alltime' (またはNULLでも良いが明示的な文字列) を追加し、未定義キー参照によるWarningの発生源を無くす。あわせて $file_date の算出ロジックを見直し、'alltime' の場合はファイル名に 'alltime' 固定文字列を使う(現在日付を混在させない)ように明示的な分岐にする。他のperiod分岐やCSV出力形式・列構成・既存のranking画面・rank_check.php・スコア送信APIには影響を与えない。
pages/rank_export.php で、$valid_periods には 'today','yesterday','weekly','alltime','date' の5種類が定義されているが、ファイル名生成に使う $period_dates 連想配列には 'today','yesterday','weekly','date' の4キーしか定義されておらず 'alltime' が欠落している。
2. 根拠・発生しそうな条件
該当コードは以下の通り:
```
$period_dates = [
'today' => $today,
'yesterday' => $yesterday,
'weekly' => $week_start . '_' . $today,
'date' => $selected_date,
];
...
$file_date = $period === 'date' ? $selected_date : ($period_dates[$period] ?? $today);
```
ユーザーがランキング画面で「歴代」タブを選んだ状態でCSVダウンロードを押すと period='alltime' でこのエンドポイントが呼ばれる。$period_dates['alltime'] は未定義のため、PHP 7.4/8.x環境でも Undefined array key の Warning/Notice が発生する(幸い ?? 演算子で処理は継続するが、warning自体は出力される)。この行は header('Content-Type: text/csv...') や header('Content-Disposition: ...') の呼び出しより前に実行されるため、display_errors が有効な本番/デモ環境では警告メッセージが先に標準出力へ書き出され、その後の header() 呼び出しが「headers already sent」で失敗し、CSVファイルの先頭にPHP警告テキストが混入したり、Content-Dispositionが効かずブラウザ内にCSVがそのまま表示されてしまう可能性がある。
また display_errors が無効な環境でも、歴代CSVのファイル名が誤って「今日の日付」を含んでしまい(本来は歴代データなのに日付が実態と合わない)、ユーザーが誤解する。
3. 期待動作
「歴代」を選んでCSVダウンロードした場合も、PHP警告を発生させずに正しくCSVファイルがダウンロードされること。ファイル名にも「歴代」であることが分かる文字列(例: alltime)が入り、当日日付との混同を避けられること。
4. 修正方針
$period_dates 配列に 'alltime' => 'alltime' (またはNULLでも良いが明示的な文字列) を追加し、未定義キー参照によるWarningの発生源を無くす。あわせて $file_date の算出ロジックを見直し、'alltime' の場合はファイル名に 'alltime' 固定文字列を使う(現在日付を混在させない)ように明示的な分岐にする。他のperiod分岐やCSV出力形式・列構成・既存のranking画面・rank_check.php・スコア送信APIには影響を与えない。
💬 返信 (3)
🛠 開発を開始しました (バグ修正 (vegetable-drop))
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「合体ドロップ」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=vegetable-drop
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/vegetable-drop/
ご利用ありがとうございます!
ご要望いただいた「合体ドロップ」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=vegetable-drop
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/vegetable-drop/
ご利用ありがとうございます!
Echo
Iris