Najwyraźniej
SELECT * FROM (SELECT ? )
...nie jest rozpoznawany jako poprawna składnia MySQL. Brak nazwy tabeli.
EDYTUJ , Jeśli chodzi o Twoje komentarze:
Przede wszystkim zwróć uwagę, że wykonanie tej instrukcji w konsoli przez zastąpienie ?
ze stałą nie naśladuje twojej sytuacji, więc uznałbym wynik za nieważny do porównania.
Ale z drugiej strony, wykonanie go bez zastępując ?
naturalnie dałoby błąd.
Dzieje się tak, ponieważ wykonanie samego zaznaczenia nie ma znaczenia w Twojej sytuacji. W twoim kodzie php to nie jest wykonanie to się nie udaje, ale raczej przygotowanie . Więc właściwym sposobem emulowania tego za pomocą konsoli byłby PREPARE
oświadczenie.
Więc robię
PREPARE myStmt
FROM 'SELECT * FROM (SELECT ? ) AS tmp WHERE NOT EXISTS (
SELECT Identifier FROM eeg WHERE Identifier = ?
) LIMIT 1'
odtworzy Twój problem dokładniej.
Wygląda na to, że PREPARE
ma trudności ze zrozumieniem sparametryzowanych zapytań zagnieżdżonych które pojawiają się w FROM
klauzula . Spójrz na te przykłady:
PREPARE myStmt FROM "select * from (select ? from eeg) tmp";
(nie działa)
PREPARE myStmt FROM "select *,? from (select * from eeg) tmp";
(działa)
PREPARE myStmt FROM "select *,? from (select 'asdf') tmp";
(działa)
PREPARE myStmt FROM "select * from eeg where Identifier in (select ?)";
(działa)
Ciekawe zachowanie, ale mogę się tylko domyślać gdy zagnieżdżony SELECT
w FROM
klauzula ma parametry, w MySQL brakuje wskazówek do przygotowania instrukcji .
Co do mojej sugestii, jeśli rozumiem, co próbujesz zrobić, nie potrzebujesz parametru w zagnieżdżonym zaznaczeniu. Możesz przenieść go na zewnątrz i zakodować stałą w zagnieżdżonym zaznaczeniu, ze względu na FROM
. Poniższy kod
if ($usertest = $datasqli->prepare("INSERT INTO eeg (Identifier)
SELECT ? from (select 1) tmp WHERE ? NOT IN
(SELECT Identifier FROM eeg WHERE Identifier = ?)")) {
...powinien załatwić sprawę.