новый для записи в 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, и он отлично работает.
По всей видимости,
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 = ?)")) {
… должен сделать трюк.