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.