ในการเอาค่าที่รับมาจากผู้ใช้ไปรวมเป็น query ต้อง “escape” ค่าที่รับมาจากผู้ใช้ด้วยฟังก์ชั่นที่เหมาะสม (แล้วแต่ ชนิดของฐานข้อมูล) ก่อนที่จะนำไปใช้
สำหรับ MySQL มีสองฟังก์ชั่น คือ mysql_escape_string() และ mysql_real_escape_string() แนะนำให้ใช้ตัวนี้
$_POST['username'] = mysql_real_escape_string($_POST['username']); $_POST['password'] = mysql_real_escape_string($_POST['password']); $sql = "SELECT * FROM `member` WHERE `username` = '$_POST[username]' AND `password` = '$_POST[password]'";
วิธีการสร้าง query
ข้างบน สามารถทำให้โค้ดกระชับขึ้น ด้วยการหลีกเลี่ยงการกำหนดค่าลงตัวแปรด้วยการเชื่อมต่อสตริง
ใช้การเชื่อมต่อสตริงเพื่อสร้าง SELECT query
// ไม่ต้องมีการกำหนดค่าลงตัวแปรก่อนนำไปใช้ // ลดขั้นตอนการทำงานของ PHP ลง // ประหยัดหน่วยความจำ $sql = "SELECT * FROM `member` WHERE `username` = '" . mysql_real_escape_string($_POST['username']) . "' AND `password` = '" . mysql_real_escape_string($_POST['password']) . "'";
แต่อ่านยาก แก้ยาก เขียนผิดพลาดได้ง่าย
ให้ใช้ฟังก์ชั่น sprintf() (เป็นฟังก์ชั่นที่ใช้ “แทนที่ค่าต่างๆ ลงใน string ตามรูปแบบที่ต้องการ”)
รูปแบบการใช้ sprintf(รูปแบบ, ค่าแทนที่)
รูปแบบ คือ string ที่เครื่องหมาย % ตามด้วยอังกฤษบางตัว เช่น %s, %d (การสร้าง query เราใช้แบบเดียวคือ %s) จะทำให้กลายเป็นจุดที่ค่าอื่นจะมาแทนที่ หากจะแสดงเครื่องหมาย % ต้องใช้ %%
ค่าแทนที่ สามารถมีได้หลายค่า
ตัวอย่างการใช้ sprintf()
echo sprintf('I am %s years old.', 10); // %s คือจุดที่จะแทนที่ด้วยค่าอื่น ในที่นี้คือ 10 จะได้ผลเป็น // I am 10 years old. echo sprintf('I have %s brothers and %s sisters.', 2, 4); // ค่าแทนที่มากกว่า 1 ค่า // I have 2 brothers and 4 sisters. echo sprintf('<div style="width: %s%%">Hello World</div>', 50); // %% จะกลายเป็น % // <div style="width: 50%">Hello World</div>
ใช้ sprintf() เพื่อสร้าง SELECT query ลองเปรียบเทียบกับการเชื่อมต่อสตริง แบบไหนอ่านง่ายกว่า?
sql = sprintf( "SELECT * FROM `member` WHERE `username` = '%' AND `password` = '%s'", mysql_real_escape_string($_POST['username']), // %s ตัวที่หนึ่ง mysql_real_escape_string($_POST['password']) // %s ตัวที่สอง );
ใช้ sprintf() เพื่อสร้าง INSERT query
ใช้ sprintf() เพื่อสร้าง UPDATE query
UPDATE `members`
SET
`username` = ‘%s’,
`password` = ‘%s’,
`first_name` = ‘%s’,
`last_name` = ‘%s’
WHERE `id` = ‘%s’
LIMIT 1
mysql_real_escape_string($_POST[‘username’]), // %s ตัวที่ 1
mysql_real_escape_string($_POST[‘password’]), // %s ตัวที่ 2
mysql_real_escape_string($_POST[‘first_name’]), // %s ตัวที่ 3
mysql_real_escape_string($_POST[‘last_name’]), // %s ตัวที่ 4
mysql_real_escape_string($_POST[‘id’]) // %s ตัวที่ 5