จะใช้ Backticks สำหรับตัวระบุตารางและคอลัมน์ แต่จำเป็นเฉพาะเมื่อตัวระบุเป็นคำสำคัญที่สงวนไว้ของ MySQLหรือเมื่อตัวระบุประกอบด้วยตัวอักษรช่องว่างหรือตัวอักษรที่เกินขอบเขตที่ จำกัด (ดูด้านล่าง) แนะนำให้หลีกเลี่ยงการใช้คำหลักที่สงวนไว้ เป็นตัวระบุคอลัมน์หรือตารางเมื่อเป็นไปได้หลีกเลี่ยงปัญหาการอ้างอิง
ควรใช้เครื่องหมายคำพูดเดี่ยวสำหรับค่าสตริงเช่นเดียวกับในVALUES()
รายการ อัญประกาศคู่ได้รับการสนับสนุนโดย MySQL สำหรับค่าสตริงเช่นกัน แต่อัญประกาศเดี่ยวเป็นที่ยอมรับอย่างกว้างขวางมากขึ้นโดย RDBMS อื่น ๆ ดังนั้นจึงเป็นนิสัยที่ดีที่จะใช้อัญประกาศแทนการดับเบิล
MySQL ยังคาดDATE
และค่าที่แท้จริงที่จะเป็นคนเดียวที่ยกมาเป็นสตริงเช่นDATETIME
'2001-01-01 00:00:00'
ศึกษาเอกสารวันที่และเวลาสำหรับรายละเอียดเพิ่มเติมโดยเฉพาะอย่างยิ่งทางเลือกในการใช้เครื่องหมายขีดคั่น-
เป็นตัวคั่นเซ็กเมนต์ในสตริงวันที่
ดังนั้นการใช้ตัวอย่างของคุณผมจะอ้างดับเบิลสตริง PHP 'val1', 'val2'
และใช้คำพูดเดียวบนค่า NULL
เป็นคำหลัก MySQL และพิเศษ (ไม่) - ค่าและจึงไม่ได้ยกมา
ไม่มีตัวระบุตารางหรือคอลัมน์เหล่านี้เป็นคำที่สงวนไว้หรือใช้ประโยชน์จากอักขระที่ต้องมีการอ้างอิง แต่ฉันได้ยกมาด้วย backticks (เพิ่มเติมในภายหลัง ... )
ฟังก์ชั่นพื้นเมืองของ RDBMS (ตัวอย่างเช่นNOW()
ใน MySQL) ไม่ควรอ้างถึงแม้ว่าข้อโต้แย้งของพวกเขาจะต้องอยู่ภายใต้กฎการอ้างอิงสตริงหรือตัวระบุเดียวกันที่กล่าวถึงแล้ว
Backtick (`)
ตาราง & คอลัมน์───────┬─────┬──┬──┬──┬────┬──┬────┬──┬────┬──┬ ───────┐
↓↓↓↓↓↓↓↓↓↓↓↓
$ query = " INSERT INTO` table` (`id`,` col1`, `col2`,` date`, `อัพเดท ')
ค่า (NULL, 'val1', 'val2', '2001-01-01', NOW ()) ";
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
คำหลักที่ไม่ได้อ้างอิง─────┴┴┴┘│││││││││││
สตริงที่เสนอราคาเดี่ยว (') ───────────┴────┴──┴────┘│││││││
Single-quote (') DATE ───────────────────────────┴──────────┘││││ │
ฟังก์ชันที่ไม่มีเครื่องหมายอัญประกาศ─────────────────────────────────────────┴┴┴┴┘
การแก้ไขตัวแปร
รูปแบบการอ้างอิงสำหรับตัวแปรจะไม่เปลี่ยนแปลงแม้ว่าคุณจะต้องการสอดแทรกตัวแปรในสตริงโดยตรงจะต้องมีการเสนอราคาซ้ำใน PHP เพียงตรวจสอบให้แน่ใจว่าคุณได้หลีกเลี่ยงตัวแปรที่จะใช้ใน SQL อย่างถูกต้อง ( แนะนำให้ใช้ API ที่สนับสนุนข้อความสั่งที่เตรียมไว้แทนเพื่อป้องกันการฉีด SQL )
// สิ่งเดียวกันกับการเปลี่ยนตัวแปรบางอย่าง
// ที่นี่ชื่อตารางตัวแปร $ table คือ backtick-quote และตัวแปร
// ในรายการ VALUES เป็นการเสนอราคาแบบเดี่ยว
$ query = "INSERT INTO '$ table` (` id`, `col1`,` col2`, `date`) ค่า (NULL, ' $ val1 ' , ' $ val2 ' , ' $ date ' )";
งบเตรียม
เมื่อทำงานกับคำสั่งที่เตรียมไว้ให้ศึกษาเอกสารเพื่อตรวจสอบว่าต้องมีการยกระดับตัวยึดคำสั่งหรือไม่ API ที่นิยมมากที่สุดใน PHP PDO และ MySQLi คาดว่าunquotedตัวยึดตำแหน่งเช่นเดียวกับ APIs งบเตรียมมากที่สุดในภาษาอื่น ๆ :
// PDO example with named parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (:id, :col1, :col2, :date)";
// MySQLi example with ? parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (?, ?, ?, ?)";
ตัวอักษรที่ต้องการ backtick quoting ในตัวระบุ:
ตามเอกสาร MySQLคุณไม่จำเป็นต้องอ้างตัวระบุ (backtick) โดยใช้ชุดอักขระต่อไปนี้:
ASCII: [0-9,a-z,A-Z$_]
(ตัวอักษรละตินพื้นฐานตัวเลข 0-9, ดอลลาร์, ขีดล่าง)
คุณสามารถใช้อักขระเกินกว่าที่กำหนดไว้เป็นตัวระบุตารางหรือคอลัมน์รวมถึงช่องว่างตัวอย่างเช่น แต่จากนั้นคุณต้องอ้างอิง (backtick)
"tablename"
'this is a some text'
การย้อนกลับไม่ถูกใช้ใน SQL มาตรฐาน (หากคุณต้องการรวมเครื่องหมายคำพูดคู่ในตัวระบุให้พิมพ์สองครั้งใน"odd""tablename"
ทำนองเดียวกันเครื่องหมายคำพูดเดี่ยวสองตัวเป็นตัวอักษร'Conan O''Brien'
)