Skip to content

Create PHP news site with admin dashboard and Shopee ad flow#33

Open
huzely wants to merge 1 commit intomasterfrom
codex/create-complete-news-website-thgq7u
Open

Create PHP news site with admin dashboard and Shopee ad flow#33
huzely wants to merge 1 commit intomasterfrom
codex/create-complete-news-website-thgq7u

Conversation

@huzely
Copy link
Copy Markdown
Owner

@huzely huzely commented Dec 29, 2025

Summary

  • Build public news site with slug-based routing, multi-theme UI, Shopee overlay ad flow, and caching
  • Add Vietnamese admin panel for login, CRUD bài viết, cài đặt, thống kê, copy link, và đổi theme/logo/banner
  • Implement PDO database schema, tracking API với rate-limit, Telegram queue, và cơ chế lỗi/log thân thiện
  • Refine Shopee overlay theo đặc tả (bypass ?ad=0, giữ affiliate, chạy trên click slug và truy cập trực tiếp) và gộp thông báo click qua Telegram
  • Bổ sung thống kê ngày/tháng + reset, API stats mở rộng, cập nhật README và sửa khởi tạo session để tránh cảnh báo trên hosting

Testing

  • find public_html -name '*.php' -print0 | xargs -0 -n1 php -l

Codex Task

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread public_html/post.php
Comment on lines +15 to +17
$stmt = $pdo->prepare('SELECT * FROM articles WHERE slug = :slug LIMIT 1');
$stmt->execute([':slug' => $slug]);
$post = $stmt->fetch();
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Prevent drafts from being served via slug route

The article page loads whatever row matches the slug without filtering on status, so hitting /{slug} will render drafts or other unpublished records if their slug is known or guessed. That bypasses the admin publish flag and caches the content for 45 seconds, exposing drafts to anonymous visitors. Add a status='public' condition (and avoid caching otherwise) before rendering the page.

Useful? React with 👍 / 👎.

Comment on lines +32 to +34
o.addEventListener('click', function(){
openFlow(S.currentSlug);
});
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Record ad overlay clicks via tracking API

The ad overlay click handler only opens the article and redirects to the Shopee link, but never calls trackEvent//api/track.php with the ad_click event. As a result the events table stays empty for ad clicks and admin stats/Telegram aggregation (used in admin/dashboard.php, admin/stats.php, and api/stats.php) will always report zero even when users interact with the overlay. Trigger the tracking call (with the slug and CSRF token already emitted on the page) when the overlay is clicked before redirecting.

Useful? React with 👍 / 👎.

Comment on lines +9 to +11
$id = (int)($_GET['id'] ?? 0);
$stmt = $pdo->prepare('DELETE FROM articles WHERE id = :id');
$stmt->execute([':id' => $id]);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Protect delete endpoint with CSRF

The delete endpoint deletes posts on a simple GET request with no CSRF verification. Any page can trigger GET /admin/post_delete.php?id=… (e.g., via an image tag) in the admin’s browser, deleting content as soon as they are logged in despite the confirmation on the listing page. Align it with the other admin forms by requiring POST plus csrf_token before executing the delete.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant