Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

mysqli-- prepare a instrução falhando com erro nenhuma tabela usada


Aparentemente,
SELECT * FROM (SELECT ? )

...não é reconhecido como uma sintaxe válida do MySQL. Está faltando um nome de tabela.

EDITAR , Sobre seus comentários:

Em primeiro lugar, observe que executar esta instrução em um console substituindo ? com uma constante não emula sua situação, então eu consideraria o resultado inválido para comparação.

Mas, novamente, executá-lo sem substituindo ? naturalmente, daria um erro.

Isso porque executar apenas o select é irrelevante para sua situação. No seu código php, não é a execução que falha, mas sim a preparação . Portanto, a maneira correta de emular isso usando um console seria PREPARE declaração.

Então fazendo um
PREPARE myStmt 
  FROM 'SELECT * FROM (SELECT ? ) AS tmp WHERE NOT EXISTS (
    SELECT Identifier FROM eeg WHERE Identifier = ?
    ) LIMIT 1'

reproduziria seu problema com mais precisão.

Agora, parece que PREPARE tem dificuldade em entender as consultas aninhadas parametrizadas que aparecem no FROM cláusula . Dê uma olhada nestes exemplos:
PREPARE myStmt FROM "select * from (select ? from eeg) tmp"; 

(não funciona)
PREPARE myStmt FROM "select *,? from (select * from eeg) tmp"; 

(funciona)
PREPARE myStmt FROM "select *,? from (select 'asdf') tmp"; 

(funciona)
PREPARE myStmt FROM "select * from eeg where Identifier in (select ?)"; 

(funciona)

Comportamento curioso, mas só posso adivinhar que quando um SELECT aninhado no FROM cláusula tem parâmetros, o MySQL está faltando pistas para preparar a instrução .

Quanto à minha sugestão, se eu entendi o que você está tentando fazer, você não precisa de um parâmetro no select aninhado. Você pode movê-lo para fora e codificar uma constante na seleção aninhada, por causa de FROM . O seguinte código
if ($usertest = $datasqli->prepare("INSERT INTO eeg (Identifier) 
    SELECT ? from (select 1) tmp WHERE ? NOT IN
      (SELECT Identifier FROM eeg WHERE Identifier = ?)")) {

...deve fazer o truque.