Zřejmě
SELECT * FROM (SELECT ? )
...není rozpoznáno jako platná syntaxe MySQL. Chybí název tabulky.
UPRAVIT , Pokud jde o vaše komentáře:
Nejprve si prosím uvědomte, že provedení tohoto příkazu v konzole nahrazením ?
s konstantou nenapodobuje vaši situaci, takže bych výsledek považoval za neplatný pro srovnání.
Ale znovu, vykoná se to bez nahrazením ?
by přirozeně způsobilo chybu.
Je to proto, že provedení pouze výběru je pro vaši situaci irelevantní. Ve vašem php kódu to není spuštění to selže, ale spíše příprava . Správný způsob, jak to emulovat pomocí konzole, by byl PREPARE
prohlášení.
Takže děláte
PREPARE myStmt
FROM 'SELECT * FROM (SELECT ? ) AS tmp WHERE NOT EXISTS (
SELECT Identifier FROM eeg WHERE Identifier = ?
) LIMIT 1'
by přesněji reprodukoval váš problém.
Nyní se zdá, že PREPARE
má potíže s pochopením parametrizovaných vnořených dotazů které se objevují v FROM
doložka . Podívejte se na tyto příklady:
PREPARE myStmt FROM "select * from (select ? from eeg) tmp";
(nefunguje)
PREPARE myStmt FROM "select *,? from (select * from eeg) tmp";
(funguje)
PREPARE myStmt FROM "select *,? from (select 'asdf') tmp";
(funguje)
PREPARE myStmt FROM "select * from eeg where Identifier in (select ?)";
(funguje)
Zajímavé chování, ale mohu jen hádat, když je vnořen SELECT
v FROM
klauzule má parametry, MySQL postrádá vodítka pro přípravu příkazu .
Pokud jde o můj návrh, pokud rozumím tomu, co se snažíte udělat, nepotřebujete parametr ve vnořeném výběru. Mohli byste ji přesunout ven a napevno zakódovat konstantu do vnořeného výběru, kvůli FROM
. Následující kód
if ($usertest = $datasqli->prepare("INSERT INTO eeg (Identifier)
SELECT ? from (select 1) tmp WHERE ? NOT IN
(SELECT Identifier FROM eeg WHERE Identifier = ?)")) {
...by měl udělat ten trik.