sql >> Database >  >> RDS >> Mysql

mysqli -- voorbereidingsverklaring mislukt met fout geen tabel gebruikt

Blijkbaar,

SELECT * FROM (SELECT ? )

... wordt niet herkend als een geldige MySQL-syntaxis. Er ontbreekt een tabelnaam.

BEWERKEN , Met betrekking tot uw opmerkingen:

Houd er allereerst rekening mee dat het uitvoeren van deze instructie in een console door ? . te vervangen met een constante emuleert uw situatie niet, dus ik zou het resultaat als ongeldig beschouwen ter vergelijking.

Maar nogmaals, het uitvoeren zonder vervangen door ? zou natuurlijk een foutmelding geven.

Dat komt omdat het uitvoeren van alleen de select niet relevant is voor uw situatie. In je php-code is het niet de uitvoering dat mislukt maar eerder de voorbereiding . Dus de juiste manier om dit te emuleren met een console, is de PREPARE verklaring.

Dus een

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

zou uw probleem nauwkeuriger weergeven.

Nu lijkt het erop dat PREPARE heeft moeite met het begrijpen van geparametriseerde geneste zoekopdrachten die verschijnen in de FROM clausule . Bekijk deze voorbeelden:

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

(werkt niet)

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

(werkt)

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

(werkt)

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

(werkt)

Vreemd gedrag, maar ik kan alleen raden dat wanneer een geneste SELECT in de FROM clausule heeft parameters, MySQL mist aanwijzingen om de verklaring voor te bereiden .

Wat betreft mijn suggestie, als ik begrijp wat je probeert te doen, heb je geen parameter nodig in de geneste select. Je zou het naar buiten kunnen verplaatsen en een constante hardcoderen in de geneste select, omwille van FROM . De volgende code

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

...zou moeten lukken.




  1. Een één-op-veel polymorfe relatie met doctrine creëren

  2. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:communicatieverbinding mislukt

  3. Hoe een mysql-database naar een andere computer te exporteren?

  4. mysql respecteert de wait_timeout-instelling in my.cnf . niet