WHERE NOT EXISTS 语法错误

WHERE NOT EXISTS syntax error

我有这个代码不起作用,我不确定为什么...

if(isset($_GET['id'], $_SESSION['username'])){
  $id = $_GET['id'];
  $user = $_SESSION['username'];
  $query = $handler->query("INSERT INTO photolikes('User', 'Photo')
                            SELECT '$user', '$id'
                            WHERE NOT EXISTS (SELECT Id FROM photolikes WHERE User='$user' AND Photo=$id)");
}else{
}

只是应该将用户和照片插入到 table 中,如果之前没有这样的话...感谢您的帮助!

INSERT INTO photolikes(`User`, `Photo`)
     SELECT '$user', '$id'
     FROM <someTable>
     ^^^^ you miss the FROM
     WHERE NOT EXISTS (SELECT Id 
                       FROM photolikes  -- Here you didnt forget.
                       WHERE User='$user' AND Photo=$id)")

SELECT 缺少使用 WHERE 子句时所需的 FROM 子句。

这就是问题所在。

有几种方法可以修复它。

为了快速修复,您可以在 WHERE 之前添加 FROM DUAL


如果您不喜欢 MySQL 查询看起来像是 Oracle 查询,您可以使用内联视图作为行源。

代替FROM DUAL你可以使用FROM (SELECT 1) i.

这是修复它的 less-Oracle-more-MySQL-like 方法。我就是这样做的。

您还可以引用任何 table 或认为您保证 returns 恰好一行。 (不能是零行,也不能是两行。


其他一些注意事项:

在MySQL中,标识符(例如列名)可以用反引号转义,但不能用单引号转义。只有当标识符包含不允许的字符(在未转义的标识符中)或标识符与保留字冲突时,才需要对其进行转义。

 INSERT INTO photolikes(`User`, `Photo`)
                        ^    ^  ^     ^

此外,该代码似乎容易受到 SQL 注入攻击。合并到 SQL 语句文本中的潜在不安全值应该正确转义。但是更好的模式是使用带有绑定占位符的准备好的语句。