2014-06-11 166 views
0

我的SQL看起來像一個問題。我試圖通過文檔環顧四周,似乎無法找到我的錯誤。語法錯誤或訪問衝突:1064

繼承人的錯誤:

[11軍2014年17點56分46秒]警告:[池WWW]兒童12509說成標準錯誤:「注意:PHP消息:PHP致命錯誤:未捕獲的異常「PDOException '信息'SQLSTATE [42000]:語法錯誤或訪問衝突:1064您的SQL語法有錯誤;請查看與您的MySQL服務器版本相對應的手冊,以找到在'END WHERE id IN()'附近使用的正確語法。在/var/www/html/output.php:53「

我應該補充說,該代碼的工作原理是...只有當我嘗試添加以下$options錯誤出現:

$options = array(
    PDO::ATTR_EMULATE_PREPARES => false, 
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 
); 

,代碼:

# Also prepare SQL for update below 
    $sql = "UPDATE `headlines` SET views = CASE id "; 
    foreach ($headlines as $headline) { 
    $id = $headline['id']; 
    $sql .= sprintf("WHEN %d THEN views + 1 ", $id); 
    } 
    # Update views 
    $placeholders = rtrim(str_repeat('?, ', count($ids)), ', '); 
    $sql .= "END WHERE id IN ($placeholders)"; 
    $q = $db->prepare($sql); 
    $q->execute($ids); 

生成的查詢:

UPDATE `headlines` SET views = CASE id WHEN 1364 THEN views + 1 WHEN 1365 THEN views + 1 WHEN 1366 THEN views + 1 END WHERE id IN (?, ?, ?) 

它也有可能它可能是空的,像這樣的:

UPDATE `headlines` SET views = CASE id END WHERE id IN() 
+2

告訴我們生成的查詢。 –

+0

我更新了我的問題。 – Tallboy

+1

嘗試像這樣'CASE WHEN id = 1364 THEN views + 1 WHEN id = 1365 ...' – Mihai

回答

2

你問PDO發送遇到錯誤時發生異常,並且您沒有采取任何措施來捕獲該異常。這就是導致致命錯誤的原因,以及爲什麼在更改PDO配置時看到不同的行爲(如果您未記錄日誌或查看日誌,您可能沒有注意到錯誤)。

現在在異常消息中給出了SQL錯誤的原因。您的問題始於在您的查詢中使用ENDCASE id END是無效的語法。

在生成的SQL中,我不清楚爲什麼你使用case語句。正如上面在註釋中所建議的那樣,您指定的WHERE子句只會對提供的特定ID執行更新,因此CASE語句是多餘的,不要提及它違背了對輸入進行參數化的方法。

這應該是所有你需要:

UPDATE headlines SET views = views + 1 WHERE id IN (?,?,?) 
+0

如果我包括一個'require 'db.php');'在最初的'$ db = new PDO()'的所有文件的頂部。我認爲我發現錯誤的方法是使用'try {x} catch {y}'對嗎?是否有可能我可以把'require'語句替換成上面的'x'?或者我可以只包裝這一行'$ q-> execute($ ids);'試一試? – Tallboy

+0

@Tallboy良好的編碼習慣會讓你包裝任何可能在try-catch中拋出異常的代碼。至少在你的情況下,你應該在try catch塊中包裝準備和執行步驟(也可能是你使用結果集的步驟)。 –

+0

如果我問你1或2個有關PDO的問題,而不是堆棧溢出,你可以使用嗎?也許郵件?我會爲你付出時間。 – Tallboy

相關問題