【问题标题】:Syntax error in SQL with WHERE NOT EXISTS when parsing with PHP使用 PHP 解析时出现 WHERE NOT EXISTS 的 SQL 语法错误
【发布时间】:2018-06-29 10:23:06
【问题描述】:

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

现在我有以下代码sn-p:

$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 (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, nationalID) SELECT * FROM (SELECT 'Serbia', (SELECT nationalID FROM tblNation WHERE nameNation = 'Serbia')) AS tmp WHERE NOT EXISTS (SELECT nameTeam FROM tblTeam WHERE nameTeam = 'Serbia')限制 1; INSERT INTO tblTeam (nameTeam, nationalID) SELECT * FROM (SELECT 'Brazil', (SELECT nationalID FROM tblNation WHERE nameNation = 'Brazil')) AS tmp WHERE NOT EXISTS (SELECT nameTeam FROM tblTeam WHERE nameTeam = 'Brazil') LIMIT 1;

【问题讨论】:

  • 如何使用行数据代替列名?
  • 打印以控制台变量$tblTeam 的内容并将结果附加到您的问题中。
  • 我真的不是很有经验,但你不应该选择 column_name 而不是 select $match_team[2] 吗? match_team[2] 里面有列名吗?如果是,您如何在查询结束时进行比较?
  • 您是如何尝试运行查询的?您尝试运行 2 条语句,但并非所有调用都支持多查询字符串。
  • @FDavidov 实际上帮助解决了一个问题。 $nation_name 不包含实际的国家。但是,SQL 查询仍然存在语法错误。将$tblTeam的内容添加到我的问题中。

标签: php mysql sql syntax-error


【解决方案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 注入攻击。

【讨论】:

  • 好吧,我尝试学习,但由于这对我来说只是一种爱好,我可能不是最快的:) 是否可以避免在on duplicate key 子句之后更新nameTeam?我真的只需要检查我通过 PHP 获得的值是否已经在相应的 mySQL 表中。无需更新它们。
  • @S1dy 。 . .你可以省略on duplicate key 子句,你会得到一个错误。
【解决方案2】:

所以,在因为这个问题而吓坏了 2 天之后,我终于找到了解决方案 - 实际上有很多问题,而不仅仅是一个。

首先,$nation_name 有错误的字符串,而不是实际的国家。尽管如此,仍然会出现语法错误。

接下来我发现mysqli_query() 不允许在同一个$tblTeam 中进行两个查询。这解释了为什么 SQL 代码在 phpMyAdmin 中有效,但在 PHP 中无效。但是,对于这种情况,存在mysqli_multi_query()。尽管如此,我还是会遇到解析问题。我遵循了很多我在网上找到的例子,但它永远不会奏效。我猜我总是在这里掩盖了实际错误的语法错误。

现在的最终解决方案是将其拆分为两个单独的查询。它需要更多的代码行,但这是最简单的方法并且工作正常。现在代码 sn-ps 看起来像这样:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 2018-12-31
    • 2016-01-09
    • 2017-02-04
    相关资源
    最近更新 更多