Mysql
 sql >> Base de données >  >> RDS >> Mysql

mysqli - échec de l'instruction de préparation avec erreur aucune table utilisée

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.