使用php解析时,sql中的where not exists出现语法错误

z9smfwbn  于 2021-06-24  发布在  Mysql
关注(0)|答案(2)|浏览(444)

一开始我试着用 IF NOT EXISTS ,但我总是出现语法错误,不知道为什么。但是输入我的标题给了我一些关于同一问题的问题。有趣的是谷歌没能找到他们。。。不管怎样,我把问题改成了迈克在这个问题上的建议。
现在我有以下代码片段:

$tblTeam = "INSERT INTO tblTeam (nameTeam, nationID) 
    SELECT * FROM (SELECT '" . $match_Team[1] . "', (SELECT nationID FROM tblNation WHERE nameNation = '" . $nation_name[1] . "')) AS tmp
    WHERE NOT EXISTS (
        SELECT nameTeam FROM tblTeam WHERE nameTeam = '" . $match_Team[1] . "'
    ) LIMIT 1; 

    INSERT INTO tblTeam (nameTeam, nationID) 
    SELECT * FROM (SELECT '" . $match_Team[2] . "', (SELECT nationID FROM tblNation WHERE nameNation = '" . $nation_name[2] . "')) AS tmp
    WHERE NOT EXISTS (
        SELECT nameTeam FROM tblTeam WHERE nameTeam = '" . $match_Team[2] . "'
    ) LIMIT 1;";

如果我直接在phpmyadmin中用纯sql语法运行查询,一切都很好,我就可以得到我的条目 tblTeam . 但是,当我尝试用php实现这一点时,我得到了以下语法错误:

Error description tblTeam:

sql语法有错误;检查与您的mariadb服务器版本相对应的手册,以获得正确的语法,使用“insert into tblteam(nameteam,nationid)selectfrom(在第7行选择“b”)
我现在有点困惑,因为我不明白问题出在哪里。在我的调试示例中 $match_Team[1] 有价值吗 Serbia , $match_Team[2] 价值 Brazil . 同样的道理 $nation_name[1] 以及 $nation_name[2] 分别。
编辑:因为@fdavidov要求,这里是$tblteam的内容:
插入tblteam(nameteam,nationid)选择
from(select'serbia',(select nationid from tblnation where namenation='serbia'))作为tmp,如果不存在(select nameteam from tblteam where nameteam='serbia')限制1;插入tblteam(nameteam,nationid)选择*from(select'brazil',(select nationid from tblnation where namenation='brazil'))作为tmp,如果不存在(select nameteam from tblteam where nameteam='brazil')limit 1;

5anewei6

5anewei61#

所以,在因为这个问题而惊慌失措了两天之后,我终于找到了解决办法——实际上有很多问题,而不仅仅是一个。
首先, $nation_name 有错误的字符串,而不是实际的国家。尽管如此,仍然会有语法错误。
后来我发现 mysqli_query() 不允许同时进行两个查询 $tblTeam . 这就解释了为什么sql代码在phpmyadmin中工作,而不是在php中工作。然而,存在着 mysqli_multi_query() 对于这种情况。不过,我在解析方面还是有问题的。我在网上找到了不少例子,但都不管用。我猜我的语法错误总是掩盖了这里的实际错误。
最后的解决方案是将它分成两个独立的查询。它需要更多的代码行,但这是最简单的方法,效果很好。现在代码片段如下所示:

$tblTeam1 = "INSERT INTO tblTeam (nameTeam, nationID) 
SELECT '" . $match_Team[1] . "', (SELECT nationID FROM tblNation WHERE nameNation = '" . $nation_name[1] . "')
WHERE NOT EXISTS (
    SELECT nameTeam FROM tblTeam WHERE nameTeam = '" . $match_Team[1] . "'
)";

$tblTeam2 = "INSERT INTO tblTeam (nameTeam, nationID) 
SELECT '" . $match_Team[2] . "', (SELECT nationID FROM tblNation WHERE nameNation = '" . $nation_name[2] . "')
WHERE NOT EXISTS (
    SELECT nameTeam FROM tblTeam WHERE nameTeam = '" . $match_Team[2] . "'
)";
mkshixfv

mkshixfv2#

让数据库为您进行数据验证。如果你想确保 name 如果是唯一的,请添加唯一索引/约束:

create unique index unq_tblTeam_nameTeam on tblTeam(nameTeam);

然后,在加载数据时,可以使用忽略错误 on duplicate key update :

insert into tblTeam (nameTeam, nationId)
    select ?, n.nationId
    from tblNation n
    where n.nameNation = ?
    on duplicate key update nameTeam = values(nameTeam);

这个 on duplicate key 子句不起任何作用--不起作用。但它确实防止了错误。
这个 ? 是参数的占位符。您应该学会用参数编写查询,而不是用这样的值munge查询字符串——这可能会导致错误和sql注入攻击。

相关问题