Apparemment,
SELECT * FROM (SELECT ? )
... n'est pas reconnu comme une syntaxe MySQL valide. Un nom de table est manquant.
MODIFIER , Concernant vos commentaires :
Tout d'abord, veuillez noter que l'exécution de cette instruction dans une console en remplaçant ?
avec une constante n'émule pas votre situation, donc je considérerais le résultat invalide pour la comparaison.
Mais encore une fois, l'exécuter sans remplacer ?
donnerait naturellement une erreur.
C'est parce que l'exécution de la sélection n'est pas pertinente pour votre situation. Dans votre code php, ce n'est pas l'exécution qui échoue mais plutôt la préparation . Donc, la bonne façon d'émuler cela à l'aide d'une console serait le PREPARE
déclaration.
Donc faire un
PREPARE myStmt
FROM 'SELECT * FROM (SELECT ? ) AS tmp WHERE NOT EXISTS (
SELECT Identifier FROM eeg WHERE Identifier = ?
) LIMIT 1'
reproduirait votre problème plus précisément.
Maintenant, il semble que PREPARE
a du mal à comprendre les requêtes imbriquées paramétrées qui apparaissent dans le FROM
clause . Jetez un œil à ces exemples :
PREPARE myStmt FROM "select * from (select ? from eeg) tmp";
(ne fonctionne pas)
PREPARE myStmt FROM "select *,? from (select * from eeg) tmp";
(fonctionne)
PREPARE myStmt FROM "select *,? from (select 'asdf') tmp";
(fonctionne)
PREPARE myStmt FROM "select * from eeg where Identifier in (select ?)";
(fonctionne)
Comportement curieux, mais je ne peux que deviner que quand un SELECT
imbriqué dans le FROM
la clause a des paramètres, il manque à MySQL des indices pour préparer la déclaration .
Quant à ma suggestion, si je comprends ce que vous essayez de faire, vous n'avez pas besoin d'un paramètre dans la sélection imbriquée. Vous pouvez le déplacer à l'extérieur et coder en dur une constante dans la sélection imbriquée, pour le bien de FROM
. Le code suivant
if ($usertest = $datasqli->prepare("INSERT INTO eeg (Identifier)
SELECT ? from (select 1) tmp WHERE ? NOT IN
(SELECT Identifier FROM eeg WHERE Identifier = ?)")) {
... devrait faire l'affaire.