Tôi đang gặp phải một vấn đề nhỏ. Tôi đang làm việc trên một ứng dụng tại thời điểm đó đòi hỏi việc sử dụng các tên bảng động trong MySQL. Về cơ bản, tôi có một quá trình lựa chọn album từ cơ sở dữ liệu dựa trên một số yếu tố (Thể loại, Độ dài phát, Ngày phát hành, v.v.) - Có một phần của quá trình này cho phép người dùng tạo một nhóm bộ lọc tùy chỉnh ..Bảo vệ an toàn các tên bảng động trong MySQL bằng Codeigniter
Bộ lọc tùy chỉnh trả về số cho người dùng của tất cả các album trong tiêu chí lựa chọn đó. Sau đó, ID của những album đó được lưu trữ trong một bảng có số băm/sê-ri được tạo ngẫu nhiên (ví dụ: albumSelect_20880f9c05d68a)
Tôi đã làm theo cách này bởi vì tôi không muốn lưu trữ danh sách được phân cách bằng dấu phẩy lớn trong một trường ngớ ngẩn) - Và tôi không ưa thích gửi một mảng giá trị đến một trường ẩn trong HTML của tôi vì điều này sẽ chỉ làm tăng thông lượng dữ liệu (Có thể là hàng ngàn hàng cùng một lúc)
Trong CodeIgniter, tôi đang sử dụng Truy vấn Bindings để tạo truy vấn SQL của tôi, như vậy:
select * from artists where artistName = ? AND albumTitle = ?
Truy vấn sau đó tự động được thoát khi tôi tham số hóa truy vấn
$query = $this->db->query($sql,array("Singer","Album"));
Bây giờ đến phần khó khăn
Nếu tôi viết truy vấn của tôi để tìm một cái gì đó như thế này:
$sql = "select albumid from albums where albumid in (select albumid from albumSelect_?)";
$this->db->query($sql,array('20880f9c05d68a'));
Các kết quả truy vấn trở thành:
select `albumid` from `albums` where `albumid` in (select `albumid` from `albumSelect_'20880f9c05d68a'`)
Và khá đúng như vậy, nhưng rõ ràng truy vấn không hợp lệ ..
Edit: More Info
Truy vấn có thể là một phần của một truy vấn lớn hơn, tùy thuộc vào những gì tiêu chí người sử dụng chọn. ví dụ.
$sql = "select albumid from albums where albumid in(select albumid from tags where tag = ?) AND albumid in(select albumid from albumSelect_?)";
Tôi chỉ tự hỏi nếu có một cách để làm việc này, HOẶC nếu có ai có thể đề xuất một giải pháp tốt hơn .. Concatenation của tên bảng rõ ràng không là một lựa chọn.
Cảm ơn trước!
Dave
Nếu bạn đã chuẩn hóa dữ liệu của mình, bạn sẽ không cần phải thực hiện việc này * hoặc * lưu trữ danh sách album được phân tách bằng dấu phẩy. Đây được gọi là mối quan hệ "có nhiều người". – Xeoncross