0

使用 php 编写的新手,我正在使用 $mysqli->prepare() 函数来准备执行语句,但它一直失败,我不知道为什么。$mysqli->error 中的错误是“没有使用表”,我似乎也找不到太多的文档......如果有人能帮忙,那将不胜感激。下面的代码:

$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 环境中执行该代码块,它工作正常。

4

1 回答 1

2

显然,

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 ?)"; 

(作品)

奇怪的行为,但我只能猜测,当嵌套SELECTFROM子句中有参数时,MySQL 缺少线索以准备语句

至于我的建议,如果我了解您要执行的操作,则嵌套选择中不需要参数。为了FROM. 以下代码

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

......应该做的伎俩。

于 2013-10-08T21:15:23.043 回答