2016-04-15 149 views
0

我有這樣的代碼不工作,和IM不知道爲什麼......WHERE NOT EXISTS語法錯誤

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{ 
} 

只是應該插入用戶和照片到表中,如果沒有這樣的在那裏之前...感謝您的幫助!

+0

你的意思是'dostst work'嗎?給你一個錯誤?應該做些什麼,做一些不同的事情或者什麼都不做? –

+0

@JuanCarlosOropeza你的SQL語法錯誤;檢查與您的MySQL服務器版本對應的手冊,在''用戶','照片')附近使用正確的語法SELECT ...... – Den

+0

'INSERT INTO photolikes('User','Photo')'.. ...反列列名稱,而不是引號;並且在你的第一個'SELECT'中沒有'FROM tablename'' –

回答

2

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

這就是問題所在。

有幾種方法可以解決這個問題。

快速修復,可以前WHERE添加FROM DUAL


如果您不喜歡您的MySQL查詢看起來像是Oracle查詢,那麼您可以使用內聯視圖作爲行源。

在地方的FROM DUAL你可以使用FROM (SELECT 1) i

這就是Oracle-more-MySQL-like-like方法。我就是這麼做的。

你也可以引用任何表格或視圖,你保證返回一行。 (它不能是零行,它不能是兩排


一對夫婦的其他注意事項:

在MySQL中,標識符(例如列名)與反引號字符轉義,但不是單引號。標識符只需要轉義它們是否包含不允許使用的(在非轉義標識符)字符或如果與保留字識別符的衝突。

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

此外,代碼看起來是容易受到SQL注入的影響。潛在的不安全值被合併orate成SQL語句的文本應該正確地轉義。但更好的模式是使用帶有綁定佔位符的預處理語句。

+0

工作,謝謝。但爲什麼添加DUAL工作? – Den

+0

@Den,你不能使用沒有'FROM'的'WHERE'。因此,即使您沒有從中讀取任何數據,您也需要一個「FROM」子句的「表」,該子句恰好有一行。 –

+0

@Den:DUAL是MySQL中的一個虛擬表名。在MySQL參考手冊中...「在沒有引用表的情況下,您可以指定DUAL作爲虛表名:DUAL純粹是爲了方便那些要求所有SELECT語句應該有FROM和其他可能的其他人子句,MySQL可能會忽略子句,如果沒有引用表,MySQL不需要FROM DUAL。「 [http://dev.mysql.com/doc/refman/5.7/en/select.html](http://dev.mysql.com/doc/refman/5.7/en/select.html) – spencer7593

0
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)") 
+0

'someTable'可能是一個像'(select 1)dummy'這樣的僞子選擇符 –

+0

將代碼更改爲:(「INSERT INTO photolikes(User,Photo) SELECT'$ user ',$ id FROM photo WHERE NOT EXISTS(SELECT ID FROM photolikes WHERE User ='$ user'AND Photo ='$ id')「); 現在它做了同樣的事情10倍... – Den

+0

並在變化後工作?您還需要更改''User','Photo''對於'\'User \',\'Photo \'' –