gpt4 book ai didi

php - 使用 PHP 解析时,WHERE NOT EXISTS 在 SQL 中出现语法错误

转载 作者:行者123 更新时间:2023-11-29 02:41:27 25 4
gpt4 key购买 nike

起初我尝试使用 IF NOT EXISTS 进行 SQL 查询,但我总是遇到语法错误并且我并不真正理解为什么。但是输入我的标题 stackoverflow 给了我一些关于同一问题的问题。有趣的是,谷歌无法找到它们......无论如何,所以我将查询更改为 Mike 在 this Question 中建议的查询。 .

现在我有以下代码片段:

$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: 

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'INSERT INTO tblTeam (nameTeam, nationID) SELECT * FROM (SELECT 'B' at line 7

我现在有点困惑,因为我看不出问题出在哪里。在我用于调试的示例中,$match_Team[1] 的值为 Serbia$match_Team[2] 的值为 Brazil$nation_name[1]$nation_name[2] 也是如此。

编辑:因为@FDavidov 要求,这里是 $tblTeam 的内容:

INSERT INTO tblTeam (nameTeam, nationID) SELECT * FROM (SELECT 'Serbia', (SELECT nationID FROM tblNation WHERE nameNation = 'Serbia')) AS tmp WHERE NOT EXISTS (SELECT nameTeam FROM tblTeam WHERE nameTeam = 'Serbia') LIMIT 1; INSERT INTO tblTeam (nameTeam, nationID) SELECT * FROM (SELECT 'Brazil', (SELECT nationID FROM tblNation WHERE nameNation = 'Brazil')) AS tmp WHERE NOT EXISTS (SELECT nameTeam FROM tblTeam WHERE nameTeam = 'Brazil') LIMIT 1;

最佳答案

让数据库为您进行数据验证。如果你想确保 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 子句什么都不做——空操作。但它确实可以防止错误。

? 是参数的占位符。您应该学习使用参数编写查询,而不是使用这些值来编写查询字符串——这可能会导致错误和 SQL 注入(inject)攻击。

关于php - 使用 PHP 解析时,WHERE NOT EXISTS 在 SQL 中出现语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51099594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com