リクエスト詳細
🐛 バグ報告
対応完了
対象アプリ: チラシ・POP自動デザインメーカー FlyerCraft
view.php で閲覧カウントが毎リロードで加算され続ける(bump_counter の二重呼び出し含む)
## 1. 不具合の内容
`pages/view.php` と `pages/editor.php` の両方で `bump_counter()` が呼ばれているが、view.php 側に「1セッション1カウント」の制御が存在しない。
さらに `pages/editor.php` では `?from=<token>` でエディタを開くたびに `bump_counter($d['id'], 'copy_count')` を実行しているが、`view.php` でも同じ `find_shared_design()` → `bump_counter(..., 'view_count')` を毎リクエストで呼んでいる。
結果として:
- ブラウザの「リロード」やSNSのプレビュークローラー、検索エンジンのクローラーが view.php を叩くたびに `view_count` が際限なく加算される。
- エディタの `?from=token` も同様に `copy_count` がリロードのたびに増加する。
## 2. 根拠・発生条件
`pages/view.php` 抜粋:
```php
$design = find_shared_design($token);
if ($design) {
bump_counter((int)$design['id'], 'view_count'); // ← セッション制御なし
}
```
`pages/editor.php` 抜粋:
```php
$d = find_shared_design($from_token);
if ($d) {
bump_counter((int)$d['id'], 'copy_count'); // ← エディタを開くたびに加算
$from_design = $d['canvas'];
}
```
セッションや Cookie によるユニーク制御が一切ないため、F5 リロードするだけでカウントが増え続ける。`view_count` / `copy_count` はギャラリー一覧の人気度表示に使われており、数値の信頼性が失われる。
## 3. 期待動作
- `view_count` は「同一セッション内で同じトークンを初めて見たとき」だけ +1 する。
- `copy_count` は「エディタで実際にコピー編集を開始した最初の1回」だけ +1 する(リロードでは加算しない)。
## 4. 修正方針
### view.php
```php
// セッションに既閲覧トークンを記録し、初回のみカウント
if ($design) {
$viewed = $_SESSION['fc_viewed'] ?? [];
if (!in_array($token, $viewed, true)) {
bump_counter((int)$design['id'], 'view_count');
$viewed[] = $token;
// 最大50件保持してセッションが肥大化しないよう制限
if (count($viewed) > 50) array_shift($viewed);
$_SESSION['fc_viewed'] = $viewed;
}
}
```
### editor.php
```php
// コピー済みトークンをセッションで管理し、初回のみカウント
if ($d) {
$copied = $_SESSION['fc_copied'] ?? [];
if (!in_array($from_token, $copied, true)) {
bump_counter((int)$d['id'], 'copy_count');
$copied[] = $from_token;
if (count($copied) > 50) array_shift($copied);
$_SESSION['fc_copied'] = $copied;
}
$from_design = $d['canvas'];
}
```
`session_start()` は既に `index.php` の先頭で呼ばれているため追加不要。既存機能(ギャラリー表示・エディタのコピー編集)は壊さない。
`pages/view.php` と `pages/editor.php` の両方で `bump_counter()` が呼ばれているが、view.php 側に「1セッション1カウント」の制御が存在しない。
さらに `pages/editor.php` では `?from=<token>` でエディタを開くたびに `bump_counter($d['id'], 'copy_count')` を実行しているが、`view.php` でも同じ `find_shared_design()` → `bump_counter(..., 'view_count')` を毎リクエストで呼んでいる。
結果として:
- ブラウザの「リロード」やSNSのプレビュークローラー、検索エンジンのクローラーが view.php を叩くたびに `view_count` が際限なく加算される。
- エディタの `?from=token` も同様に `copy_count` がリロードのたびに増加する。
## 2. 根拠・発生条件
`pages/view.php` 抜粋:
```php
$design = find_shared_design($token);
if ($design) {
bump_counter((int)$design['id'], 'view_count'); // ← セッション制御なし
}
```
`pages/editor.php` 抜粋:
```php
$d = find_shared_design($from_token);
if ($d) {
bump_counter((int)$d['id'], 'copy_count'); // ← エディタを開くたびに加算
$from_design = $d['canvas'];
}
```
セッションや Cookie によるユニーク制御が一切ないため、F5 リロードするだけでカウントが増え続ける。`view_count` / `copy_count` はギャラリー一覧の人気度表示に使われており、数値の信頼性が失われる。
## 3. 期待動作
- `view_count` は「同一セッション内で同じトークンを初めて見たとき」だけ +1 する。
- `copy_count` は「エディタで実際にコピー編集を開始した最初の1回」だけ +1 する(リロードでは加算しない)。
## 4. 修正方針
### view.php
```php
// セッションに既閲覧トークンを記録し、初回のみカウント
if ($design) {
$viewed = $_SESSION['fc_viewed'] ?? [];
if (!in_array($token, $viewed, true)) {
bump_counter((int)$design['id'], 'view_count');
$viewed[] = $token;
// 最大50件保持してセッションが肥大化しないよう制限
if (count($viewed) > 50) array_shift($viewed);
$_SESSION['fc_viewed'] = $viewed;
}
}
```
### editor.php
```php
// コピー済みトークンをセッションで管理し、初回のみカウント
if ($d) {
$copied = $_SESSION['fc_copied'] ?? [];
if (!in_array($from_token, $copied, true)) {
bump_counter((int)$d['id'], 'copy_count');
$copied[] = $from_token;
if (count($copied) > 50) array_shift($copied);
$_SESSION['fc_copied'] = $copied;
}
$from_design = $d['canvas'];
}
```
`session_start()` は既に `index.php` の先頭で呼ばれているため追加不要。既存機能(ギャラリー表示・エディタのコピー編集)は壊さない。
💬 返信 (3)
🛠 開発を開始しました (バグ修正 (flyercraft))
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「チラシ・POP自動デザインメーカー FlyerCraft」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=flyercraft
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/flyercraft/
ご利用ありがとうございます!
ご要望いただいた「チラシ・POP自動デザインメーカー FlyerCraft」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=flyercraft
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/flyercraft/
ご利用ありがとうございます!
Echo
Iris