инструкция mysqli- prepare с ошибкой «таблица не используется»

новый для записи в php, я использую функцию $ mysqli-> prepare (), чтобы получить инструкцию, готовую к выполнению, но она продолжает терпеть неудачу, и я не знаю почему. Ошибка внутри ошибки $ mysqli-> – это «таблица не используется», и я не могу найти много документации для этого … если кто-то может помочь, это было бы чрезвычайно оценено. Код ниже:

$datasqli=new mysqli(HOST, USERNAME, PASSWORD, DATABASE); // defined elsewhere if ($datasqli->connect_errno) { printf("Connect failed: %s\n", $datasqli->connect_error); exit(); } if ($usertest = $datasqli->prepare("INSERT INTO eeg (Identifier) SELECT * FROM (SELECT ? ) AS tmp WHERE NOT EXISTS ( SELECT Identifier FROM eeg WHERE Identifier = ? ) LIMIT 1")) { // this stuff never gets executed... } else { echo $datasqli->error; // "no table used" } 

Я попытался выполнить этот блок кода непосредственно внутри среды mysql, и он отлично работает.

Solutions Collecting From Web of "инструкция mysqli- prepare с ошибкой «таблица не используется»"

По всей видимости,

 SELECT * FROM (SELECT ? ) 

… не распознается как действительный синтаксис MySQL. Отсутствует имя таблицы.

EDIT , Что касается ваших комментариев:

Прежде всего, обратите внимание, что выполнение этого утверждения в консоли путем замены ? с константой не эмулирует вашу ситуацию, поэтому я считаю, что результат недействителен для сравнения.

Но опять же, выполняя его без замены ? естественно, даст ошибку.

Это потому, что выполнение только выбора не имеет отношения к вашей ситуации. В вашем php-коде это не выполнение , а не подготовка . Таким образом, правильный способ эмулировать это с помощью консоли – это инструкция PREPARE .

Таким образом,

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

будет более точно воспроизводить вашу проблему.

Теперь кажется, что PREPARE с трудом понимает параметризованные вложенные запросы, которые появляются в предложении FROM . Взгляните на эти примеры:

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

(не работает)

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

(работает)

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

(работает)

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

(работает)

Любопытное поведение, но я могу только догадываться, что, когда вложенный SELECT в предложении FROM имеет параметры, MySQL не имеет ключей для подготовки инструкции .

Что касается моего предложения, если я понимаю, что вы пытаетесь сделать, вам не нужен параметр во вложенном элементе. Вы можете переместить его снаружи и жестко указать константу во вложенном элементе, ради FROM . Следующий код

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

… должен сделать трюк.