sql >> Base de Datos >  >> RDS >> Mysql

mysqli:la declaración de preparación falla con el error, no se usó ninguna tabla

Aparentemente,

SELECT * FROM (SELECT ? )

... no se reconoce como una sintaxis MySQL válida. Falta un nombre de tabla.

EDITAR , Con respecto a sus comentarios:

En primer lugar, tenga en cuenta que ejecutar esta declaración en una consola sustituyendo ? con una constante no emula su situación, por lo que consideraría que el resultado no es válido para la comparación.

Pero, de nuevo, ejecutarlo sin sustituyendo ? daría, naturalmente, un error.

Eso es porque ejecutar solo la selección es irrelevante para su situación. En su código php, no es la ejecución eso falla sino la preparación . Entonces, la forma correcta de emular esto usando una consola sería PREPARE declaración.

Así que haciendo un

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

reproduciría su problema con mayor precisión.

Ahora, parece que PREPARE tiene dificultad para entender las consultas anidadas parametrizadas que aparecen en el FROM cláusula . Echa un vistazo a estos ejemplos:

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

(no funciona)

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

(obras)

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

(obras)

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

(obras)

Comportamiento curioso, pero solo puedo suponer que cuando un SELECT anidado en el FROM la cláusula tiene parámetros, a MySQL le faltan pistas para preparar la declaración .

En cuanto a mi sugerencia, si entiendo lo que está tratando de hacer, no necesita un parámetro en la selección anidada. Puede moverlo afuera y codificar una constante en la selección anidada, por el bien de FROM . El siguiente código

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

... debería hacer el truco.