Dấu nền sẽ được sử dụng cho số nhận dạng bảng và cột, nhưng chỉ cần thiết khi số nhận dạng là Từ khóa dành riêng cho MySQL hoặc khi số nhận dạng chứa các ký tự khoảng trắng hoặc các ký tự vượt quá một tập hợp giới hạn (xem bên dưới) Bạn thường nên tránh sử dụng các từ khóa dành riêng làm số nhận dạng cột hoặc bảng khi có thể, tránh vấn đề trích dẫn.
Dấu ngoặc kép nên được sử dụng cho các giá trị chuỗi như trong VALUES()
danh sách. Dấu ngoặc kép cũng được MySQL hỗ trợ cho các giá trị chuỗi, nhưng dấu ngoặc kép được các RDBMS khác chấp nhận rộng rãi hơn, vì vậy, bạn nên sử dụng dấu ngoặc kép thay vì dấu ngoặc kép.
MySQL cũng mong đợi DATE
và DATETIME
các giá trị chữ được trích dẫn đơn dưới dạng chuỗi như '2001-01-01 00:00:00'
. Tham khảo các chữ viết về ngày và giờ tài liệu để biết thêm chi tiết, cụ thể là các lựa chọn thay thế cho việc sử dụng dấu gạch ngang -
làm dấu phân cách phân đoạn trong chuỗi ngày.
Vì vậy, bằng cách sử dụng ví dụ của bạn, tôi sẽ trích dẫn kép chuỗi PHP và sử dụng dấu ngoặc kép trên các giá trị 'val1', 'val2'
. NULL
là một từ khóa MySQL và một giá trị đặc biệt (không phải), và do đó không được trích dẫn.
Không có mã định danh bảng hoặc cột nào trong số này là các từ dành riêng hoặc sử dụng các ký tự yêu cầu trích dẫn, nhưng dù sao thì tôi cũng đã trích dẫn chúng bằng dấu gạch ngược (sẽ tìm hiểu thêm về điều này sau ...).
Các hàm có nguồn gốc từ RDBMS (ví dụ:NOW()
trong MySQL) không nên được trích dẫn, mặc dù các đối số của chúng tuân theo cùng một chuỗi hoặc quy tắc trích dẫn mã định danh đã được đề cập.
Backtick (`) table & column ───────┬─────┬──┬──┬──┬────┬──┬────┬──┬────┬──┬───────┐ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ $query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`, `updated`) VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW())"; ↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑ Unquoted keyword ─────┴┴┴┘ │ │ │ │ │ │ │││││ Single-quoted (') strings ───────────┴────┴──┴────┘ │ │ │││││ Single-quoted (') DATE ───────────────────────────┴──────────┘ │││││ Unquoted function ─────────────────────────────────────────┴┴┴┴┘
Nội suy biến
Các mẫu trích dẫn cho các biến không thay đổi, mặc dù nếu bạn định nội suy các biến trực tiếp trong một chuỗi, thì nó phải được trích dẫn kép trong PHP. Chỉ cần đảm bảo rằng bạn đã thoát đúng các biến để sử dụng trong SQL. ( Bạn nên sử dụng API hỗ trợ các câu lệnh đã chuẩn bị thay vào đó, dưới dạng bảo vệ chống lại việc đưa vào SQL ).
// Same thing with some variable replacements // Here, a variable table name $table is backtick-quoted, and variables // in the VALUES list are single-quoted $query = "INSERT INTO `$table` (`id`, `col1`, `col2`, `date`) VALUES (NULL, '$val1', '$val2', '$date')";
Báo cáo soạn sẵn
Khi làm việc với các câu lệnh đã chuẩn bị, hãy tham khảo tài liệu để xác định xem có phải trích dẫn phần giữ chỗ của câu lệnh hay không. Các API phổ biến nhất hiện có trong PHP, PDO và MySQLi, mong đợi không được trích dẫn trình giữ chỗ, cũng như hầu hết các API câu lệnh được chuẩn bị sẵn bằng các ngôn ngữ khác:
// 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 (?, ?, ?, ?)";
Các ký tự yêu cầu trích dẫn biểu tượng nền trong số nhận dạng:
Theo tài liệu MySQL , bạn không cần phải trích dẫn các mã định danh (dấu nền) bằng cách sử dụng bộ ký tự sau:
ASCII:
[0-9,a-z,A-Z$_]
(chữ cái Latinh cơ bản, chữ số 0-9, đô la, dấu gạch dưới)
Bạn có thể sử dụng các ký tự ngoài tập hợp đó làm số nhận dạng bảng hoặc cột, bao gồm cả khoảng trắng chẳng hạn, nhưng sau đó bạn phải trích dẫn (dấu nền) chúng.
Ngoài ra, mặc dù các số là các ký tự hợp lệ cho các số nhận dạng, các số nhận dạng không thể chỉ bao gồm các số. Nếu chúng làm vậy, chúng phải được bọc trong các miếng dán ngược.