Bạn không thực sự phải kiểm tra đầu vào là số, bởi vì trong MySQL, bất kỳ chuỗi nào, ví dụ:'123abc'
trong ngữ cảnh số (như được so sánh với cột số nguyên id
) ngầm định chỉ lấy các chữ số và bỏ qua phần còn lại. Chuỗi không phải số như 'abc'
chỉ đơn giản là có giá trị nguyên 0 vì không có chữ số đứng đầu.
Vấn đề là, các giá trị an toàn khỏi SQL injection nếu bạn sử dụng các tham số truy vấn. Cho dù đầu vào đến từ $ _SESSION hay một nguồn khác đều không liên quan. $ _SESSION không an toàn hoặc không an toàn đối với SQL injection, đó là cách bạn truyền dữ liệu vào truy vấn của mình mới là vấn đề quan trọng.
Tôi cũng sẽ đơn giản hóa mã để định dạng danh sách các trình giữ chỗ tham số:
$placeholders = implode(',', array_fill(1, count((array)$_SESSION['story']), '?'));
Và quên bindParam (), chỉ cần truyền mảng vào execute()
.
//Collect all data needed
$storyQuery = openConnection() -> prepare("SELECT * FROM `stories`
WHERE `id` IN ({$placeholders})");
$storyQuery -> execute((array)$_SESSION['story']);
$story = $storyQuery -> fetchAll();
Nhận xét lại của bạn:
Trong PDO, bạn có thể sử dụng các tham số được đặt tên như :id
hoặc bạn có thể sử dụng các tham số vị trí, luôn là ?
(nhưng không kết hợp hai loại này trong một truy vấn nhất định, hãy sử dụng loại này hoặc loại khác).
Truyền một mảng tới execute()
tự động liên kết các phần tử mảng với các tham số. Một mảng đơn giản (tức là được lập chỉ mục bởi các số nguyên) dễ liên kết với các tham số vị trí.
Nếu bạn sử dụng các tham số được đặt tên, bạn phải chuyển một mảng kết hợp trong đó các khóa của mảng khớp với tên tham số. Các khóa mảng có thể được tùy chọn bắt đầu bằng :
nhưng nó không bắt buộc.
Nếu bạn mới sử dụng PDO, việc đọc tài liệu . Có các ví dụ về mã và mọi thứ!