一开始我试着用 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;
2条答案
按热度按时间5anewei61#
所以,在因为这个问题而惊慌失措了两天之后,我终于找到了解决办法——实际上有很多问题,而不仅仅是一个。
首先,
$nation_name
有错误的字符串,而不是实际的国家。尽管如此,仍然会有语法错误。后来我发现
mysqli_query()
不允许同时进行两个查询$tblTeam
. 这就解释了为什么sql代码在phpmyadmin中工作,而不是在php中工作。然而,存在着mysqli_multi_query()
对于这种情况。不过,我在解析方面还是有问题的。我在网上找到了不少例子,但都不管用。我猜我的语法错误总是掩盖了这里的实际错误。最后的解决方案是将它分成两个独立的查询。它需要更多的代码行,但这是最简单的方法,效果很好。现在代码片段如下所示:
mkshixfv2#
让数据库为您进行数据验证。如果你想确保
name
如果是唯一的,请添加唯一索引/约束:然后,在加载数据时,可以使用忽略错误
on duplicate key update
:这个
on duplicate key
子句不起任何作用--不起作用。但它确实防止了错误。这个
?
是参数的占位符。您应该学会用参数编写查询,而不是用这样的值munge查询字符串——这可能会导致错误和sql注入攻击。