CHONIE DEV CMS v1.1 — คู่มือการติดตั้งและใช้งาน

CHONIE DEV CMS คืออะไร?

ระบบจัดการเนื้อหาเว็บไซต์ออนไลน์ สร้างด้วย PHP + MySQL ไม่ต้องใช้ Framework ติดตั้งง่าย เหมาะสำหรับ XAMPP และ Shared Hosting ทั่วไป

🎨
5 Templates + ปรับสีเอง
เปลี่ยนหน้าตาเว็บได้ในคลิกเดียว พร้อม Live Preview ก่อนบันทึก
📦
Multi-Image ต่อสินค้า
Drag & Drop อัปโหลดหลายรูปพร้อมกัน ตั้งรูปปกได้อิสระ
📬
ฟอร์มสนใจสินค้า
รับ Inquiry ผ่านอีเมลหรือ LINE แจ้งเตือน Admin อัตโนมัติ
🔧
Install Wizard
ติดตั้งผ่านหน้าเว็บ 4 ขั้นตอน ไม่ต้องแตะ command line
📱
Responsive ทุกขนาด
หน้าเว็บสวยงามบนมือถือ แท็บเล็ต และคอมพิวเตอร์
⚙️
ตั้งค่าได้ทุกอย่าง
ชื่อร้าน Hero section SEO Google Analytics ผ่าน Admin

System Requirements

ตรวจสอบว่า server รองรับข้อกำหนดเหล่านี้ก่อนติดตั้ง

รายการขั้นต่ำแนะนำสถานะ
PHP Version7.48.1+✓ จำเป็น
MySQL / MariaDBMySQL 5.7 / MariaDB 10.3MySQL 8 / MariaDB 10.6✓ จำเป็น
PDO + pdo_mysqlต้องเปิด✓ จำเป็น
fileinfo extensionต้องเปิด✓ จำเป็น
GD / Imagickแนะนำไม่บังคับ
Upload Max Size5MB20MB+ปรับได้
PHP mail()SMTPสำหรับส่งอีเมล
ℹ️
GD / Imagick — ระบบไม่ได้ใช้ GD หรือ Imagick ในการทำงานหลัก (ไม่มีการ resize รูป) Install Wizard แสดงการตรวจสอบเป็น warning เท่านั้น กดผ่านได้เลยครับ

โครงสร้างไฟล์

choniedev-cms/
├── install/
│ ├── install.php ← Install Wizard (ลบหลังติดตั้ง!)
│ └── schema.sql ← SQL สร้างตารางทั้งหมด

├── admin/ ← หลังบ้าน Admin Panel
│ ├── index.php ← Dashboard
│ ├── login.php
│ ├── logout.php
│ ├── products.php ← จัดการสินค้า + รูปภาพ
│ ├── design.php ← เลือก Template + ปรับสี
│ ├── settings.php ← ตั้งค่าเว็บ SEO ติดต่อ
│ ├── inquiries.php ← ดูฟอร์มสนใจสินค้า
│ ├── email.php ← ส่งอีเมล
│ ├── uploads/ ← รูปภาพสินค้า (chmod 755)
│ └── includes/
│ ├── config.php ← Auto-generated ตอนติดตั้ง
│ ├── auth.php ← Session / Login helper
│ └── layout.php ← Shared HTML layout

└── public/ ← หน้าเว็บสาธารณะ
├── index.php ← หน้าหลัก (dynamic theme)
├── api.php ← REST API endpoint
└── uploads/ ← (ใช้ symlink หรือ copy จาก admin)
⚠️
โฟลเดอร์ admin/uploads/ และ public/uploads/ ต้องให้ PHP เขียนไฟล์ได้ ตั้ง permission 755 หรือ 775 ตามแต่ hosting

ติดตั้งบน XAMPP (Local)

1
ดาวน์โหลดและวางไฟล์
แตกไฟล์ choniedev-cms.zip แล้ววางโฟลเดอร์ทั้งหมดใน:
C:\xampp\htdocs\choniedev-cms\
2
เปิด XAMPP และเริ่ม Apache + MySQL
เปิด XAMPP Control Panel → กด Start ที่ Apache และ MySQL ให้ทั้งคู่แสดงสีเขียว
3
เปิด Install Wizard
เปิด browser แล้วไปที่:
http://localhost/choniedev-cms/install/install.php
ทำตาม 4 ขั้นตอนใน wizard จนเสร็จ
4
ตั้งค่า DB — ใช้ค่า Default ของ XAMPP
Fieldค่า XAMPP Default
Hostlocalhost
Database Namechoniedev_cms (ตั้งใหม่ได้)
Usernameroot
Password(ว่างเปล่า)
5
เข้าใช้งาน
URLหน้า
http://localhost/choniedev-cms/public/หน้าเว็บสาธารณะ
http://localhost/choniedev-cms/admin/หลังบ้าน Admin

ติดตั้งบน Shared Hosting

1
อัปโหลดไฟล์ผ่าน FTP / File Manager
อัปโหลดโฟลเดอร์ choniedev-cms/ ไปที่ public_html/ หรือ subdirectory ที่ต้องการ เช่น public_html/shop/
2
สร้าง Database ใน cPanel
ไปที่ cPanel → MySQL Databases → สร้าง Database และ User ใหม่ → Assign User ให้ Database พร้อมสิทธิ์ ALL PRIVILEGES
3
ตั้ง Permission โฟลเดอร์ uploads
ผ่าน File Manager หรือ FTP ตั้ง permission ของโฟลเดอร์ทั้งสอง:
choniedev-cms/admin/uploads/   → 755
choniedev-cms/public/uploads/  → 755
# ถ้า 755 ยังไม่ได้ ลอง 775 หรือ 777
4
เปิด Install Wizard
https://yourdomain.com/choniedev-cms/install/install.php
5
ลบโฟลเดอร์ install/ ทันทีหลังติดตั้ง
ลบผ่าน File Manager ใน cPanel หรือ FTP
🚨
ความปลอดภัย! ถ้าไม่ลบ install/ ใครก็สามารถรัน wizard ซ้ำและ reset ระบบได้!

Install Wizard — 4 ขั้นตอน

1
ตรวจสอบ Requirements
ระบบจะตรวจ PHP version, PDO, fileinfo, GD — ✓ สีเขียว = ผ่าน, ✗ สีแดง = ต้องแก้ไข (ยกเว้น GD กดผ่านได้)
2
ตั้งค่าฐานข้อมูล
ใส่ Host, DB Name, Username, Password — ระบบจะสร้าง Database และตารางทั้งหมดให้อัตโนมัติ
3
ตั้งค่าร้าน & Admin
ชื่อร้าน, LINE ID, Username/Password ของ Admin, อีเมล — Wizard จะสร้าง config.php ให้อัตโนมัติ
4
เสร็จสิ้น 🎉
ติดตั้งสำเร็จ! มีลิงก์ไปหน้าเว็บและ Admin Panel พร้อมคำเตือนให้ลบโฟลเดอร์ install/

สิ่งที่ต้องทำหลังติดตั้ง

!
ลบโฟลเดอร์ install/ ทันที
ลบโฟลเดอร์ install/ ออกจาก server ทันที
2
ตั้งค่า uploads ใน public/
เนื่องจากรูปภาพเก็บใน admin/uploads/ แต่หน้าเว็บ public ต้องเข้าถึงได้ — ใน public/api.php ระบบจะสร้าง URL ที่ชี้ไปยัง admin/uploads/ ให้อัตโนมัติ ไม่ต้องทำอะไรเพิ่ม
3
ตั้งค่าข้อมูลร้าน
เข้า Admin → ตั้งค่าเว็บ → กรอกชื่อร้าน, LINE ID, เบอร์โทร, อีเมล, คำบรรยาย Hero section ให้ครบ
4
เลือก Template
เข้า Admin → ดีไซน์ & ธีม → เลือก Template ที่ชอบ หรือปรับสีเอง
5
เพิ่มสินค้าชุดแรก
เข้า Admin → สินค้า → เพิ่มสินค้า พร้อมรูปภาพ

เข้าสู่ระบบ Admin

URLรายละเอียด
admin/login.phpหน้า Login
admin/index.phpDashboard (redirect อัตโนมัติ)
🔐
Username และ Password คือที่ตั้งในขั้นตอนที่ 3 ของ Install Wizard — ถ้าลืม เปลี่ยนได้ที่ Admin → ตั้งค่าเว็บ → ส่วน "เปลี่ยนรหัสผ่าน"

Session จะหมดอายุเมื่อปิด browser หรือหลังจากไม่มีกิจกรรม — ระบบจะ redirect กลับหน้า Login อัตโนมัติ

Dashboard

หน้าแรกหลัง Login แสดงภาพรวมของร้านทั้งหมด

📊 สถิติด้านบน (4 กล่อง)
สินค้าทั้งหมด, สินค้าที่แสดงบนเว็บ, ฟอร์มสนใจทั้งหมด, ฟอร์มที่ยังไม่ได้อ่าน
📋 ตารางสินค้าล่าสุด
แสดง 6 รายการล่าสุด พร้อมรูปปก ชื่อ ราคา สถานะ
🎨 ธีมปัจจุบัน
แสดงชื่อ Template ที่ใช้งานอยู่ พร้อมปุ่มลัดไปหน้า Design
📬 ฟอร์มล่าสุด
แสดง 5 รายการล่าสุด พร้อม badge "ใหม่" สำหรับที่ยังไม่อ่าน

จัดการสินค้า

เพิ่ม แก้ไข ลบสินค้า และจัดการรูปภาพหลายรูปต่อสินค้า

➕ เพิ่มสินค้าใหม่

1
กรอกข้อมูลสินค้า
ชื่อสินค้า (บังคับ), หมวดหมู่, ราคา, ลำดับการแสดง, รายละเอียด/พุทธคุณ, สถานะ (เปิด/ปิด), ไฮไลต์ ⭐
2
อัปโหลดรูปภาพ
ลากไฟล์มาวางในกรอบ Drop Zone หรือคลิกเลือก — เลือกได้หลายรูปพร้อมกัน
รูปแรกที่เลือกจะเป็น ★ รูปปก อัตโนมัติ (แสดงในการ์ดหน้าเว็บ)
รองรับ: JPG, PNG, WEBP, GIF — ขนาดไม่เกิน 5MB ต่อรูป
3
กดปุ่ม "เพิ่มสินค้า"
ระบบจะอัปโหลดรูปทั้งหมดและบันทึกสินค้าลงฐานข้อมูล แสดงผลสรุปว่าอัปโหลดสำเร็จกี่รูป

✏️ แก้ไขสินค้า

กดปุ่ม ✏️ ในตารางเพื่อเปิดโหมดแก้ไข มี 2 ส่วน:
แก้ไขข้อมูลสินค้า
แก้ชื่อ, หมวด, ราคา, รายละเอียด, สถานะ ได้ทุกอย่าง กด "บันทึก" เพื่อ save
จัดการรูปภาพ
Hover บนรูปเพื่อ: ★ ตั้งเป็นรูปปก หรือ 🗑️ ลบรูปนั้น — เพิ่มรูปใหม่ได้ทีหลังไม่จำกัด

🔍 ค้นหาและกรอง

ฟีเจอร์วิธีใช้
ค้นหาชื่อพิมพ์ในช่อง Search แล้วกด Enter
กรองหมวดหมู่เลือก Dropdown แล้วกดปุ่มกรอง
เปิด/ปิดสินค้ากดปุ่มสีเขียว/แดง ในคอลัมน์ "แสดง" ได้เลย
Pagination20 รายการ/หน้า กดเลขหน้าด้านล่าง

ดีไซน์ & ธีม

หัวใจของระบบ — เปลี่ยนหน้าตาเว็บได้โดยไม่ต้องแตะโค้ด

🎨 เลือก Template

คลิก Template ที่ต้องการ ระบบจะเปลี่ยนสีและฟอนต์ให้ครบชุดทันที

Templateโทนสีฟอนต์เหมาะสำหรับ
🌑 Dark Goldดำ + ทองNoto Serif Thaiร้านพระเครื่องหรูหรา คลาสสิค
🌕 Ivory Goldครีม + ทองPlayfair Displayดูสะอาด อบอุ่น เป็นมิตร
🌊 Midnightน้ำเงินกรมท่า + เงินCinzelดูดี มีสไตล์ ทันสมัย
🌿 Forest Zenเขียวมรกต + ทองNoto Serif Thaiธรรมชาติ สงบ เรียบง่าย
🌹 Rouge Noirแดงเข้ม + ดำCormorant Garamondโดดเด่น กล้า มีเอกลักษณ์

🖌️ ปรับสีเอง

ปรับได้ 5 ค่า มี Live Preview แสดงให้เห็นก่อนบันทึก:

ค่าผลลัพธ์
สีพื้นหลัง (Background)สีพื้นหลักของทุกหน้า
สีผิว Card / Navbarสีกล่องสินค้า Navbar Sidebar
สีหลัก (Accent)ปุ่ม ไฮไลต์ ข้อความสำคัญ
สีตัวอักษรข้อความหลักทุกจุด
สีตัวอักษรรองคำอธิบาย วันที่ Label รอง

💻 Custom CSS

เพิ่ม CSS เองได้ไม่จำกัด — จะถูก inject ลงหน้าเว็บ public ทุกหน้า ตัวอย่าง:

/* ทำให้การ์ดมุมโค้งมากขึ้น */
.pcard { border-radius: 20px; }

/* เพิ่มเงาปุ่มสนใจ */
.btn-int { box-shadow: 0 4px 12px rgba(0,0,0,.3); }

/* ซ่อน Announcement bar */
.strip { display: none; }

ตั้งค่าเว็บไซต์

🏪 ข้อมูลร้านค้า
ชื่อร้าน, Tagline, จำนวนสินค้า/หน้า (4–48), เปิด/ปิด Maintenance Mode
📞 ข้อมูลติดต่อ
อีเมล, โทรศัพท์, LINE ID, Facebook URL, Instagram URL — แสดงใน Footer และฟอร์มสนใจ
⭐ Hero Section
ชื่อหลัก (รองรับ HTML เช่น <br> <em>), Subtitle, คำอธิบาย — แสดงตรงกลางหน้าเว็บ
📢 Announcement
ข้อความแถบวิ่งด้านบน คั่นด้วย · เช่น "ฟรีค่าส่ง · รับรองแท้ · LINE: @shop"
🔍 SEO
Meta Description สำหรับ Google, Google Analytics ID (G-XXXXXXXXXX)
🔒 เปลี่ยนรหัสผ่าน
พิมพ์รหัสใหม่ (≥6 ตัว) แล้วกดบันทึก — ว่างไว้ถ้าไม่ต้องการเปลี่ยน
💡
Maintenance Mode — เมื่อเปิด หน้าเว็บ public จะแสดงหน้า "ปิดปรับปรุง" แทน Admin Panel ยังใช้งานได้ตามปกติ

ฟอร์มสนใจสินค้า

ดูและจัดการ Inquiry ที่ลูกค้าส่งมาจากหน้าเว็บ

การกระทำวิธีใช้
ดูรายละเอียดกดปุ่ม 👁️ เพื่อเปิดรายละเอียดครบ — ระบบจะ mark เป็น "อ่านแล้ว" อัตโนมัติ
กรองยังไม่อ่านกดแท็บ "ยังไม่อ่าน" ด้านบนตาราง
อ่านทั้งหมดกดปุ่ม "อ่านทั้งหมด" — mark ทุกรายการเป็นอ่านแล้วพร้อมกัน
ตอบกลับในหน้ารายละเอียด มีปุ่ม "ส่งอีเมลตอบ" เปิด mailto: อัตโนมัติ
ลบกดปุ่ม 🗑️ ยืนยันการลบก่อนดำเนินการ
ทุก Inquiry ระบบจะส่งอีเมลแจ้ง Admin อัตโนมัติ และส่งอีเมล confirm ให้ลูกค้าทันที (ต้องการ PHP mail() ที่ทำงานได้)

ส่งอีเมล

ส่งอีเมลหาลูกค้าหรือผู้ที่สนใจโดยตรงจาก Admin Panel

1
กรอกอีเมลผู้รับ
ใส่ email address ของผู้รับ รองรับ 1 คนต่อการส่งครั้งหนึ่ง
2
ใส่หัวเรื่องและเนื้อหา
เนื้อหารองรับ HTML เช่น <b>ตัวหนา</b>, <p>ย่อหน้า</p> — ระบบจะ wrap เข้า Email Template ที่มีหัว-ท้ายสวยงามอัตโนมัติ
3
ดูประวัติการส่ง
ด้านขวาแสดง 20 รายการล่าสุด พร้อม badge ✓ สำเร็จ หรือ ✗ ล้มเหลว
⚠️
การส่งอีเมลใช้ mail() ของ PHP — บน XAMPP อาจไม่ส่งจริง ต้องตั้ง SMTP ใน php.ini หรือใช้ MailHog สำหรับ local testing. บน Hosting จริงส่งได้ปกติ

ระบบธีม — การทำงาน

ธีมถูก render แบบ Server-side ทุก request โดยอ่านค่าจาก Database

การทำงานของ public/index.php
// 1. อ่านค่าจาก DB
$tpl     = getSetting('active_template', 'dark_gold');
$primary = getSetting('theme_primary',   '#c8a84b');
$bg      = getSetting('theme_bg',        '#0e0c0a');

// 2. Inject เป็น CSS Variables ใน <style>
:root {
  --primary: ;
  --bg:      ;
  --font-d:  '', serif;
}

// 3. ทุก component ใช้ var(--primary), var(--bg) ฯลฯ
// 4. Custom CSS จาก DB ถูก inject ท้าย <style>
เพิ่ม Template ใหม่ (SQL)
INSERT INTO templates (slug, name, description) VALUES
('my_theme', 'My Custom Theme', 'คำอธิบาย');

-- แล้วเพิ่ม preset ใน admin/design.php ส่วน $presets array
เพิ่ม Font ใหม่ (แก้ public/index.php)
$fontMap = [
  'dark_gold'  => ['display'=>'Noto Serif Thai', 'gfont'=>'Noto+Serif+Thai:wght@400;700'],
  'my_theme'   => ['display'=>'Mitr',            'gfont'=>'Mitr:wght@400;600;700'],
];

API Reference

ไฟล์ public/api.php ให้บริการ JSON API สำหรับหน้าเว็บ

MethodURLผลลัพธ์
GET api.php?action=products รายการสินค้าทั้งหมด (paginated)
GET api.php?action=products&cat=1 กรองตาม category_id
GET api.php?action=products&q=หลวงพ่อ ค้นหาตามชื่อ/รายละเอียด
GET api.php?action=products&page=2 หน้าที่ 2
GET api.php?action=item&id=5 รายละเอียดสินค้า + รูปทั้งหมด
POST api.php?action=interest ส่งฟอร์มสนใจสินค้า (JSON body)
ตัวอย่าง Response: GET products
{
  "items": [
    {
      "id": 1,
      "title": "หลวงพ่อโสธร รุ่น 2536",
      "price_fmt": "1,250",
      "image_url": "http://localhost/choniedev-cms/admin/uploads/prana_xxx.jpg",
      "is_featured": 1,
      "img_count": 3
    }
  ],
  "total": 48,
  "page": 1,
  "pages": 4
}
ตัวอย่าง POST interest (JSON body) — อัปเดต v1.1
{
  "item_id":      5,
  "name":         "สมชาย ใจดี",
  "email":        "somchai@email.com",
  "phone":        "089-xxx-xxxx",
  "message":      "ขอสอบถามราคาเช่าครับ",
  "contact_pref": "email",
  "hp":           "",        // honeypot — ต้องว่างเสมอ
  "_ts":          1716220000000, // timestamp (ms) กัน replay
  "_rc":          "03AGdBq..."   // reCAPTCHA v3 token (optional)
}

ป้องกัน Bot / Spam — ฟอร์มสนใจสินค้า

ระบบมีการป้องกัน Bot หลายชั้น ทั้งฝั่ง JavaScript (client) และ PHP (server) ทำงานร่วมกัน

🍯
Honeypot Field
ฟิลด์ซ่อน — มนุษย์ไม่เห็น ไม่กรอก แต่ Bot มักกรอกอัตโนมัติ ถ้ามีข้อมูล = block ทันที (เงียบๆ)
⏱️
Rate Limit
JS: ห้ามส่งถี่กว่า 8 วินาที หรือเกิน 5 ครั้งต่อ session · PHP: เกิน 10 ครั้งต่อ 10 นาทีต่อ IP → 429
🔎
Spam Filter
กรองลิงก์ในชื่อ/ข้อความ เช่น http://, www., bit.ly, t.me ทั้งฝั่ง JS และ PHP
🕐
Timestamp Check
PHP ตรวจ timestamp ที่ส่งมา ถ้าต่างกับเวลาเซิร์ฟเวอร์เกิน 5 นาที = reject (กัน replay attack)
Validation ทุกฟิลด์
JS + PHP ตรวจ format อีเมล, ความยาวชื่อ (≤100), ความยาวข้อความ (≤2000) ทั้งสองชั้น
🤖
reCAPTCHA v3 (optional)
เพิ่ม Google reCAPTCHA v3 ได้ ไม่มี checkbox ลูกค้าไม่รู้สึกอะไร แต่กัน bot ขั้นสูงได้

🔄 ขั้นตอนการตรวจสอบ (Flow)

JS
Honeypot + Rate Limit + Validate (Client-side)
ก่อนส่ง fetch ตรวจทั้งหมดก่อน — ถ้าไม่ผ่าน หยุดทันทีโดยไม่ส่ง request ไปเซิร์ฟเวอร์เลย ประหยัด load
JS
reCAPTCHA v3 Token (ถ้ามี key)
เรียก grecaptcha.execute() เพื่อขอ token แล้วแนบใน _rc field — ถ้าไม่ได้ตั้งค่า site key ก็ส่ง "" ไปได้เลย
PHP
Honeypot ซ้ำ + Rate Limit (Server-side)
PHP ตรวจ honeypot อีกรอบ (กัน direct API call) + Session rate limit ต่อ IP — ถ้าโดน return {"success":true} ปลอม เพื่อไม่ให้ bot รู้ว่าโดน block
PHP
Timestamp + Validate + Spam Filter
ตรวจ _ts ต่างกันเกิน 5 นาทีไหม, validate ทุกฟิลด์, กรอง spam links — ถ้าไม่ผ่าน return error message
PHP
reCAPTCHA Verify (ถ้ามี secret key)
เรียก Google API ตรวจ token — ถ้า score < 0.4 = likely bot → reject พร้อมแจ้งลูกค้า
บันทึกฐานข้อมูล + ส่งอีเมล
ผ่านทุกชั้น → บันทึก Inquiry + แจ้ง Admin + ส่ง confirm หาลูกค้า

⚙️ ตั้งค่า reCAPTCHA v3 (optional)

1
ขอ Key จาก Google
ไปที่ google.com/recaptcha/admin → สร้าง site ใหม่ → เลือก reCAPTCHA v3 → เพิ่ม domain ของคุณ → ได้ Site Key และ Secret Key
2
ใส่ Site Key ใน public/index.php
<!-- เพิ่มใน <head> -->
<script src="https://www.google.com/recaptcha/api.js?render=YOUR_SITE_KEY"></script>

// แก้ใน submitFrm() ฟังก์ชัน
grecaptcha.execute('YOUR_SITE_KEY', { action: 'interest_form' })
3
ใส่ Secret Key ใน admin/includes/config.php
define('RECAPTCHA_SECRET', 'YOUR_SECRET_KEY');
💡
ไม่มี reCAPTCHA ก็ได้ครับ — ชั้น Honeypot + Rate Limit + Validate + Spam Filter ป้องกัน bot ทั่วไปได้ดีมากอยู่แล้ว reCAPTCHA เพิ่มเฉพาะเมื่อโดน bot ขั้นสูงที่ bypass ชั้นอื่นได้

📊 สรุปชั้นการป้องกันแต่ละระดับ

ชั้นฝั่งป้องกันอะไรต้องตั้งค่า
🍯 HoneypotJS + PHPBot ที่กรอก form อัตโนมัติไม่ต้อง (built-in)
⏱️ Rate LimitJS + PHPBot ยิงซ้ำรัว, spam clickไม่ต้อง (built-in)
🔎 Spam FilterJS + PHPข้อความ spam ลิงก์โฆษณาไม่ต้อง (built-in)
🕐 TimestampPHPReplay attack, scripted POSTไม่ต้อง (built-in)
✅ ValidationJS + PHPข้อมูลผิด formatไม่ต้อง (built-in)
🤖 reCAPTCHA v3JS + PHPBot ขั้นสูง, automated browserต้องขอ Key จาก Google
🔒
สำคัญ: การ validate ฝั่ง JS เพียงอย่างเดียวไม่ปลอดภัย — ผู้ไม่หวังดีสามารถส่ง POST ตรงไปยัง api.php ได้โดยข้าม JS ทั้งหมด ระบบนี้จึงมีการตรวจทั้งสองฝั่งเสมอ

แก้ปัญหาที่พบบ่อย

❌ GD / Imagick ไม่ผ่าน (Install Wizard)
ระบบไม่ได้ใช้งาน GD/Imagick กดผ่านได้เลย หรือเปิดใน XAMPP:
php.ini
;extension=gdextension=gd
# แล้ว Restart Apache
❌ อัปโหลดรูปไม่ได้ — "ย้ายไฟล์ล้มเหลว"
โฟลเดอร์ uploads ไม่มีสิทธิ์เขียน:
# XAMPP Windows — ไม่ต้องทำอะไร (ปกติผ่านเลย)
# Linux / cPanel
chmod 755 admin/uploads/
chmod 755 public/uploads/
# ถ้ายังไม่ได้ ลอง:
chmod 775 admin/uploads/
❌ หน้าเว็บแสดง Error 500
ตรวจสอบ PHP error log — ส่วนใหญ่เกิดจาก config.php ยังไม่ถูกสร้าง (ติดตั้งไม่สำเร็จ) หรือ DB connection ผิด
# ตรวจ config.php
admin/includes/config.php  ← ต้องมีไฟล์นี้หลังติดตั้ง

# เปิด PHP errors ชั่วคราว (เพิ่มต้นไฟล์ index.php)
ini_set('display_errors', 1);
error_reporting(E_ALL);
❌ ส่งอีเมลไม่ได้
บน XAMPP local ต้องตั้ง SMTP:
# php.ini (XAMPP)
SMTP = smtp.gmail.com
smtp_port = 587
sendmail_from = your@gmail.com
หรือใช้ MailHog (localhost:8025) สำหรับ local testing
❌ หน้าเว็บ Public โหลดสินค้าไม่ขึ้น
เปิด Browser DevTools → Network → ดู response ของ api.php — ตรวจสอบว่า path ใน public/api.php ชี้ไปยัง admin/includes/config.php ถูกต้อง
# บรรทัดแรกใน public/api.php
require_once __DIR__ . '/../admin/includes/config.php';
❌ รูปภาพสินค้าไม่แสดงในหน้า Public
รูปภาพเก็บใน admin/uploads/ ระบบสร้าง URL อัตโนมัติโดยใช้ $_SERVER['HTTP_HOST'] — ตรวจสอบว่า URL ที่ได้ถูกต้องโดยดูใน response ของ api.php?action=products
❌ ลืมรหัสผ่าน Admin
แก้โดยตรงใน MySQL:
-- รัน SQL นี้ใน phpMyAdmin
UPDATE admin_users
SET password = '$2y$12$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi'
WHERE username = 'admin';
-- รหัสผ่านใหม่จะเป็น: password

🙏

หากพบปัญหาอื่นๆ ตรวจสอบ PHP error log เป็นอันดับแรกเสมอครับ

CHONIE DEV CMS v1.1 — สร้างด้วย PHP + MySQL + ❤️