我有这个代码不起作用,我不知道为什么。。。
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{
}
只是应该将用户和照片插入到一个表中,如果以前没有这样的。。。谢谢你的帮助!
SELECT
缺少使用WHERE
子句时所需的FROM
子句。
这就是问题所在。
有几种方法可以解决这个问题。
为了快速修复,您可以在WHERE
之前添加FROM DUAL
。
如果您不喜欢MySQL查询看起来像Oracle查询,可以使用内联视图作为行源。
您可以使用FROM (SELECT 1) i
来代替FROM DUAL
。
这是一种不太像Oracle、更像MySQL的修复方法。这就是我的做法。
您也可以引用任何保证只返回一行的表或视图。(不可能是零行,也不可能是两行。
其他注意事项:
在MySQL中,标识符(例如列名)可以用反勾字符转义,但不能用单引号转义。只有当标识符包含不允许的字符(在未转义的标识符中)或标识符与保留字冲突时,才需要转义标识符。
INSERT INTO photolikes(`User`, `Photo`)
^ ^ ^ ^
此外,该代码似乎容易受到SQL注入的攻击。合并到SQL语句文本中的可能不安全的值应该正确转义。但更好的模式是使用带有绑定占位符的prepared语句。
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)")