ข้ามไปที่เนื้อหาหลัก

Debug CI4 ยังไงให้ได้ผล? เมื่อ Log เพียงอย่างเดียวไม่พอ — แนะนำ DEX


📅 June 2025  ·  🏷️ CodeIgniter 4, PHP, Debugging, DEX, Laravel  ·  

Debug CI4 ยังไงให้ได้ผล?
เมื่อ Log เพียงอย่างเดียวไม่พอ — แนะนำ DEX

CodeIgniter 4PHP DebuggingDEXLaravelWeb Development

เคยเจอ error แปลกๆ ใน production แล้วเปิด log ขึ้นมาดู แต่รู้สึกว่า "มันบอกแค่นี้เองเหรอ?" ไม่รู้ว่า request ทำอะไรไปก่อนจะ fail ไม่รู้ว่า query ไหนรันไปบ้าง ไม่รู้ว่า bug นี้เคยเกิดแล้วหรือเปล่า — บทความนี้มีคำตอบให้ครับ



🔍 ปัญหาที่นักพัฒนา CI4 ทุกคนเจอ

ถ้าคุณเคยทำงานกับ CodeIgniter 4 (CI4) มาสักพัก คุณคงรู้ดีว่า การ debug แอปพลิเคชันจริงๆ นั้น ไม่ง่ายอย่างที่คิด โดยเฉพาะเมื่อ application ขึ้น production ไปแล้ว

สิ่งที่เรามักเห็นใน log file มักมีหน้าตาแบบนี้:

// log ที่เห็นใน application/logs/
ERROR - 2025-06-09 14:32:11 --> Call to a member function getResult() on bool
ERROR - 2025-06-09 15:01:44 --> Trying to access array offset on value of type null

Log บอกได้ว่า error เกิด ที่ไหน แต่มันไม่บอกว่า:

  • Controller method ไหนที่รับ request นั้น?
  • Database query อะไรรันไปก่อนหน้า?
  • Error เกิดใน service, model, หรือ API call?
  • Bug นี้เคยถูก fix แล้วและ กลับมาใหม่ หรือเปล่า?

ข้อสุดท้ายนี่เจ็บปวดที่สุดครับ บางครั้งเรา fix bug ไปแล้ว แต่สัปดาห์ต่อมามันกลับมา แล้วเราก็เริ่ม debug ใหม่ราวกับว่ามันเป็น bug ใหม่ — ทั้งที่จริงๆ มันคือ regression


🛠️ DEX คืออะไร?

DEX คือ open-source issue tracking tool ที่สร้างขึ้นมาเพื่อ CodeIgniter 4 โดยเฉพาะ มันไม่ได้แค่ดักจับ error แต่มันบันทึก context รอบๆ request ทั้งหมดให้คุณด้วย เพื่อให้คุณเข้าใจได้ว่า:

  • แอปทำอะไรก่อนที่มันจะพัง

  • issue นี้เป็น ใหม่, ignored, resolved หรือ regressed?

  • request lifecycle เป็นยังไงแบบ timeline

  • มี slow query หรือ failed query ก่อน error ไหม?

💡 ตัวอย่างจริง:

ลูกค้าแจ้งว่า checkout ล้มเหลว — Log บอกว่ามี exception แต่คำถามคือ: cart โหลดสำเร็จไหม? payment provider ถูกเรียกไหม? error เกิดก่อนหรือหลัง payment? DEX ตอบคำถามพวกนี้ได้ทั้งหมด


⚙️ ติดตั้ง DEX ใน CI4 Project

การติดตั้ง DEX ทำได้ผ่าน Composer เหมือน package ทั่วไปครับ:

# ติดตั้งผ่าน Composer
composer require sarutobi/dex

จากนั้น run migration เพื่อสร้าง table ในฐานข้อมูล:

# Run migration
php spark migrate --all

แล้วก็เพิ่ม DEX filter เข้าไปใน app/Config/Filters.php:

use Sarutobi\Dex\Filters\DexFilter;

// ใน $globals หรือ $filters ตาม route ที่ต้องการ track
public $globals = [
    'before' => [
        DexFilter::class,
    ],
];

เพียงเท่านี้ DEX ก็จะเริ่มจับ request ทุกอันของคุณแล้ว


📊 เปรียบเทียบ: Log อย่างเดียว VS ใช้ DEX

สิ่งที่ต้องการรู้Log ไฟล์อย่างเดียวใช้ DEX
Error message พร้อม stack trace✓ มี✓ มี
Controller / Method ที่รับ request✗ ไม่มี✓ มี
Database queries ที่รันก่อน error✗ ไม่มี✓ มี
Request lifecycle timeline✗ ไม่มี✓ มี
สถานะ issue (new / resolved / regressed)✗ ไม่มี✓ มี
ค้นหาและจัดการ issue แบบมี workflowยาก✓ มี UI ให้
ตรวจจับ regression✗ ไม่มี✓ แจ้งเตือนได้
Self-hosted ไม่ต้องพึ่ง third-party SaaS✓ ได้✓ ได้

🐛 วิธี Debug CI4 เบื้องต้น (ก่อนใช้ DEX)

ก่อนจะพูดถึง DEX เพิ่มเติม มาทบทวนเทคนิค debug พื้นฐานใน CI4 กันก่อนครับ สำหรับมือใหม่ที่เพิ่งเริ่มต้น

1. เปิด Display Errors ใน Development

// ใน app/Config/Boot/development.php
ini_set('display_errors', '1');
error_reporting(E_ALL);

⚠️ สำคัญ: อย่าเปิด display_errors ใน production เด็ดขาดครับ เพราะจะทำให้ข้อมูล internal ของระบบโชว์ให้ผู้ใช้เห็นได้

2. ใช้ var_dump() และ die() สำหรับ Quick Debug

// ใน Controller
public function checkout()
{
    $cart = $this->cartModel->getCart(session()->get('user_id'));

    // Debug ชั่วคราว — ดูว่า cart มีข้อมูลอะไรบ้าง
    var_dump($cart);
    die();

    // ... โค้ดที่เหลือ
}

3. ใช้ log_message() สำหรับ Production Debug

// บันทึก log พร้อม context
log_message('error', 'Checkout failed for user_id: ' . $userId);
log_message('debug', 'Cart data: ' . json_encode($cart));
log_message('info', 'Payment attempt at: ' . date('Y-m-d H:i:s'));

4. ใช้ CI4 Debug Toolbar

CI4 มี built-in Debug Toolbar ที่เปิดใช้ได้ใน development mode ใน app/Config/Toolbar.php:

// ใน app/Config/Toolbar.php
public $collectors = [
    Timers::class,
    Database::class,    // ดู queries ที่รัน
    Logs::class,
    Views::class,
    Cache::class,
    Files::class,
    Routes::class,
    Events::class,
];

Toolbar นี้จะโชว์ข้อมูลที่ bottom bar ของหน้า web ในขณะ develop ซึ่งมีประโยชน์มากสำหรับดู query time และ route ที่ match


🔄 Workflow การ Debug ด้วย DEX

เมื่อ DEX ติดตั้งแล้ว workflow การ debug จะเปลี่ยนไปอย่างชัดเจนครับ แทนที่จะเปิด log file แล้วค้นหาเองแบบ manual คุณจะได้ทำงานแบบนี้:

// DEX จะ capture exception โดยอัตโนมัติผ่าน Exception Handler
// ใน app/Config/Exceptions.php เพิ่ม:

use Sarutobi\Dex\Handlers\DexExceptionHandler;

public $handler = DexExceptionHandler::class;

จากนั้น DEX จะบันทึก issue พร้อมกับ context ครบ ได้แก่:

  • Request method, URI, headers — รู้ว่า request มาจากไหน
  • Database queries timeline — เห็นว่า query ไหนช้าหรือ fail
  • Issue status trackingopen ignored resolved regressed
  • Occurrence count — bug นี้เกิดกี่ครั้งแล้ว

🔴 สำหรับผู้ใช้ Laravel: มี Tool ที่ใกล้เคียงกันอยู่

ถ้าคุณทำงานกับ Laravel มากกว่า CI4 ระบบ ecosystem ของ Laravel มี tool สำหรับ debug ที่ครบครันอยู่แล้วครับ ลองเปรียบเทียบดู:

FeatureDEX (CI4)Laravel TelescopeLaravel Debugbar
Request lifecycle
Issue status trackingจำกัด
Regression detection
Production-readyDev only
Self-hosted
FrameworkCI4LaravelLaravel

จะเห็นว่า DEX มีจุดเด่นที่ issue status tracking และ regression detection ซึ่ง Telescope ยังทำได้ไม่เต็มที่ครับ


✅ Best Practices การ Debug PHP/CI4 อย่างมืออาชีพ

นอกจากการใช้ tool แล้ว วิธีคิดและวิธีเขียนโค้ดก็สำคัญมากครับ ขอแนะนำแนวทางปฏิบัติที่ดีที่สุดไว้ดังนี้:

1. แยก Logic ออกจาก Controller ให้ชัดเจน

// ❌ ไม่ดี — Controller ทำทุกอย่าง debug ยาก
public function createOrder()
{
    $data = $this->request->getPost();
    $db   = db_connect();
    $db->query("INSERT INTO orders ...");
    // ส่ง email, update stock, log ทุกอย่างอยู่ใน method เดียว
}

// ✓ ดี — แยก concern ออกจากกัน trace ได้ง่าย
public function createOrder()
{
    $data  = $this->request->getPost();
    $order = $this->orderService->create($data);
    return $this->respond(['order_id' => $order->id]);
}

2. ใส่ Try-Catch พร้อม Context ที่มีความหมาย

try {
    $result = $this->paymentGateway->charge($amount, $card);
} catch (\Exception $e) {
    log_message('error', 'Payment failed', [
        'user_id'   => $userId,
        'amount'    => $amount,
        'error'     => $e->getMessage(),
        'trace'     => $e->getTraceAsString(),
    ]);
    throw $e; // re-throw ให้ DEX จับได้
}

3. ตั้งชื่อ Route ให้สื่อความหมาย

// ใน app/Config/Routes.php
$routes->post('checkout/process', 'CheckoutController::process', [
    'as' => 'checkout.process'  // ชื่อ route ช่วยให้ DEX log อ่านง่าย
]);
$routes->get('order/(:num)/status', 'OrderController::status/$1', [
    'as' => 'order.status'
]);

🎯 สรุป

การ debug application จริงๆ ใน production ต้องการมากกว่าแค่การเปิดดู log file ครับ เราต้องการ workflow ที่ช่วยให้เราเห็นภาพรวมของ request ทั้งหมด ไม่ใช่แค่ error message เพียงบรรทัดเดียว

DEX ถูกสร้างมาเพื่อเติมช่องว่างตรงนี้ใน ecosystem ของ CodeIgniter 4 โดยเฉพาะ — ไม่ได้พยายามเป็น APM ขนาดใหญ่ แต่มุ่งเน้นที่การทำสิ่งหนึ่งสิ่งเดียวให้ดี นั่นคือ: บอกว่า CI4 request ของคุณทำอะไร ที่ไหน และทำไมมันถึงพัง

สำหรับนักพัฒนาที่ทำงานกับ business application ที่ใช้ CI4 มานานหลายปี DEX ช่วยให้การ debug กลายเป็น workflow ที่มีระเบียบ แทนที่จะเป็นการ "เดาเอา" จาก log ที่กระจัดกระจาย

ส่วนนักพัฒนา Laravel ก็ไม่ต้องน้อยใจ เพราะมี Telescope และ Debugbar รองรับอยู่แล้ว แต่ถ้าวันไหนต้องย้ายมาทำ CI4 บ้าง ลอง DEX ดูครับ — คุ้มค่าแน่นอน

🚀 พร้อมจะ Debug อย่างมืออาชีพแล้วหรือยัง?

ลอง DEX ใน CI4 project ของคุณวันนี้ หรือถ้ายังไม่มี project ลองเริ่มจาก Hello World ก็ได้ครับ — ขอแค่เริ่ม!

📖 อ่านบทความต้นฉบับ DEX 📚 CI4 Official Docs

💬 มีคำถามหรืออยากแชร์ประสบการณ์ debug? ฝากไว้ใน comment ด้านล่างได้เลยครับ


บทความนี้เขียนขึ้นจาก source: DEX on dev.to · Stack Overflow CI Debug · GitHub Gist: Testing CI Apps






PHP CI MANIA - PHP Code Generator 

โปรแกรมช่วยสร้างโค้ด "ลดเวลาการเขียนโปรแกรม"
ราคาสุดคุ้ม  
http://www.phpcodemania.com

ความคิดเห็น

ค้นหาบล็อกนี้

บทความที่นิยมสูงสุด ประจำปี

การทำ Index ให้ MySQL Database เพื่อเพิ่มความเร็ว

สำหรับตัวอย่างนี้จะเป็นการ JOIN ตาราง 2 ตาราง 1. tb_reject_hd 2. tb_reject_desc ซึ่งจะเชื่อมกันด้วยฟิลด์ docno จะเห็นว่าเราสามารถคิวรี่เรียกข้อมูลออกมาได้ตอนที่ยังไม่ใส่ ORDER BY แต่เมื่อใส่ ORDER BY เข้าไป จะหมุนค้างจนหน้าเว็บหยุดทำงาน จากนั้นก็ลองเพิ่ม INDEX ให้กับฟิลด์ docno ในตาราง tb_reject_desc  ซึ่งในตัวอย่างนี้จะสร้างตารางใหม่ขึ้นมาจากตารางเดิม เปลี่ยนชื่อเป็น tb_reject_desc_with_index และทำการเพิ่ม INDEX KEY เข้าไป เมื่อทดสอบคิวรี่แบบมี ORDER BY จะเห็นว่าสามารถแสดงผลได้ทันที จากการสังเกตตัวเลขเวลาในการประมวลผล จะเห็นได้ว่าแบบไม่ใช้ ORDER BY จะทำงานเร็วกว่า แต่ในการทำงานส่วนใหญ่ก็มักจะต้องใช้ ORDER BY อย่างหลีกเลี่ยงไม่ได้ เช่นกรณีค้นหา แบบเรียงลำดับ ตัวอย่างโค้ดคิวรี่ข้อมูลจากตารางที่ Add Index Key แล้ว <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>Add Index Key</title> </head> <body> <h2>ORDER BY with ...

PHP CI MANIA 0.8.4.09 แก้ไขปัญหา Import ไฟล์ Excel แล้วไม่สามารถบันทึกได้ + เพิ่มตัวเลือก Validate บางฟิลด์

- เพิ่มตัวเลือก Validate บางฟิลด์ กรณีละเว้นการตรวจสอบให้เอาเครื่องหมายเช็คถูกออก -  แก้ไขปัญหา Import ไฟล์ Excel แล้วไม่สามารถบันทึกได้ สมาชิก Premium ดาวน์โหลดได้ที่ http://fastcoding.phpcodemania.com/index.php/downloads PHP  CI  MANIA   - PHP Code Generator  โปรแกรมช่วยสร้างโค้ด "ลดเวลาการเขียนโปรแกรม" ราคาสุดคุ้ม    http://fastcoding.phpcodemania.com

แจกโค้ด PHP : รวมลิงค์ แจกฟรี!! ตัวอย่างโปรเจ็กต์ ที่พัฒนาด้วย PHP

       สำหรับหลายท่านที่ขอโค้ดเข้ามาทาง Inbox ของเฟซบุ๊กแฟนเพจ หรือถามถึงระบบต่างๆหลังไมค์มานั้น ส่วนใหญ่ก็มีแจกอยู่แล้วในเว็บบอร์ด ThaiCreate.Com นะครับ  และด้านล่างนี้ก็เป็น Source Code PHP ระบบต่างๆ ที่มีเหล่าผู้ใจดีแจกฟรี!! ให้นำไปลองใช้ลองศึกษากันครับ แจกฟรี  !! ตัวอย่างการ  PHP  Booking # จองห้องประชุม  ผ่านเว็บครับ http://www.thaicreate.com/php/forum/090558.html ระบบแบบสอบถาม https://www.thaicreate.com/php/forum/099342.html แจก code!! การทำประเมินออนไลน์มี ไว้สำหรับพัฒนาต่อยอด https://www.thaicreate.com/php/forum/102203.html แจกฟรี PHP CodeIgniter CMS ให้ทุกท่านได้ลอง (รองรับ Responsive) http://www.thaicreate.com/php/forum/122929.html โดย : https://www.cszcms.com/ แจก PHP : ระบบยืม-คืนเอกสาร (จากตัวอย่าง เอกสารข้อมูลวัตถุดิบสินค้า) http://www.thaicreate.com/php/forum/103428.html แจกระบบ PHP Shopping Cart ระบบตะกร้าสินค้า ระบบสั่งซื้อ มีระบบตัดสต๊อก, สั่งซื้อวัตถุดิบคงเหลือ ht...

การสร้างเว็บไซต์ในปี 2023 นั้นจะต้องคำนึงถึงอะไรบ้าง

การสร้างเว็บไซต์ในปี 2023 นั้นจะต้องคำนึงถึงความเปลี่ยนแปลงของเทคโนโลยีและแนวโน้มการใช้งานของผู้ใช้ใหม่ๆ ดังนั้น นี่คือเทคนิคที่สามารถช่วยให้การสร้างเว็บไซต์ในปี 2023 เป็นไปได้อย่างรวดเร็วและเป็นประสิทธิภาพ: 1. ใช้ Responsive Design: การออกแบบเว็บไซต์ให้สามารถปรับขนาดได้ตามขนาดของหน้าจอของอุปกรณ์ต่างๆ เช่น โทรศัพท์มือถือ แท็บเล็ต และคอมพิวเตอร์ เพื่อให้ผู้ใช้สามารถเข้าถึงและใช้งานได้ง่ายและสะดวก 2. ใช้โครงสร้างของ HTML5: การใช้โครงสร้าง HTML5 จะช่วยให้เว็บไซต์ของคุณมีประสิทธิภาพและปรับปรุงในเรื่องของการเข้าถึงข้อมูล การใช้งานและความปลอดภัย 3. ใช้ CSS Grids หรือ Flexbox: การใช้ CSS Grids หรือ Flexbox จะช่วยให้ง่ายต่อการจัดหน้าเว็บไซต์ และสามารถปรับแต่งรูปแบบของเว็บไซต์ได้ง่ายขึ้น 4. ใช้ JavaScript Frameworks: การใช้ JavaScript Frameworks เช่น React, Angular, หรือ Vue.js จะช่วยให้สามารถสร้างเว็บไซต์ที่เป็น interactive และมีประสิทธิภาพได้อย่างรวดเร็ว 5. ใช้ Content Management Systems (CMS): การใช้ CMS เช่น WordPress, Joomla, หรือ Drupal จะช่วยให้สามารถสร้างเว็บไซต์ได้อย่างร PHP  C...

PHP + Fullcalendar กับ MySQL

หลักการทำงาน เรียกข้อมูลจากตาราง tb_event ด้วยฟังก์ชั่นของ MySQLi ข้อมูลจากฐานข้อมูลจะถูกวนลูปเก็บไว้ใน $data และจะถูกส่งไปที่ Fullcalendar ด้วยการแปลงข้อมูลจาก PHP ให้อยู่ในรูปแบบ JSON อาร์เรย์ด้วยฟังก์ชั่น json_encode()

จัดระเบียบโค้ด ใน Notepad++ (Auto indentation plugin)

เวลาเขียนโค้ด แล้วไม่ได้จัดรูปแบบ หรือเอาโค้ดจาก Text Editor หนึ่งมาใช้ในอีกตัวหนึ่งก็มีโอกาสที่ Tab หรือ Space bar จะต่างกัน แล้วเราจะมานั่ง TAB เองก็คงไม่ไหว จึงจำเป็นต้องหา Plugin เข้ามาช่วย ลองค้นดูก็เจอกับกระทู้นี้ >> แม้หน้าตาจะไม่ตรงกันแต่หลักๆก็คือเพิ่ม Plugins เข้าไปชื่อ Indent By fold อ่านเต็มๆได้ที่นี่ https://softwarerecs.stackexchange.com/questions/1496/auto-indentation-plugin-for-notepad

PHP ระบบบริหารจัดการ พล็อตนิยาย - ตอนที่ 1

PHP Fiction Management System   โปรเจ็กต์นี้จะสร้างเป็น "ระบบบริหารจัดการพล็อตนิยาย" แบบง่ายๆ มาเล่าสู่กันฟังครับ มีอยู่ช่วงหนึ่งที่ผมสนใจการเขียนนิยาย และค้นหาข้อมูลเพิ่มเติมเกี่ยวกับการเขียนนิยาย และได้พบกับโปรแกรมหนึ่งที่ช่วยงานด้านการเขียนนิยายให้เป็นเรื่องที่ง่ายขึ้น แต่จากที่ได้อ่านรีวิวแล้วดูเหมือนว่า โปรแกรมช่วยเขียนนิยายนี้ ไม่จะไม่ค่อยรองรับภาษาไทย แต่ผมก็ยังไม่ได้ลองมาดาวน์โหลดมาลองใช้งานดูนะครับ แต่รู้สึกชอบเครื่องมือนี้ เลยอยากลองพัฒนาโดยถอดคุณสมบัติพื้นฐานมาใช้งานดู ว่าจะใช้กับงานเขียนนิยายได้จริงรึเปล่า ตัวอย่างระบบจัดการพล็อตเรื่อง เพื่อช่วยงานเขียนนิยาย หลังจากที่ได้นั่งคิดนอนคิด และหลับไปฝันไป จนในที่สุดก็ได้ฐานข้อมูลระบบบริหารจัดการพล็อตนิยายมาคร่าวๆ มาจนได้ โครงสร้างฐานข้อมูลตอนนี้อาจจะขี้เหร่ไปบ้าง แต่ในอนาคตก็คงจะพัฒนากันต่อไป   ตารางที่จะต้องสร้าง มีทั้งหมด ดังนี้ 1. รายชื่อนิยายทั้งหมด 2. แนวนิยายที่เขียน 3. พล็อตของแต่ละเรื่อง 4. ฉากเหตุการณ์ในแต่ละพล็อต 5. เนื้อเรื่องในแต่ละฉาก 6. รายชื่อตัวละครในนิยา...

MySQL คำสั่ง SQL จัดเรียงคำตามตัวอักษร ภาษาไทย ในฟิลด์ที่กำหนด Collation เป็น utf-8

การจัดเรียงข้อมูลตามลำดับตัวอักษรไทย   CONVERT( name USING tis620 ) ASC การเรียงลำดับตัวอักษรแบบ tis-620 ในการเขียนโปรแกรม PHP เพื่อแสดงข้อมูลจากฐานข้อมูล MySQL การเขียนคำสั่ง SQL ให้จัดเรียงลำดับนั้น เราจะใช้ ORDER BY  และกำหนดฟิลด์ที่ต้องการจัดเรียงลำดับ เช่น ในตัวอย่างนี้จะเป็นการจัดเรียงตามลำดับตัวอักษรของชื่อเมนู นั่นก็คือฟิลด์ name นั่นเอง แต่ในขั้นตอนการสร้างฐานข้อมูลนั้น เราได้กำหนด Charset ของตารางและฟิลด์เป็นการจัดเรียง Collation แบบ utf-8 เอาไว้เพื่อให้รองรับภาษาแบบมาตรฐาน ดังนั้นเมื่อเขียนโปรแกรมสั่ง ORDER BY name ASC ก็จะมีการจัดเรียงที่จะให้คำที่มีสระนำหน้าอยู่หลัง ฮ. นกฮุก ไปเสียหมด จะเห็นว่าชื่อเมนูหรือสินค้าที่มี ข นำหน้าจะมาเป็นลำดับแรก ทั้งที่จริงๆแล้ว มีสินค้าที่เป็น ก อยู่หลายรายการ เพียงแต่ว่ามีสระนำหน้าอยู่เท่านั้นเอง จากรูปด้านบน จะมีรายการที่เป็น ก อยู่ 3 รายการ คือเมนู โกโก้ ต่างๆ แต่เพราะมีสระโอ นำหน้า จึงทำให้การจัดเรียงแบบ utf-8 ให้อยู่ในลำดับท้าย เพื่อแก้ไขปัญหานี้ การเขียนโปรแกรมเพื่อ ORDER BY จะต้...

แก้ปัญหา Xampp เข้าผ่าน IP จากเครื่องอื่นไม่ได้ โดยการเปิด Firewall เชื่อมต่อ httpd ได้

กรณีที่ติดตั้ง Xampp แล้วเปิดจากเครื่องอื่นๆผ่าน IP ไม่ได้ ให้ทำการเปิด Firewall ในเครื่องที่ติดตั้ง xampp เพื่ออนุญาตให้เครื่องอื่นเข้าถึงได้ คลิกเมนู ค้นหา แล้วพิมพ์คำว่า firewall แล้วเลือกเมนู Firewall & network protection คลิกที่เมนู Allow an app through firewall คลิกที่ปุ่ม Change settings เลือกทั้ง Private และ Public (ถ้าไม่มีให้กดที่ปุ่ม Allow another app... เพื่อเพิ่ม httpd.exe ใน Path เฉพาะของเรา กรณีที่ไม่ได้ติดตั้ง) (สามารถเปิดดูรายละเอียด Path ของรายการที่แสดงได้ โดยคลิกปุ่ม Details...)   จากนั้นกด OK   ลองเข้าจากอีกเครื่องด้วย IP อีกครั้ง ก็จะพบว่าสามารถเข้าถึงหน้าเว็บที่ต้องการได้เรียบร้อย ที่มา : https://www.youtube.com/watch?v=KIYpkDy34DY   บทความที่เกี่ยวข้อง แก้ปัญหาการเปิด Firewall ทำให้ Client เชื่อมต่อ MySQL ไม่ได้ https://phpcodemania.blogspot.com/2021/04/xampp-ip-firewall-httpd.html   PHP  CI  MANIA   - PHP Code Generator  โปรแกรมช่วยสร้างโค้ด "ลดเวลาการเขียนโปรแกรม" ราคาสุดคุ้ม    http://fastcoding...

ระบบวัสดุคงเหลือ - การตีราคาสินค้าคงเหลือด้วยวิธีราคาทุน (Inventory Costs Method)

การตีราคาสินค้าคงเหลือด้วยวิธีราคาทุน (Inventory Costs Method) หลังจากได้อ่านบทความในเว็บต่างๆก็สรุปได้ดังนี้ 1. FIFO เข้าก่อน-ออกก่อน เหมาะสำหรับการตัดสต๊อกที่ใช้สำหรับของที่มีวันที่หมดอายุกำกับไว้ อาจจะเนื่องด้วยพนักงานสต๊อกจะต้องคอยเช็ควันที่หมดอายุบนสินค้าเสมอๆอยู่แล้ว 2. LIFO เข้าหลัง-ออกก่อน เหมาะสำหรับการตัดสต๊อกสินค้าที่ตกเทรนเร็วแบบคอมพิวเตอร์ หรือสินค้าเทคโนโลยีอื่นๆ ซึ่งส่วนใหญ่จะทำโปรโมชั่นมาล่อตาล่อใจให้ลูกค้าซื้อรุ่นใหม่ๆ ดังนั้นพนักงานก็ต้องตัดสต๊อกตัวที่ใหม่ที่สุดออกก่อน เพราะทิ้งไว้นานไปราคาทุน ณ ปัจจุบันจะไม่ตรงกับราคาที่ขายไป 3. Weighted Average ถัวเฉลี่ยน้ำหนัก เหมาะกับสินค้าที่ไม่มีวันหมดอายุกำกับ และราคาขึ้นลงไม่มากนัก (คอมพิวเตอร์หรือสินค้าเทคโนโลยีจะขึ้นลงทีเป็นหลักร้อยหลักพัน) ซึ่งเหมาะกับการนำมาใช้ทำสต๊อกวัสดุคงเหลือของสำนักงาน ปัญหาของการใช้ Weighted Average หรือการถัวเฉลี่ยราคาทุนต่อหน่วย จะมีอยู่ 2 รูปแบบ 1. แบบ Periodic Inventory เป็นการคิดราคาทุนถัวเฉลี่ยของสินค้าคงเหลือปลายงวด นั่นก็คือ บันทึกการรับเข้าด้วยราคาต่อหน่...

บทความเดือนล่าสุด

แจกโค้ด PHP : รวมลิงค์ แจกฟรี!! ตัวอย่างโปรเจ็กต์ ที่พัฒนาด้วย PHP

       สำหรับหลายท่านที่ขอโค้ดเข้ามาทาง Inbox ของเฟซบุ๊กแฟนเพจ หรือถามถึงระบบต่างๆหลังไมค์มานั้น ส่วนใหญ่ก็มีแจกอยู่แล้วในเว็บบอร์ด ThaiCreate.Com นะครับ  และด้านล่างนี้ก็เป็น Source Code PHP ระบบต่างๆ ที่มีเหล่าผู้ใจดีแจกฟรี!! ให้นำไปลองใช้ลองศึกษากันครับ แจกฟรี  !! ตัวอย่างการ  PHP  Booking # จองห้องประชุม  ผ่านเว็บครับ http://www.thaicreate.com/php/forum/090558.html ระบบแบบสอบถาม https://www.thaicreate.com/php/forum/099342.html แจก code!! การทำประเมินออนไลน์มี ไว้สำหรับพัฒนาต่อยอด https://www.thaicreate.com/php/forum/102203.html แจกฟรี PHP CodeIgniter CMS ให้ทุกท่านได้ลอง (รองรับ Responsive) http://www.thaicreate.com/php/forum/122929.html โดย : https://www.cszcms.com/ แจก PHP : ระบบยืม-คืนเอกสาร (จากตัวอย่าง เอกสารข้อมูลวัตถุดิบสินค้า) http://www.thaicreate.com/php/forum/103428.html แจกระบบ PHP Shopping Cart ระบบตะกร้าสินค้า ระบบสั่งซื้อ มีระบบตัดสต๊อก, สั่งซื้อวัตถุดิบคงเหลือ ht...

สร้าง Cafe ERP ด้วย Go & Next.js

NEW RELEASE 2026 สร้าง Cafe ERP ด้วย Go & Next.js คู่มือลงมือทำระบบขายหน้าร้าน (POS) และระบบจัดการร้านค้า (ERP) จากศูนย์จนขึ้น Production จริง หนังสือ "สร้าง Cafe ERP ด้วย Go & Next.js" เล่มนี้ไม่ใช่หนังสือทฤษฎีทั่วไป แต่เป็น คู่มือระดับสถาปนิก (Architect Guide) ที่จะพาคุณลุยเขียนโค้ดทีละบรรทัด สร้างระบบบริหารจัดการร้านคาเฟ่ที่ทำงานได้เสถียร ไร้บั๊ก ปลอยภัย และที่สำคัญคือ **"ใช้งานทางธุรกิจได้จริงในประเทศไทย"** จุดเด่นที่ไม่เหมือนใครในหนังสือเล่มนี้ 🇹🇭 เกณฑ์สรรพากรไทยและภาษีมูลค่าเพิ่ม (VAT 7%) ไม่ละเลยกฎหมายสรรพากร! สอนออกแบบ Schema และเขียนโค้ดคำนวณภาษีมูลค่าเพิ่ม (VAT Inclusive/Exclusive) สำหรับการออก **ใบกำกับภาษีอย่างย่อ (ABB)** และ **ใบกำกับภาษีเต็มรูป (FULL)** รวมไปถึงสรุปรายงานภาษีตอนปิดกะ 🔌 ต่อเชื่อม Hardware & การทำงานแบบไร้เน็ต (Offline-First) เจาะ...

PHP CI MANIA : ตอนที่ 8 วิธีสร้าง Dropdown List ให้เลือกในแบบฟอร์มป้อนข้อมูล แบบ JOIN มาจากตารางอื่น (Option List)

เปิดไปที่แท็ป " ตั้งค่า " เลื่อนลงไปใน ส่วนที่ 3 เพื่อตั้งค่าการ JOIN TABLE เมื่อคลิกที่ไอคอน จะปรากฏป๊อบอัพให้เลือก Table ที่ต้องการ JOIN และกำหนดฟิลด์อ้างอิง และฟิลด์ที่ต้องการนำมาแสดงผลในช่อง Drop-down list   ในตัวอย่างนี้จะ JOIN กับตารางสมาชิก tb_members และอ้างอิงด้วย userid และดึงชื่อกับนามสกุลมาแสดง เมื่อกำหนดเรียบร้อยไอคอนฐานข้อมูลจะเปลี่ยนเป็นสีฟ้า จากนั้นก็กดสร้างไฟล์ Model / Views / JavaScript / Controller และกด Preview ดูผลลัพธ์จะได้ดังภาพต่อไปนี้ สังเกตว่าจากเดิมที่ Label ในหน้าตั้งค่าเป็น "ไอดีผู้ใช้งาน" จะกลายเป็น "ชื่อผู้ใช้งาน" แทนในหน้าแบบฟอร์มเพิ่มข้อมูล และเป็น Drop-Down list ที่สามารถค้นหารายชื่อจากตาราง tb_members ได้อีกด้วย ดูคลิปวิดีโอแนะนำการใช้งานได้ที่นี่ << กำหนด INPUT เป็นประเภทต่างๆ   การค้นหา แบ่งหน้า และการจัดเรียง » [[ PHP CI MANIA | ลดเวลาเขียนโค้ด เพิ่มเวลาบริหารจัดการได้มากขึ้น | Webpage Generator by CodeIgniter Framework ]] HOME

จัดระเบียบโค้ด ใน Notepad++ (Auto indentation plugin)

เวลาเขียนโค้ด แล้วไม่ได้จัดรูปแบบ หรือเอาโค้ดจาก Text Editor หนึ่งมาใช้ในอีกตัวหนึ่งก็มีโอกาสที่ Tab หรือ Space bar จะต่างกัน แล้วเราจะมานั่ง TAB เองก็คงไม่ไหว จึงจำเป็นต้องหา Plugin เข้ามาช่วย ลองค้นดูก็เจอกับกระทู้นี้ >> แม้หน้าตาจะไม่ตรงกันแต่หลักๆก็คือเพิ่ม Plugins เข้าไปชื่อ Indent By fold อ่านเต็มๆได้ที่นี่ https://softwarerecs.stackexchange.com/questions/1496/auto-indentation-plugin-for-notepad

ขั้นตอนการเปิด Error ใน CodeIgniter 4 เมื่อข้อความ Whoops!

ขั้นตอนการเปิด Error ใน CodeIgniter 4 Whoops! We seem to have hit a snag. Please try again later... เมื่อเกิดข้อผิดพลาด CodeIgniter 4 จะไม่แสดง Error message ออกมาให้เห็น เพราะตั้งค่าไว้ให้รันในโหมดเว็บเซิร์ฟเวอร์จริง (Production Server) เพื่อค้นหาวิธีการเปิดข้อความ Error จึงลองค้นหาใน Google ด้วยคำว่า "how to debug codeigniter 4" ก็ได้วิธีมาว่า ให้แก้ไขค่าที่ไฟล์ env โดยแก้ไขชื่อไฟล์เป็น .env หากใช้ Notepad++ ก็ให้คลิกขวา แล้วเลือก Edit with Notepad++ เลื่อนหาบรรทัด CI_ENVIRONMENT และทำการเปลี่ยนค่า ให้ลบเครื่องหมาย # ด้านหน้าออก และเปลี่ยนค่า production เป็น development กลับไปที่หน้าเว็บบราวเซอร์ แล้วกดรีเฟรชหน้าเว็บอีกครั้ง (F5) ก็จะปรากฏข้อความแสดง error ออกมาให้ Debug กันได้ง่ายขึ้น * หมายเหตุ * กรณีนำไปใช้บนเว็บโฮสติ้ง หรือบนเว็บเซิร์ฟเวอร์จริง (Production Server) ให้ทำการแก้ไขค่าเป็น production ก่อนอัพโหลด ที่มา :  https://stackoverflow.com/questions/60501607/how-to-debug-codeigniter-4 PHP  CI  MANIA   - PHP Code Generator  โป...

PHP ระบบบริหารจัดการ พล็อตนิยาย - ตอนที่ 1

PHP Fiction Management System   โปรเจ็กต์นี้จะสร้างเป็น "ระบบบริหารจัดการพล็อตนิยาย" แบบง่ายๆ มาเล่าสู่กันฟังครับ มีอยู่ช่วงหนึ่งที่ผมสนใจการเขียนนิยาย และค้นหาข้อมูลเพิ่มเติมเกี่ยวกับการเขียนนิยาย และได้พบกับโปรแกรมหนึ่งที่ช่วยงานด้านการเขียนนิยายให้เป็นเรื่องที่ง่ายขึ้น แต่จากที่ได้อ่านรีวิวแล้วดูเหมือนว่า โปรแกรมช่วยเขียนนิยายนี้ ไม่จะไม่ค่อยรองรับภาษาไทย แต่ผมก็ยังไม่ได้ลองมาดาวน์โหลดมาลองใช้งานดูนะครับ แต่รู้สึกชอบเครื่องมือนี้ เลยอยากลองพัฒนาโดยถอดคุณสมบัติพื้นฐานมาใช้งานดู ว่าจะใช้กับงานเขียนนิยายได้จริงรึเปล่า ตัวอย่างระบบจัดการพล็อตเรื่อง เพื่อช่วยงานเขียนนิยาย หลังจากที่ได้นั่งคิดนอนคิด และหลับไปฝันไป จนในที่สุดก็ได้ฐานข้อมูลระบบบริหารจัดการพล็อตนิยายมาคร่าวๆ มาจนได้ โครงสร้างฐานข้อมูลตอนนี้อาจจะขี้เหร่ไปบ้าง แต่ในอนาคตก็คงจะพัฒนากันต่อไป   ตารางที่จะต้องสร้าง มีทั้งหมด ดังนี้ 1. รายชื่อนิยายทั้งหมด 2. แนวนิยายที่เขียน 3. พล็อตของแต่ละเรื่อง 4. ฉากเหตุการณ์ในแต่ละพล็อต 5. เนื้อเรื่องในแต่ละฉาก 6. รายชื่อตัวละครในนิยา...

PHP จัดตารางการแข่งขันฟุตบอล / บาสเกตบอล / กีฬาประเภทพบกันทุกทีมเหย้า-เยือน

PHP generate football schedule ในโค้ดตัวอย่างด้านล่างนี้ จะเป็นการวนลูป for อยู่ด้วยกันทั้งหมด 3 รอบ for ครั้งที่ 1  กำหนดให้นับแค่ 2  ในลูปแรกจะเป็นทีมเหย้า ในลูปที่สองจะเป็นทีมเยือน for ครั้งที่ 2 จะนับตามจำนวนทีม ในตัวอย่างมี 8 ทีมก็จะนับจนกว่าจะครบ 8 ทีม for ครั้งที่ 3 จะนับตามจำนวนทีมคู่แข่ง ในตัวอย่างมี 8 ทีม ก็จะพบคู่แข่งอีก 7 ทีม  (ซึ่งพบกัน 2 ครั้ง เหย้า-เยือน ก็จะเท่ากับ 14 ครั้ง) ข้อสังเกต เมื่อขึ้น Day 9 จะมีการสลับเอาทีมเยือนขึ้นมาเป็นทีมเหย้า Team 2 จึงเป็นเจ้าบ้านรับการมาเยือนของ Team 1 แทน สำหรับโค้ดที่ใช้เป็นตัวอย่าง มีดังต่อไปนี้ [PHP CODE] <?php $teams = array( 'Team 1', 'Team 2', 'Team 3', 'Team 4', 'Team 5', 'Team 6', 'Team 7', 'Team 8' ); $team_logo[0] = 'https://cdn4.iconfinder.com/data/icons/pokemon-go/512/Pokemon_Go-15-512.png'; $team_logo[1] = 'https://cdn4.iconfinder.com/data/icons/pokemon-go/512/Pokemon_Go-16-512.png';...

PHP คืออะไร : มีหลักการทำงาน และสิ่งที่น่าสนใจอะไรบ้าง?

PHP คืออะไร? PHP ย่อมาจากคำว่า "Personal Home Page Tool" (ปัจจุบันได้เพิ่มเติมคำย่อใหม่โดยรวมกับตัวย่อเป็น  PHP : PHP Hypertext Preprocessor ) ซึ่งเป็นภาษาประเภท Script Language ที่ทำงานแบบ Server Side Script กระบวนการทำงานจะทำงานแบบ โปรแกรมแปลคำสั่ง  interpreter คือแปลภาษาทุกครั้งที่มีคนเรียกสคริปต์ ข้อดีคือ ไม่ต้องนำไปประมวลผลใหม่ (Compiler) เมื่อจะนำโปรแกรมไปใช้งาน หรือจะอัพเดตเวอร์ชั่นของโปรแกรม สามารถอัพโหลดขึ้นไปทับไฟล์เดิมแล้วใช้งานได้ทันที ขอเสียที่ต่างกันอย่างชัดเจนก็คือ กรณี Syntax ผิดจะรู้ก็ต่อเมื่อมีผู้ใช้งานเจอบั๊ก ภาษา PHP  จัดอยู่ในประเภท การเขียนโปรแกรมบนเว็บ (Web-based Programming) เพราะเราจะเก็บโค้ดคำสั่ง หรือสคริปต์ทั้งหมดที่เขียนขึ้นมาไว้บนเครื่องเซิร์ฟเวอร์ที่เดียว (Web Server)  และให้ผู้ใช้งาน (Client) เรียกใช้งานโปรแกรมผ่านเว็บเบราเซอร์ต่างๆ เช่น Internet Explorer, Mozilla Firefox, Google Chrome, Opera, Safari ฯลฯ เพื่อนำข้อมูลมาแสดงผลที่หน้าจอของผู้ใช้แต่ละคนนั่นเอง PHP มีอะไรน่าสนใจบ้าง? เรามาลองพูดถึงเรื่องของการสร้...

PHP + Fullcalendar กับ MySQL

หลักการทำงาน เรียกข้อมูลจากตาราง tb_event ด้วยฟังก์ชั่นของ MySQLi ข้อมูลจากฐานข้อมูลจะถูกวนลูปเก็บไว้ใน $data และจะถูกส่งไปที่ Fullcalendar ด้วยการแปลงข้อมูลจาก PHP ให้อยู่ในรูปแบบ JSON อาร์เรย์ด้วยฟังก์ชั่น json_encode()

PHP เบื้องต้น | รวมวิดีโอสอนเขียนโปรแกรม PHP & MySQL

1. พื้นฐาน PHP     1.1  โครงสร้างการเขียน PHP ร่วมกับ HTML     1 .2  Selection Structure : การเขียนโปรแกรมแบบทางเลือก     1. 3  ตัวแปร (Variable) และ ค่าคงที่ (Constant)     1.4  ตัวดำเนินการ (Operator)     1.5  เครื่องหมาย Single Quote / Double Quote และ Escape Sequence     1.6  Repetition Structure (การเขียนโปรแกรมวนซ้ำ)          1.7  การแทรกโค้ PHP ส่วนต่างๆของ HTML     1.8  PHP Function 2. PHP MySQLi CRUD : การจัดการฐานข้อมูล MySQL เบื้องต้น      2.1 : การบันทึกข้อมูลด้วย MySQLi Function      2.2 การค้นหาและแสดงข้อมูลในรูปแบบตาราง 1/2     2.3  การค้นหาและแสดงข้อมูลในรูปแบบตาราง 2/2      2. 4 การแก้ไขข้อมูลด้วยคำสั่ง UPDATE     2. 5 การลบข้อมูลจากฐานข้อมูล     2. 6 การป้องกัน SQL Injection ด้วยการใช้ prepare และ bindparam           2.7 กา...