PDO liên kết dữ liệu giá trị chứ không phải tên bảng và cột.
Bạn đang hiểu sai về việc sử dụng các ràng buộc. Bạn không thể liên kết tên bảng và cột với PDO. Bạn liên kết dữ liệu để chèn VÀO các cột đó. Bạn cần xây dựng SQL để bao gồm tên bảng và cột bằng cách sử dụng các phép toán chuỗi.
Định dạng dữ liệu
Tôi đã đổi tên $ column và $ value của bạn thành $ column_array, $ value_array để làm rõ chúng là gì và giả định rằng mỗi cái là một mảng đơn giản:$column_array = array('column1', 'column2', ...) etc.
$placeholders = array_map(function($col) { return ":$col"; }, $column_array);
$bindvalues = array_combine($placeholders , $value_array);
$ trình giữ chỗ bây giờ trông giống như sau:
$placeholders = array(
':column1',
':column2',
...
);
$ bindvalues bây giờ trông giống như sau:
$bindvalues = array(
':column1'=>'value1',
':column2'=>'value2',
...
);
Xây dựng, chuẩn bị, thực thi
$sql = $this->connect->prepare("INSERT INTO $table (" .implode(",", $column_array) .") VALUES (". implode(",", $placeholders) . ")";
Điều này sẽ cung cấp cho bạn một tuyên bố chuẩn bị sẵn của biểu mẫu:
$sql = INSERT INTO table_name (column1, column2, ...) VALUES (:column1, :column2, ...)
Sau đó, bạn có thể thực hiện câu lệnh đã chuẩn bị và chuyển các giá trị $ làm đối số.
$sql->execute($bindValues);
Lưu ý:
- Một lưu ý phải được đề cập. Đảm bảo rằng dữ liệu gốc của bạn đã được làm sạch bằng SQL Injection. PDO sẽ lo điều đó cho các giá trị ràng buộc, nhưng nếu bạn đang xây dựng các cột từ dữ liệu $ _POST, dữ liệu này rất dễ bị tấn công và cần được làm sạch.