Mysql
 sql >> Database >  >> RDS >> Mysql

mysqli--prepara l'istruzione non riuscita con errore nessuna tabella utilizzata

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.