Rõ ràng,
SELECT * FROM (SELECT ? )
... không được công nhận là một cú pháp MySQL hợp lệ. Tên bảng bị thiếu.
CHỈNH SỬA , Liên quan đến nhận xét của bạn:
Trước hết, xin lưu ý rằng thực hiện câu lệnh này trong bảng điều khiển bằng cách thay thế ?
với một hằng số không mô phỏng tình huống của bạn, vì vậy tôi sẽ coi kết quả là không hợp lệ để so sánh.
Nhưng sau đó một lần nữa, thực hiện nó mà không thay thế ?
tự nhiên sẽ đưa ra một lỗi.
Đó là bởi vì chỉ thực hiện lựa chọn không liên quan đến tình huống của bạn. Trong mã php của bạn, nó không phải là thực thi thất bại nhưng đúng hơn là sự chuẩn bị . Vì vậy, cách thích hợp để mô phỏng điều này bằng bảng điều khiển, sẽ là PREPARE
tuyên bố.
Vì vậy, làm một
PREPARE myStmt
FROM 'SELECT * FROM (SELECT ? ) AS tmp WHERE NOT EXISTS (
SELECT Identifier FROM eeg WHERE Identifier = ?
) LIMIT 1'
sẽ tái tạo vấn đề của bạn chính xác hơn.
Bây giờ, có vẻ như PREPARE
gặp khó khăn khi hiểu các truy vấn lồng nhau được tham số hóa xuất hiện trong FROM
mệnh đề . Hãy xem các ví dụ sau:
PREPARE myStmt FROM "select * from (select ? from eeg) tmp";
(không hoạt động)
PREPARE myStmt FROM "select *,? from (select * from eeg) tmp";
(hoạt động)
PREPARE myStmt FROM "select *,? from (select 'asdf') tmp";
(hoạt động)
PREPARE myStmt FROM "select * from eeg where Identifier in (select ?)";
(hoạt động)
Hành vi tò mò, nhưng tôi chỉ có thể đoán rằng khi một SELECT
lồng nhau trong FROM
mệnh đề có các tham số, MySQL thiếu manh mối để chuẩn bị câu lệnh .
Đối với đề xuất của tôi, nếu tôi hiểu bạn đang cố gắng làm gì, bạn không cần tham số trong vùng chọn lồng nhau. Bạn có thể di chuyển nó ra bên ngoài và mã hóa một hằng số trong vùng chọn lồng nhau, vì lợi ích của FROM
. Đoạn mã sau
if ($usertest = $datasqli->prepare("INSERT INTO eeg (Identifier)
SELECT ? from (select 1) tmp WHERE ? NOT IN
(SELECT Identifier FROM eeg WHERE Identifier = ?)")) {
... nên thực hiện thủ thuật.