显然,
SELECT * FROM (SELECT ? )
…未被识别为有效的MysqL语法。表名丢失。
,关于您的评论:
首先,请注意,在控制台中通过?
用常量替换来执行此语句并不能模拟您的情况,因此我认为结果对于比较无效。
但是话又说回来, 不 替换?
而执行它自然会产生错误。
这是因为仅执行选择与您的情况无关。在您的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会缺少准备语句的线索。
至于我的建议,如果我了解您要执行的操作,则在嵌套选择中不需要参数。您可以将其移到外部,并在嵌套的select中硬编码一个常量FROM
。以下代码
if ($usertest = $datasqli->prepare("INSERT INTO eeg (Identifier)
SELECT ? from (select 1) tmp WHERE ? NOT IN
(SELECT Identifier FROM eeg WHERE Identifier = ?)")) {
…应该可以解决问题。