คำสั่ง dnf: ติดตั้ง อัปเดต ลบแพ็กเกจ และความต่างจาก yum
คำสั่ง dnf เป็นคำสั่งจัดการแพ็กเกจบนลินุกซ์ตระกูล RHEL สำหรับค้นหา ติดตั้ง อัปเดต และลบแพ็กเกจ บน AlmaLinux 9 แม้จะพิมพ์ yum ก็จะรันโปรแกรมเดียวกัน บนเซิร์ฟเวอร์ AlmaLinux 9 เราได้รัน search, info, provides และ history จริง แล้วตรวจสอบจากเอาต์พุตว่า search, info และ provides ที่ใช้ค้นหาแพ็กเกจแต่ละคำสั่งดูข้อมูลจากที่ใด รวมถึงบันทึกการทำงานที่เหลืออยู่ใน history
เราไม่ได้รันคำสั่งที่เปลี่ยนแปลงระบบ เช่น การติดตั้ง การลบ และการอัปเดต แต่ตรวจสอบการทำงานของคำสั่งเหล่านั้นจากเอกสารทางการของ DNF และบันทึกการทำงานที่มีอยู่แล้วบนเซิร์ฟเวอร์
1️⃣ ความสัมพันธ์ระหว่างคำสั่ง dnf กับ yum
อาจเข้าใจได้ง่ายว่าการพิมพ์ yum จะรัน yum รุ่นเก่า แต่บน AlmaLinux 9 ทั้ง yum และ dnf เป็นลิงก์ที่ชี้ไปยังไฟล์ปฏิบัติการเดียวกันคือ dnf-3
ls -l /usr/bin/yum /usr/bin/dnflrwxrwxrwx 1 root root 5 May 21 04:48 /usr/bin/dnf -> dnf-3
lrwxrwxrwx 1 root root 5 May 21 04:48 /usr/bin/yum -> dnf-3ความต่างระหว่าง yum กับ dnf มีเพียงชื่อที่พิมพ์เท่านั้น ไม่ว่าจะพิมพ์แบบใด คำสั่งย่อยและออปชันก็เหมือนกัน เอาต์พุตของ search htop ที่รันด้วย yum และด้วย dnf ก็เหมือนกันทุกประการ
ตามเอกสารทางการของ DNF [Changes in DNF CLI compared to YUM] update และ upgrade ทำงานเหมือนกัน และเอกสารแนะนำให้ใช้ upgrade
บนดิสทริบิวชันรุ่นเก่าที่ไม่มี dnf ให้ใช้ คำสั่ง yumตามเดิม ชื่อคำสั่งย่อยในบทความนี้ เช่น install, search และ history ก็เหมือนกันใน yum
2️⃣ การค้นหาแพ็กเกจด้วยคำสั่ง dnf: search, info, provides
เมื่อไม่รู้ชื่อแพ็กเกจที่แน่นอนของโปรแกรมที่ต้องการติดตั้ง ให้ค้นหาด้วย search ตามด้วยคำหนึ่งคำ search จะค้นหาคำนั้นในชื่อและสรุป (Summary) ของแพ็กเกจ และวางแพ็กเกจที่ชื่อตรงกันทุกตัวอักษรไว้บนสุด
dnf search htopLast metadata expiration check: 0:21:53 ago on Wed Oct 28 15:24:31 2026.
========================== Name Exactly Matched: htop ==========================
htop.x86_64 : Interactive process viewerhtop มีแพ็กเกจที่ชื่อตรงกันทุกตัวอักษรเพียงตัวเดียว ผลลัพธ์จึงจบด้วยบรรทัดเดียวใต้ [Name Exactly Matched]
dnf search wgetLast metadata expiration check: 0:22:35 ago on Wed Oct 28 15:24:31 2026.
========================== Name Exactly Matched: wget ==========================
wget.x86_64 : A utility for retrieving files using the HTTP or FTP protocols
========================= Name & Summary Matched: wget =========================
perl-HTTP-Tinyish-Wget.noarch : HTTP::Tinyish wget backend
wget2-devel.x86_64 : Libraries and header files needed for using wget2 libraries
wget2-libs.x86_64 : Runtime libraries for GNU Wget2
============================== Name Matched: wget ==============================
wget2.x86_64 : An advanced file and recursive website downloaderคำที่อยู่ในหลายแพ็กเกจอย่าง wget จะแสดงแยกเป็นสามกลุ่ม คือชื่อตรงกันทุกตัวอักษร มีทั้งในชื่อและสรุป และมีเฉพาะในชื่อ
search ไม่ได้ดูประโยคคำอธิบาย (Description) จึงไม่เหมาะกับการค้นหาคำที่มีเฉพาะในคำอธิบาย กรณีนี้ให้เพิ่มออปชัน [--all] เพื่อขยายการค้นหาไปถึงคำอธิบายและ URL
เมื่อรู้ชื่อแพ็กเกจแล้ว ให้ใช้ info ตรวจสอบเวอร์ชัน ขนาด และรีโพซิทอรีที่แพ็กเกจนั้นมา
dnf info htopLast metadata expiration check: 0:22:37 ago on Wed Oct 28 15:24:31 2026.
Available Packages
Name : htop
Version : 3.3.0
Release : 1.el9
Architecture : x86_64
Size : 198 k
Source : htop-3.3.0-1.el9.src.rpm
Repository : epel
Summary : Interactive process viewer
URL : http://hisham.hm/htop/
License : GPLv2+
Description : htop is an interactive text-mode process viewer for Linux, similar to
: top(1).htop ที่ยังไม่ได้ติดตั้งจะแสดงใน info htop ใต้ [Available Packages] เป็นเวอร์ชัน 3.3.0 จากรีโพซิทอรี epel เนื่องจาก htop เป็นแพ็กเกจที่มีเฉพาะในรีโพซิทอรี epel หากรัน search ใหม่โดยไม่รวม epel จะไม่พบอะไรเลย
dnf info wgetLast metadata expiration check: 0:22:38 ago on Wed Oct 28 15:24:31 2026.
Installed Packages
Name : wget
Version : 1.21.1
Release : 11.el9_8
Architecture : x86_64
Size : 3.1 M
Source : wget-1.21.1-11.el9_8.src.rpm
Repository : @System
From repo : appstream
Summary : A utility for retrieving files using the HTTP or FTP protocols
URL : http://www.gnu.org/software/wget/
License : GPLv3+
Description : GNU Wget is a file retrieval utility which can use either the HTTP or
: FTP protocols. Wget features include the ability to work in the
: background while you are logged out, recursive retrieval of
: directories, file name wildcard matching, remote file timestamp
: storage and comparison, use of Rest with FTP servers and Range with
: HTTP servers to retrieve files over slow or unstable connections,
: support for Proxy servers, and configurability.wget ที่ติดตั้งแล้วแสดงใต้ [Installed Packages] โดย Repository เป็น @System และรีโพซิทอรีที่ดาวน์โหลดมาตอนติดตั้งถูกระบุเป็น appstream ในบรรทัด [From repo]
ในทางกลับกัน หากรู้เพียงชื่อไฟล์แต่ไม่รู้ว่าอยู่ในแพ็กเกจใด ให้ใส่พาธของไฟล์ต่อท้าย provides
dnf provides /usr/bin/treeLast metadata expiration check: 0:22:40 ago on Wed Oct 28 15:24:31 2026.
tree-1.8.0-10.el9.x86_64 : File system tree viewer
Repo : @System
Matched from:
Filename : /usr/bin/tree
tree-1.8.0-10.el9.x86_64 : File system tree viewer
Repo : baseos
Matched from:
Filename : /usr/bin/treeผลการค้นหา /usr/bin/tree แบ่งเป็นสองกลุ่ม คือฝั่งแพ็กเกจ tree ที่ติดตั้งแล้ว (@System) และฝั่งรีโพซิทอรี (baseos) โดย Filename ใต้ [Matched from] คือพาธที่ตรงกันจริง หากเขียนเพียงชื่อไฟล์โดยไม่มีพาธ dnf จะเติม /usr/bin/ และ /usr/sbin/ ไว้ข้างหน้าแล้วค้นหาอีกครั้ง หากยังไม่พบก็จะจบด้วยข้อผิดพลาดด้านล่าง
dnf provides nosuchfileLast metadata expiration check: 0:22:41 ago on Wed Oct 28 15:24:31 2026.
Error: No matches found. If searching for a file, try specifying the full path or using a wildcard prefix ("*/") at the beginning.ข้อความแสดงข้อผิดพลาดแนะนำให้เขียนพาธเต็ม หรือเติมไวลด์การ์ด [*/] ไว้ข้างหน้า คำสั่งทั้งสามรับอะไรเป็นอินพุตและค้นหาจากที่ใด เปรียบเทียบได้ทีละขั้นในแผนภาพด้านล่าง
3️⃣ การติดตั้ง ลบ และอัปเดตแพ็กเกจ: install, remove, upgrade
ติดตั้งแพ็กเกจที่พบด้วย install โดย dnf จะติดตั้งทั้งแพ็กเกจที่ระบุและแพ็กเกจที่ต้องพึ่งพาซึ่งแพ็กเกจนั้นต้องการไปพร้อมกันในครั้งเดียว
dnf install htopตามเอกสารทางการ dnf จะแสดงรายการแพ็กเกจที่จะติดตั้ง (สรุปทรานแซกชัน) แล้วถามว่าจะดำเนินการต่อหรือไม่ หากเพิ่ม [-y] จะดำเนินการต่อโดยไม่ถาม
แพ็กเกจที่ต้องพึ่งพาซึ่งต้องติดตั้งไปด้วย สามารถตรวจสอบล่วงหน้าได้ด้วย repoquery [--requires]
dnf repoquery --requires htopLast metadata expiration check: 0:22:59 ago on Wed Oct 28 15:24:31 2026.
libc.so.6(GLIBC_2.34)(64bit)
libcap.so.2()(64bit)
libhwloc.so.15()(64bit)
libm.so.6()(64bit)
libm.so.6(GLIBC_2.2.5)(64bit)
libm.so.6(GLIBC_2.29)(64bit)
libncursesw.so.6()(64bit)
libnl-3.so.200()(64bit)
libnl-3.so.200(libnl_3)(64bit)
libnl-genl-3.so.200()(64bit)
libnl-genl-3.so.200(libnl_3)(64bit)
libtinfo.so.6()(64bit)
rtld(GNU_HASH)หากใส่เพียง [--requires] จะแสดงเฉพาะชื่อไลบรารีที่ htop ต้องการ ส่วนไลบรารีนั้นอยู่ในแพ็กเกจใด ตรวจสอบได้ด้วยคำสั่งถัดไป
dnf repoquery --requires --resolve htopLast metadata expiration check: 0:23:01 ago on Wed Oct 28 15:24:31 2026.
glibc-0:2.34-283.el9_8.i686
glibc-0:2.34-283.el9_8.x86_64
hwloc-libs-0:2.4.1-6.el9_7.x86_64
libcap-0:2.48-10.el9_8.1.x86_64
libnl3-0:3.11.0-1.el9.x86_64
ncurses-libs-0:6.2-12.20210508.el9.x86_64เมื่อเพิ่ม [--resolve] ผลลัพธ์จะเปลี่ยนเป็นชื่อแพ็กเกจที่ให้ไลบรารีนั้น ในจำนวนนี้ hwloc-libs ไม่มีอยู่บนเซิร์ฟเวอร์ที่ทดสอบ จึงจะถูกติดตั้งไปด้วยเมื่อติดตั้ง htop
remove จะลบแพ็กเกจที่ระบุพร้อมกับแพ็กเกจที่พึ่งพาแพ็กเกจนั้น และในค่าเริ่มต้นจะลบแพ็กเกจที่ต้องพึ่งพาซึ่งไม่จำเป็นอีกต่อไปด้วย
dnf remove htopแม้จะลบเพียง htop แพ็กเกจที่ต้องพึ่งพาซึ่งแพ็กเกจอื่นไม่ต้องการ เช่น hwloc-libs ที่ติดตั้งมาเพราะ htop ก็จะถูกลบไปด้วย
แพ็กเกจที่เคยติดตั้งเป็นแพ็กเกจที่ต้องพึ่งพา แต่ตอนนี้ไม่มีแพ็กเกจใดต้องการแล้ว จะถูกลบโดย autoremove ให้ตรวจสอบรายการที่จะถูกลบก่อนด้วย list [--autoremove]
dnf list --autoremoveLast metadata expiration check: 0:23:09 ago on Wed Oct 28 15:24:31 2026.
Autoremove Packages
cmake-rpm-macros.noarch 3.31.8-3.el9 @appstream
grub2-tools-efi.x86_64 1:2.06-126.el9_8.alma.1 @baseos
grub2-tools-extra.x86_64 1:2.06-126.el9_8.alma.1 @baseos
libatomic.x86_64 11.5.0-14.el9.alma.1 @baseos
libvisual.x86_64 1:0.4.0-34.el9 @appstream
libwayland-server.x86_64 1.21.0-1.el9 @appstreamdnf autoremoveบนเซิร์ฟเวอร์ที่ทดสอบ รายการแสดงแพ็กเกจ 6 ตัว และ autoremove จะลบทั้ง 6 ตัวนี้ในครั้งเดียว
ตรวจสอบว่าแพ็กเกจที่ติดตั้งไว้มีเวอร์ชันใหม่หรือไม่ด้วย check-update หากใส่ชื่อแพ็กเกจ จะตรวจเฉพาะแพ็กเกจนั้น
dnf check-update libavif libdav1dLast metadata expiration check: 0:52:20 ago on Wed Oct 28 15:24:31 2026.
libavif.x86_64 1.1.1-3.el9 epel
libdav1d.x86_64 1.5.4-1.el9 epelคำสั่งด้านบนที่ใส่ libavif และ libdav1d จบด้วยรหัสออก 100 เพราะทั้งสองมีเวอร์ชันใหม่ check-update จะจบด้วย 100 เมื่อมีอัปเดต 0 เมื่อไม่มี และ 1 เมื่อเกิดข้อผิดพลาด จึงใช้เป็นเงื่อนไขแยกทางในสคริปต์ได้
หากใส่ชื่อแพ็กเกจต่อท้าย list จะแสดงทั้งเวอร์ชันที่ติดตั้งแล้วและเวอร์ชันใหม่ในรีโพซิทอรี ส่วน updateinfo list ใช้ตรวจสอบว่าอัปเดตนั้นอยู่ภายใต้ประกาศ (advisory) ใด
dnf list libavifLast metadata expiration check: 0:52:21 ago on Wed Oct 28 15:24:31 2026.
Installed Packages
libavif.x86_64 0.11.1-5.el9 @epel
Available Packages
libavif.x86_64 1.1.1-3.el9 epelสำหรับ libavif เวอร์ชันที่ติดตั้งแล้ว 0.11.1-5.el9 แสดงใต้ [Installed Packages] และเวอร์ชัน 1.1.1-3.el9 จากรีโพซิทอรีแสดงแยกใต้ [Available Packages]
dnf updateinfo list libavifLast metadata expiration check: 0:52:24 ago on Wed Oct 28 15:24:31 2026.
FEDORA-EPEL-2026-d611eab94a bugfix libavif-1.1.1-3.el9.x86_64เวอร์ชันใหม่นั้นเป็นอัปเดตตามประกาศ bugfix FEDORA-EPEL-2026-d611eab94a ส่วนอัปเดตด้านความปลอดภัยจะแสดงในตำแหน่งเดียวกันพร้อมระดับและ Sec. เช่น [Moderate/Sec.]
การอัปเดตทำด้วย upgrade โดย upgrade จะติดตั้งเวอร์ชันใหม่เฉพาะในขอบเขตที่ dependency เข้ากันได้ เวอร์ชันที่เห็นใน check-update จึงอาจไม่ถูกติดตั้งตามนั้นทุกประการ
dnf upgrade libavifหากใส่ชื่อแพ็กเกจ จะอัปเกรดเฉพาะแพ็กเกจนั้นและแพ็กเกจที่ต้องพึ่งพาที่จำเป็นเป็นเวอร์ชันใหม่
dnf upgradeหากไม่ใส่ชื่อ เป้าหมายคือแพ็กเกจที่ติดตั้งไว้ทั้งหมด ขั้นตอนที่แสดงสรุปทรานแซกชันแล้วถามว่าจะดำเนินการต่อหรือไม่เหมือนกับ install และทรานแซกชันที่รันแล้วจะถูกบันทึกเป็นหมายเลขใน history
4️⃣ รายการรีโพซิทอรีของคำสั่ง dnf: repolist
ที่ที่ search และ install ใช้ค้นหาแพ็กเกจคือรีโพซิทอรี (repository) โดย repolist จะแสดง id และชื่อของรีโพซิทอรีที่เปิดใช้งานอยู่ในขณะนี้
dnf repolistrepo id repo name
appstream AlmaLinux 9 - AppStream
baseos AlmaLinux 9 - BaseOS
epel Extra Packages for Enterprise Linux 9 - x86_64
epel-cisco-openh264 Extra Packages for Enterprise Linux 9 openh264 (From Cisco) - x86_64
extras AlmaLinux 9 - Extras
nginx-stable nginx stable repo
remi-modular Remi's Modular repository for Enterprise Linux 9 - x86_64
remi-safe Safe Remi's RPM repository for Enterprise Linux 9 - x86_64อาจเข้าใจได้ง่ายว่ารีโพซิทอรีที่ไม่อยู่ในรายการคือไม่มีบนเซิร์ฟเวอร์ แต่เอาต์พุตเริ่มต้นของ repolist แสดงเฉพาะรีโพซิทอรีที่เปิดใช้งาน หากเพิ่ม [--all] จะแสดงรีโพซิทอรีที่ปิดอยู่ด้วยพร้อมคอลัมน์ status บนเซิร์ฟเวอร์ที่ทดสอบ รีโพซิทอรี CRB ทั้งสามของ AlmaLinux 9 เป็น disabled ทั้งหมด
dnf repolist --all | grep -i crbcrb AlmaLinux 9 - CRB disabled
crb-debuginfo AlmaLinux 9 - CRB - Debug disabled
crb-source AlmaLinux 9 - CRB - Source disabledจำนวนแพ็กเกจ ที่อยู่มิเรอร์ เวลาหมดอายุของเมทาดาทา และตำแหน่งไฟล์ตั้งค่าของรีโพซิทอรีหนึ่งรายการ ตรวจสอบได้ด้วย repoinfo
dnf repoinfo baseosLast metadata expiration check: 0:22:55 ago on Wed Oct 28 15:24:31 2026.
Repo-id : baseos
Repo-name : AlmaLinux 9 - BaseOS
Repo-status : enabled
Repo-revision : 1793090609
Repo-updated : Tue Oct 27 17:43:29 2026
Repo-pkgs : 3458
Repo-available-pkgs: 3458
Repo-size : 21 G
Repo-mirrors : https://mirrors.almalinux.org/mirrorlist/9/baseos
Repo-baseurl : http://aws.repo.almalinux.org/almalinux/9.8/BaseOS/x86_64/os/ (9 more)
Repo-expire : 86400 second(s) (last: Wed Oct 28 15:24:26 2026)
Repo-filename : /etc/yum.repos.d/almalinux-baseos.repo
Total packages: 3458repoinfo baseos แสดงแพ็กเกจ 3,458 ตัว และตั้งให้ตรวจสอบเมทาดาทาใหม่ทุก 86,400 วินาที (หนึ่งวัน) ไฟล์ .repo ในบรรทัด [Repo-filename] คือไฟล์ตั้งค่าของรีโพซิทอรีนี้ ส่วนออปชัน [--set-enabled] และ [--set-disabled] สำหรับเปิดและปิดรีโพซิทอรีใช้ร่วมกับคำสั่ง config-manager ของ dnf-plugins-core
5️⃣ ประวัติการทำงานและการย้อนกลับของคำสั่ง dnf: history
เมื่อผ่านการติดตั้งและลบหลายครั้ง จะติดตามได้ยากว่าเปลี่ยนอะไรไปเมื่อใด แต่ dnf จะใส่หมายเลขให้ทุกทรานแซกชัน (transaction) และบันทึกไว้ใน history หากใส่ชื่อแพ็กเกจ จะแสดงเฉพาะทรานแซกชันที่เปลี่ยนแพ็กเกจนั้น
dnf history list tmuxID | Command line | Date and time | Action(s) | Altered
-------------------------------------------------------------------------------
51 | install -y tmux | 2026-10-15 20:40 | Install | 1เอาต์พุตที่กรองด้วย tmux เหลือเพียงบรรทัดเดียวของทรานแซกชันหมายเลข 51 ที่ติดตั้ง tmux ช่วงหมายเลขเขียนด้วยจุดสองจุด เช่น [50..51]
dnf history list 50..51ID | Command line | Date and time | Action(s) | Altered
-------------------------------------------------------------------------------
51 | install -y tmux | 2026-10-15 20:40 | Install | 1
50 | -y -q install mlocate | 2026-10-07 19:39 | Install | 1 EEตัวเลขในคอลัมน์ [Altered] คือจำนวนแพ็กเกจที่เปลี่ยน ท้ายบรรทัดหมายเลข 50 มี [EE] ต่อท้าย ซึ่งหมายความว่าทรานแซกชันเสร็จสิ้นแล้วแต่มีเอาต์พุตคำเตือนหรือข้อผิดพลาด
บรรทัดคำสั่ง แพ็กเกจที่เปลี่ยน และรหัสผลลัพธ์ของทรานแซกชันหนึ่งรายการ ตรวจสอบได้ด้วย history info
dnf history info 51Transaction ID : 51
Begin time : Thu Oct 15 20:40:51 2026
Begin rpmdb : d3db9c92a9d0f6ef9a7a1404552bb76e9d56ba7602b1fce73fa5a62170d33c5c
End time : Thu Oct 15 20:40:51 2026 (0 seconds)
End rpmdb : a862c33ee6a2f2d0479e4dc2631907dee47591c5b6795551b755c6cd090ac1df
User : root <root>
Return-Code : Success
Releasever : 9
Command Line : install -y tmux
Persistence : Persist
Comment :
Packages Altered:
Install tmux-3.2a-5.el9.x86_64 @baseosเมื่อเปิดหมายเลข 51 พบว่า [Command Line] ยังเก็บคำสั่งที่รัน install -y tmux ไว้ตามเดิม [Packages Altered] ระบุ tmux ที่ติดตั้งและรีโพซิทอรี @baseos ส่วน [Return-Code] ระบุ Success หากไม่ใส่หมายเลข จะแสดงทรานแซกชันล่าสุด
หากติดตั้งผิด ให้ใส่หมายเลขทรานแซกชันต่อท้าย history undo เพื่อรันการทำงานที่ตรงข้ามกับทรานแซกชันนั้น ส่วน rollback จะย้อนสถานะแพ็กเกจกลับไปยังจุดหลังทรานแซกชันที่ระบุทันที
dnf history undo 51ทรานแซกชัน 51 คือการติดตั้ง tmux ดังนั้น undo 51 จึงเป็นทรานแซกชันตรงข้ามที่ลบ tmux
dnf history rollback 50rollback 50 จะย้อนทรานแซกชันทั้งหมดที่รันหลัง 50 จนถึงรายการสุดท้าย ผลลัพธ์จึงอาจต่างจาก undo 51 ที่ลบเพียง tmux
ตามเอกสารทางการ หากมีแพ็กเกจที่ย้อนกลับไม่ได้ undo และ rollback จะจบโดยไม่เปลี่ยนแปลงอะไรเลย และแม้การเปลี่ยนแปลงที่ทำโดยตรงด้วย rpm จะไม่อยู่ในบันทึก ก็จะไม่หยุดด้วยข้อผิดพลาด
🔲 ซิมูเลเตอร์คำสั่ง dnf
ในซิมูเลเตอร์ด้านล่าง คุณสามารถพิมพ์คำสั่ง search, info, provides, repolist และ history ด้วยตัวเองเพื่อดูเอาต์พุตได้ แม้จะพิมพ์ด้วย yum ก็ได้ผลลัพธ์เดียวกัน
🔢 FAQ & เนื้อหาแนะนำ



ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน