Superglobals: $_POST
ในบทที่แล้ว เราได้เรียนรู้เกี่ยวกับ $_GET ซึ่งเป็น Superglobal array ที่ใช้รับข้อมูลจาก URL วันนี้เราจะมาทำความรู้จักกับ $_POST อีกหนึ่ง Superglobal ที่มีความสำคัญไม่แพ้กัน โดย $_POST จะใช้สำหรับรับข้อมูลที่ส่งมาจากฟอร์ม (Form) ในรูปแบบ POST method
ความหมายของ $_POST
$_POST เป็น Superglobal array ใน PHP ที่ใช้เก็บข้อมูลที่ถูกส่งมาจากฟอร์มโดยใช้ HTTP POST method ข้อมูลที่ถูกส่งมาจะอยู่ในรูปแบบของ key-value pairs ซึ่ง key คือ name attribute ของ input fields ในฟอร์ม และ value คือค่าที่ผู้ใช้กรอกลงไปใน input field นั้นๆ
ข้อดีของการใช้ POST method คือข้อมูลจะถูกส่งใน HTTP body ไม่ได้แสดงใน URL ทำให้มีความปลอดภัยมากกว่า GET method (โดยเฉพาะข้อมูลสำคัญ เช่น รหัสผ่าน) และสามารถส่งข้อมูลจำนวนมากได้
การส่งข้อมูลผ่าน Form ด้วย POST Method
ในการส่งข้อมูลผ่านฟอร์มด้วย POST method เราจะต้องกำหนด attribute method="post" ใน <form> tag ตัวอย่างเช่น:
<form action="process.php" method="post">
<label for="name">ชื่อ:</label><br>
<input type="text" id="name" name="name"><br><br>
<label for="email">อีเมล:</label><br>
<input type="email" id="email" name="email"><br><br>
<input type="submit" value="ส่งข้อมูล">
</form>
ในตัวอย่างนี้ ฟอร์มจะส่งข้อมูลไปยังไฟล์ process.php เมื่อผู้ใช้กดปุ่ม "ส่งข้อมูล" ข้อมูลที่ส่งไปจะประกอบด้วย:
name: ค่าที่ผู้ใช้กรอกในช่อง "ชื่อ"email: ค่าที่ผู้ใช้กรอกในช่อง "อีเมล"
สังเกตว่า name attribute ใน <input> tag มีความสำคัญมาก เพราะมันจะเป็น key ใน $_POST array
การรับข้อมูลใน PHP
ในไฟล์ process.php เราสามารถเข้าถึงข้อมูลที่ส่งมาจากฟอร์มได้โดยใช้ $_POST array:
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = $_POST["name"];
$email = $_POST["email"];
echo "ชื่อ: " . htmlspecialchars($name) . "<br>";
echo "อีเมล: " . htmlspecialchars($email) . "<br>";
} else {
echo "ไม่สามารถเข้าถึงหน้านี้โดยตรงได้";
}
?>
อธิบายโค้ด:
$_SERVER["REQUEST_METHOD"] == "POST": ตรวจสอบว่า request method เป็น POST หรือไม่ เพื่อป้องกันการเข้าถึงไฟล์โดยตรง$name = $_POST["name"];: รับค่าจาก$_POSTarray โดยใช้ key "name" และเก็บไว้ในตัวแปร$name$email = $_POST["email"];: รับค่าจาก$_POSTarray โดยใช้ key "email" และเก็บไว้ในตัวแปร$emailhtmlspecialchars($name)และhtmlspecialchars($email): ใช้ฟังก์ชันhtmlspecialchars()เพื่อป้องกัน XSS (Cross-Site Scripting) โดยการแปลง special characters เป็น HTML entitiesecho: แสดงผลข้อมูลที่รับมา
ตัวอย่าง: ฟอร์ม Login
ลองมาดูตัวอย่างการสร้างฟอร์ม Login ที่ใช้ POST method:
<form action="login.php" method="post">
<label for="username">ชื่อผู้ใช้:</label><br>
<input type="text" id="username" name="username"><br><br>
<label for="password">รหัสผ่าน:</label><br>
<input type="password" id="password" name="password"><br><br>
<input type="submit" value="เข้าสู่ระบบ">
</form>
และโค้ด PHP สำหรับตรวจสอบ Login (login.php):
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$username = $_POST["username"];
$password = $_POST["password"];
// ตรวจสอบ username และ password ในฐานข้อมูล หรือจากแหล่งข้อมูลอื่นๆ
if ($username == "admin" && $password == "password") {
echo "เข้าสู่ระบบสำเร็จ!";
} else {
echo "ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง";
}
} else {
echo "ไม่สามารถเข้าถึงหน้านี้โดยตรงได้";
}
?>
ข้อควรระวัง: ในตัวอย่างนี้ เราใช้ username และ password แบบ hardcoded ซึ่งไม่ปลอดภัยสำหรับการใช้งานจริง ในบทเรียนต่อๆ ไป เราจะเรียนรู้วิธีการเก็บรหัสผ่านอย่างปลอดภัยและการเชื่อมต่อกับฐานข้อมูล
ความแตกต่างระหว่าง GET และ POST
GET และ POST เป็น HTTP methods ที่ใช้สำหรับส่งข้อมูลจาก client ไปยัง server แต่มีความแตกต่างกันดังนี้:
- ข้อมูล: GET ส่งข้อมูลผ่าน URL (query string) ส่วน POST ส่งข้อมูลใน HTTP body
- ความปลอดภัย: POST ปลอดภัยกว่า GET เนื่องจากข้อมูลไม่แสดงใน URL
- ขนาดข้อมูล: POST สามารถส่งข้อมูลได้มากกว่า GET (GET มีข้อจำกัดเรื่องความยาวของ URL)
- การใช้งาน: GET เหมาะสำหรับการดึงข้อมูล (เช่น การค้นหา) ส่วน POST เหมาะสำหรับการส่งข้อมูลเพื่อสร้าง แก้ไข หรือลบข้อมูล (เช่น การสมัครสมาชิก การสั่งซื้อสินค้า)
- Bookmark: GET สามารถ bookmark URL ได้ (เพราะข้อมูลอยู่ใน URL) แต่ POST ไม่สามารถทำได้
- Cache: GET สามารถ cache ได้ แต่ POST โดยทั่วไปจะไม่ cache
สรุปตารางความแตกต่าง:
| คุณสมบัติ | GET | POST |
|---|---|---|
| ข้อมูล | URL (Query String) | HTTP Body |
| ความปลอดภัย | น้อยกว่า | มากกว่า |
| ขนาดข้อมูล | จำกัด | ไม่จำกัด (ในทางปฏิบัติมีข้อจำกัดตาม server configuration) |
| การใช้งาน | ดึงข้อมูล | สร้าง/แก้ไข/ลบข้อมูล |
| Bookmark | ได้ | ไม่ได้ |
| Cache | ได้ | ไม่ได้ (โดยทั่วไป) |
ข้อผิดพลาดที่พบบ่อยและการแก้ไข
- ไม่ได้กำหนด
method="post"ใน<form>tag: ทำให้ข้อมูลถูกส่งด้วย GET method แทน - ไม่ได้กำหนด
nameattribute ใน<input>tag: ทำให้ข้อมูลไม่ถูกส่งไปที่ server - พยายามเข้าถึง
$_POSTโดยตรง (ไม่ได้ส่งข้อมูลผ่านฟอร์ม): ทำให้เกิด error "Undefined array key" ควรตรวจสอบ$_SERVER["REQUEST_METHOD"] == "POST"ก่อนเสมอ - ไม่ทำการ sanitize ข้อมูลที่รับมาจาก
$_POST: อาจทำให้เกิด XSS หรือ SQL injection ควรใช้htmlspecialchars()และ prepared statements (จะกล่าวถึงในบทเรียนต่อๆ ไป)
กรณีใช้งานจริง
$_POST ถูกใช้ในหลากหลายสถานการณ์ เช่น:
- ฟอร์มสมัครสมาชิก: รับข้อมูลชื่อ ที่อยู่ อีเมล และรหัสผ่านของผู้ใช้
- ฟอร์มติดต่อเรา: รับข้อมูลชื่อ อีเมล และข้อความจากผู้ใช้
- ฟอร์มสั่งซื้อสินค้า: รับข้อมูลที่อยู่จัดส่ง วิธีการชำระเงิน และรายละเอียดสินค้าที่สั่งซื้อ
- การอัปโหลดไฟล์: (จะกล่าวถึงในบทเรียนต่อๆ ไป)
- API endpoint ที่รับข้อมูล JSON: (จะกล่าวถึงในบทเรียนต่อๆ ไป)
ในบทนี้ เราได้เรียนรู้เกี่ยวกับ $_POST Superglobal array ซึ่งเป็นเครื่องมือสำคัญในการรับข้อมูลจากฟอร์มใน PHP การเข้าใจการทำงานของ $_POST และความแตกต่างระหว่าง GET และ POST จะช่วยให้คุณสามารถสร้างเว็บแอปพลิเคชันที่รับข้อมูลจากผู้ใช้ได้อย่างมีประสิทธิภาพและปลอดภัย ในบทถัดไป เราจะมาทำความรู้จักกับ $_REQUEST ซึ่งเป็น Superglobal ที่รวมเอาข้อมูลจาก GET, POST และ COOKIE เข้าไว้ด้วยกัน