A quanto pare,
SELECT * FROM (SELECT ? )
...non è riconosciuta come una sintassi MySQL valida. Manca un nome di tabella.
MODIFICA , Per quanto riguarda i tuoi commenti:
Prima di tutto, tieni presente che eseguire questa istruzione in una console sostituendo ?
con una costante non emula la tua situazione, quindi considererei il risultato non valido per il confronto.
Ma poi di nuovo, eseguendolo senza sostituendo ?
darebbe, naturalmente, un errore.
Questo perché eseguire solo la selezione è irrilevante per la tua situazione. Nel tuo codice php, non è l'esecuzione fallisce, ma piuttosto la preparazione . Quindi il modo corretto per emularlo utilizzando una console sarebbe il PREPARE
dichiarazione.
Quindi facendo un
PREPARE myStmt
FROM 'SELECT * FROM (SELECT ? ) AS tmp WHERE NOT EXISTS (
SELECT Identifier FROM eeg WHERE Identifier = ?
) LIMIT 1'
riprodurrebbe il tuo problema in modo più accurato.
Ora, sembra che PREPARE
ha difficoltà a comprendere le query nidificate parametrizzate che appaiono nel FROM
clausola . Dai un'occhiata a questi esempi:
PREPARE myStmt FROM "select * from (select ? from eeg) tmp";
(non funziona)
PREPARE myStmt FROM "select *,? from (select * from eeg) tmp";
(lavori)
PREPARE myStmt FROM "select *,? from (select 'asdf') tmp";
(lavori)
PREPARE myStmt FROM "select * from eeg where Identifier in (select ?)";
(lavori)
Comportamento curioso, ma posso solo immaginarlo quando un SELECT
annidato nel FROM
La clausola ha parametri, MySQL non ha indizi per preparare la dichiarazione .
Per quanto riguarda il mio suggerimento, se ho capito cosa stai cercando di fare, non hai bisogno di un parametro nella selezione annidata. Potresti spostarlo all'esterno e codificare una costante nella selezione nidificata, per il bene di FROM
. Il seguente codice
if ($usertest = $datasqli->prepare("INSERT INTO eeg (Identifier)
SELECT ? from (select 1) tmp WHERE ? NOT IN
(SELECT Identifier FROM eeg WHERE Identifier = ?)")) {
...dovrebbe fare il trucco.