Очевидно
SELECT * FROM (SELECT ? )
... не се разпознава като валиден MySQL синтаксис. Липсва име на таблица.
РЕДАКТИРАНЕ , Относно вашите коментари:
Преди всичко, моля, имайте предвид, че изпълнението на този израз в конзола чрез заместване на ?
с константа не емулира вашата ситуация, така че бих счел резултата за невалиден за сравнение.
Но отново, изпълнявайки го без замествайки ?
естествено ще даде грешка.
Това е така, защото изпълнението само на избора е без значение за вашата ситуация. Във вашия php код това не е изпълнението това се проваля, а по-скоро подготовката . Така че правилният начин за емулиране на това с помощта на конзола би бил PREPARE
изявление.
Така че правим
PREPARE myStmt
FROM 'SELECT * FROM (SELECT ? ) AS tmp WHERE NOT EXISTS (
SELECT Identifier FROM eeg WHERE Identifier = ?
) LIMIT 1'
ще възпроизведе проблема ви по-точно.
Сега изглежда, че PREPARE
има затруднения при разбирането на параметризирани вложени заявки които се появяват в FROM
клауза . Разгледайте тези примери:
PREPARE myStmt FROM "select * from (select ? from eeg) tmp";
(не работи)
PREPARE myStmt FROM "select *,? from (select * from eeg) tmp";
(работи)
PREPARE myStmt FROM "select *,? from (select 'asdf') tmp";
(работи)
PREPARE myStmt FROM "select * from eeg where Identifier in (select ?)";
(работи)
Любопитно поведение, но мога само да предполагам, че когато вложен SELECT
в FROM
клауза има параметри, в MySQL липсват улики, за да се подготви изявление .
Що се отнася до моето предложение, ако разбирам какво се опитвате да направите, нямате нужда от параметър във вложения избор. Можете да го преместите навън и да кодирате константа във вложения избор в името на FROM
. Следният код
if ($usertest = $datasqli->prepare("INSERT INTO eeg (Identifier)
SELECT ? from (select 1) tmp WHERE ? NOT IN
(SELECT Identifier FROM eeg WHERE Identifier = ?)")) {
...трябва да свърши работа.