Danh sách trắng
Mã của bạn ở dạng hiện tại rất nguy hiểm, bạn không chỉ cho phép người dùng quyết định những trường nào nên được chọn mà bạn còn cho phép anh ta quyết định những bảng nào cần truy vấn. Bạn chắc chắn nên thực hiện kiểm tra danh sách trắng về những điều này. ví dụ:
if($_POST['tableSelected'] == 'acceptable_table1' || $_POST['tableSelected'] == 'acceptable_table2) {
$table = $_POST['tableSelected']
}
Tương tự, bạn nên xác nhận danh sách trường. Nhưng xác thực danh sách trường sẽ khá phức tạp vì các trường của bạn sẽ phụ thuộc vào bảng. Tôi khuyên bạn nên tạo các mảng và kiểm tra xem vùng chọn có nằm trong đó không.
$table1_fields = array('col1','col2',...)
$table2_fields = array('col1','col2',...)
Tuyên bố chuẩn bị
Như bạn đã biết, các câu lệnh đã chuẩn bị chỉ có thể được sử dụng để ràng buộc các tham số. Chúng không thể được sử dụng để điền vào tên bảng và tên cột. Đó là lý do tại sao bạn cần cả bản kê khai chuẩn bị và danh sách trắng. Tôi khuyên bạn nên sử dụng PDO . Nó có thể trông giống như
$stmt = $dbh->prepare("SELECT {$fieldlist} FROM {$table} where field = ?");
$stmt->execute(array('somevalue'));