Xin chào các bạn như là tiểu bang tiêu đề tôi đang tìm cách tạo các truy vấn động tới máy chủ MySQL của tôi. Tại thời điểm này đây là đoạn code tôi sử dụng để cập nhật dữ liệu trên máy chủ:Truy vấn MySQL động với PHP
$deskAttr = json_decode($_POST["desk_attributes"]);
foreach($deskAttr as $key => $value) {
$sql = "UPDATE desk_attributes SET iw_standard=".$value->iw_standard.", avaya_standard=".$value->avaya_standard.", avaya_withcallid=".$value->avaya_withcallid.", avaya_withtransfer=".$value->avaya_withtransfer.", dual_screen=".$value->dual_screen.", air_conditioning=".$value->air_conditioning.", iw_obdialler=".$value->iw_obdialler." WHERE id=".$value->id;
$conn->query($sql);
}
Như bạn có thể thấy, các tên cột SQL cũng giống như các phím deskAttr
. Tôi đang tìm một cách để làm cho dòng này một vòng lặp để tôi không cần phải thay đổi dòng này nếu tôi đã thêm nhiều cột hơn vào bảng MySQL.
Nó sẽ giống như thế này:
$deskAttr = json_decode($_POST["desk_attributes"]);
foreach($deskAttr as $key => $value) {
$sql = "UPDATE desk_attributes SET";
foreach($value as $k => $v) {
$sql .= " $k = $value->$k ,";
}
$sql .= "WHERE id=".$value->id";
}
Làm thế nào tôi có thể viết mã trên nên nó sẽ thực sự làm việc? Cảm ơn.
EDIT
Có lẽ nó sẽ rất hữu ích để biết rằng $deskAttr
là một mảng của các đối tượng và tên của các cột cũng giống như tên của các phím đối tượng.
Đây là những gì tôi có nghĩa là trong mã giả:
foreach($object in $deskAttr) {
$sql = "UPDATE table SET ";
foreach($key in $object) {
if($key != "id")
$sql .= "$key = $object->$key, ";
}
$sql .= "WHERE id = $object->id;
$conn->query($sql);
}
Rõ ràng điều này sẽ thêm một dấu phẩy ở phần cuối của truy vấn trước khi WHERE phần nhưng hy vọng bạn sẽ có được những gì tôi đang cố gắng để đạt được.
Bạn đang rộng mở cho [SQL Tiêm] (http://php.net/manual/en/security.database.sql-injection.php) và nên thực sự sử dụng [Statement Statements] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) thay vì ghép nối các truy vấn của bạn. Đặc biệt vì bạn không thoát khỏi đầu vào của người dùng! –
Bạn thực sự nên chuyển sang các câu lệnh đã chuẩn bị cho các giá trị và danh sách trắng cho các tên cột để tránh tiêm sql. – jeroen
Bạn không thể liên kết tên cột thông qua câu lệnh đã chuẩn bị. Vì vậy, nếu bạn sẽ đặt một chuỗi biến trong chuỗi truy vấn SQL của bạn, juste thoát chúng một cách chính xác và bạn tốt. –