起初我尝试用IF NOT EXISTS
进行SQL查询,但我总是得到语法错误,并不真正理解为什么。但是输入我的标题堆栈溢出给了我一些关于同一问题的问题。有趣的是,谷歌无法找到它们...无论如何,所以我将查询更改为迈克在此问题中建议的内容。
现在我有以下代码片段:
$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 服务器版本相对应的手册,了解正确的语法 在"插入 TBLTEAM(名称团队,国家 ID("附近使用 * 从(在第 7 行选择"B">
我现在有点困惑,因为我看不出有什么问题。在我用于调试的示例中,$match_Team[1]
的值为Serbia
,$match_Team[2]
值Brazil
。$nation_name[1]
和$nation_name[2]
也是如此。
编辑:因为@FDavidov要求它,所以$tblTeam的内容如下:
插入到 TBLTEAM (名称团队, 国家 ID( 选择 * 从 (选择 '塞尔维亚', (从 tblNation 中选择国家 ID, 其中 nameNation = '塞尔维亚'((作为 tmp 不存在的地方 (从 tblTeam 中选择名称团队,其中名称团队 = '塞尔维亚'( 限制 1;插入到 TBLTEAM (名称团队, 国家 ID( 选择 * 从(选择"巴西",(从 tblNation 中选择国家 ID,其中名称国家 = "巴西"(( 作为不存在的 TMP (从 tblTeam 中选择名称团队,其中名称团队 = "巴西"( 限制 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注入攻击。
因此,在因为这个问题而吓坏了 2 天之后,我终于得到了解决方案 - 实际上有很多问题,而不仅仅是一个。
首先,$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] . "'
)";