使用PHP

时间:2018-06-29 10:23:07

标签: php mysql sql syntax-error

起初,我尝试使用IF NOT EXISTS进行SQL查询,但是我总是遇到语法错误,并不真正理解为什么。但是输入我的标题stackoverflow给我一些有关同一问题的问题。足够有趣的是,Google找不到它们……无论如何,所以我将查询更改为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: 
  

您的SQL语法有错误;       检查与您的MariaDB服务器版本相对应的手册以获取正确的语法       在'INSERT INTO tblTeam(nameTeam,nationalID)附近使用SELECT * FROM(在第7行选择'B'

我现在有点困惑,因为我看不出问题所在。在我的调试示例中,$match_Team[1]的值为Serbia$match_Team[2]的值为Brazil。分别适用于$nation_name[1]$nation_name[2]

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

  

在tblTeam中插入(nameTeam,nationalID)SELECT * FROM(选择'Serbia',(从tblNation WHERE nameNation ='Serbia'选择SELECT nationalID'))不存在tmp(从tblTeam WHERE nameTeam ='Serbia'中选择nameTeam LIMIT 1;将INSERT插入tblTeam(nameTeam,nationalID)SELECT * FROM(选择'Brazil',(从tblNation WHERE nameNation ='Brazil'选择SELECT nationalID'))在不存在tmp的情况下(从tblTeam WHERE nameTeam ='Brazil'的SELECT nameTeam)限制1;

2 个答案:

答案 0 :(得分: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注入攻击。

答案 1 :(得分:0)

因此,由于这个问题而困扰了两天后,我终于找到了解决方案-实际上有很多问题,而不仅仅是一个。

首先,$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] . "'
)";