Truy vấn chuẩn bị động
Bạn có thể tạo truy vấn động từ mảng $ _POST:
Tuy nhiên, KHÔNG BAO GIỜ tin tưởng đầu vào của người dùng, có nghĩa là bạn không thể tin tưởng rằng dữ liệu trong $ _POST sẽ chứa các tên cột hợp lệ.
1. Vệ sinh dữ liệu bài đăng
Bạn có thể xác định một mảng tên cột trong danh sách trắng $whitelist = array('field1', 'field2', ...)
, và sau đó sử dụng:
$data = array_intersect_key($_POST, array_flip($whitelist));
để tìm điểm giao nhau giữa các cột trong danh sách trắng và mảng $ _POST của bạn. (Cảm ơn @BillKarwin)
2. Tạo truy vấn
private function buildInsertSql($data, $table) {
$columns = "";
$holders = "";
foreach ($data as $column => $value) {
$columns .= ($columns == "") ? "" : ", ";
$columns .= $column;
$holders .= ($holders == "") ? "" : ", ";
$holders .= ":$column";
}
$sql = "INSERT INTO $table ($columns) VALUES ($holders)";
return $sql;
}
Điều này sẽ cung cấp cho bạn một câu lệnh SQL có dạng:
$sql = INSERT INTO directory (field1, field2) VALUES (:field1, :field2)
và chuẩn bị tuyên bố:
$stmt = $dbh->prepare($sql);
3. Tham số ràng buộc
Sau đó, bạn có thể liên kết động các tham số với trình giữ chỗ:
foreach ($data as $placeholder => $value) {
$stmt->bindValue(":$placeholder", $value);
}
và thực thi nó:
$stmt->execute();
Nâng cao hơn một chút ...
- Hãy xem liên kết này Liên kết với cùng một trình giữ chỗ Để biết thông tin về cách làm cho tuyên bố chuẩn bị động của bạn trở nên mạnh mẽ hơn.
- Hãy xem liên kết này: Bind Params Inside Loop Cảnh báo trước về việc ràng buộc các tham số so với các giá trị trong một vòng lặp.