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.