Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mysqli-- Anweisung zum Vorbereiten schlägt mit Fehler fehl, es wurde keine Tabelle verwendet

Anscheinend

SELECT * FROM (SELECT ? )

...wird nicht als gültige MySQL-Syntax erkannt. Ein Tabellenname fehlt.

BEARBEITEN , Zu Ihren Kommentaren:

Beachten Sie zunächst, dass Sie diese Anweisung in einer Konsole ausführen, indem Sie ? ersetzen mit einer Konstante emuliert Ihre Situation nicht, daher würde ich das Ergebnis für einen Vergleich als ungültig erachten.

Aber andererseits, es ohne auszuführen durch Ersetzen von ? würde natürlich einen Fehler ausgeben.

Das liegt daran, dass es für Ihre Situation irrelevant ist, nur die Auswahl auszuführen. In Ihrem PHP-Code ist es nicht die Ausführung das scheitert aber eher an der Vorbereitung . Der richtige Weg, dies mit einer Konsole zu emulieren, wäre also PREPARE Aussage.

Also ein

machen
PREPARE myStmt 
  FROM 'SELECT * FROM (SELECT ? ) AS tmp WHERE NOT EXISTS (
    SELECT Identifier FROM eeg WHERE Identifier = ?
    ) LIMIT 1'

würde Ihr Problem genauer reproduzieren.

Nun, es scheint, dass PREPARE hat Schwierigkeiten, parametrisierte verschachtelte Abfragen zu verstehen, die in FROM erscheinen Klausel . Sehen Sie sich diese Beispiele an:

PREPARE myStmt FROM "select * from (select ? from eeg) tmp"; 

(funktioniert nicht)

PREPARE myStmt FROM "select *,? from (select * from eeg) tmp"; 

(funktioniert)

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

(funktioniert)

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

(funktioniert)

Seltsames Verhalten, aber das kann ich nur vermuten bei einem verschachtelten SELECT im FROM -Klausel hat Parameter, MySQL fehlen Hinweise, um die Anweisung vorzubereiten .

Was meinen Vorschlag betrifft, so benötigen Sie, wenn ich verstehe, was Sie zu tun versuchen, keinen Parameter in der verschachtelten Auswahl. Sie könnten es nach draußen verschieben und eine Konstante in der verschachtelten Auswahl hartcodieren, um FROM willen . Der folgende Code

if ($usertest = $datasqli->prepare("INSERT INTO eeg (Identifier) 
    SELECT ? from (select 1) tmp WHERE ? NOT IN
      (SELECT Identifier FROM eeg WHERE Identifier = ?)")) {

...sollte reichen.