2014-08-30 54 views
0

我試圖插入兩個值到表中,如果滿足一個條件而另一個不滿足。在條件下將值插入表

我已經找到關於此事的教程,但我似乎無法讓它工作。

本教程介紹瞭如何創建一個簡單的PHP按鈕,並且有兩個表格articlesarticles_likes

articles有兩列:ID標題

articles_likes有三列:ID用戶文章

本教程中的代碼如下所示:

$db->query(" 
    INSERT INTO articles_likes (user, article) 
     SELECT {$_SESSION['user_id']}, {$id} 
     FROM articles 
     WHERE EXISTS (
      SELECT id 
      FROM articles 
      WHERE id = {$id}) 
     AND NOT EXISTS (
      SELECT id 
      FROM articles_likes 
      WHERE user = {$_SESSION['user_id']} 
      AND article = {$id}) 
     LIMIT 1 
"); 

現在首先使用PDO與$query = $pdo->prepare(" .. ");和問號加bindValue() IM避免SQL注入,以及所有爲工作的罰款與其他SQL語句,但這個似乎並不奏效。

我用GOOGLE搜索INSERT INTO .. SELECT .. FROM語法,而W3schools解釋爲將數值從一個表複製到另一個表。那麼這在教程中如何工作呢? articles具有完全不同的結構,並且他將$變量插入到SELECT聲明中。

任何人都可以解釋爲什麼這項工作在第一個地方,以及它如何在PDO工作?

編輯:

這是我自己的代碼(我已經添加了$value,因爲我的代碼是二進制的評價,而不是像):

global $pdo; 

    $query = $pdo->prepare(" 
       INSERT INTO quote_ratings (user_ip, quote_id, value) 
        SELECT ?, ?, ? 
        FROM posts 
        WHERE EXISTS (
         SELECT id 
         FROM posts 
         WHERE id = ?) 
        AND NOT EXISTS (
         SELECT id 
         FROM quote_ratings 
         WHERE user_ip = ? 
         AND quote_id = ?) 
        LIMIT 1 
      "); 
    $query->bindValue(1, $user_ip); 
    $query->bindValue(2, $quote_id); 
    $query->bindValue(3, $rating); 
    $query->bindValue(4, $quote_id); 
    $query->bindValue(5, $user_ip); 
    $query->bindValue(6, $quote_id); 
    $query->execute(); 
+0

如果您需要SQL語法幫助,請發佈有問題的SQL查詢,而不是本教程中的查詢。 – Andomar 2014-08-30 12:02:29

+0

@Andomar謝謝,補充! – JKunstwald 2014-08-30 12:06:59

+0

謝謝,您是否還可以添加更好的問題描述而不是「看起來不起作用」?是否有錯誤訊息? – Andomar 2014-08-30 12:14:43

回答

0

我發現問題:默認情況下,PDO使用未緩衝的查詢。由於某種原因,請求無法解析。所以模式必須改變這個請求:

$dbh->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); 

和一切工作正常從那時起!

0

某種類型的嵌套的SQL查詢沒有正確地獲得綁定,並且在處理查詢期間PDO解析器留下了一些東西。也無法查看PDO生成的最終查詢。

我會推薦在這種情況下使用Mysqli庫。在複雜的連接或自定義觸發器的執行過程中,我通常會遇到這樣的問題。如果你想繼續使用面向對象的代碼,你可以使用MySQLi類,或者你也可以使用簡單的程序方法。

阿圖爾金達萊

+0

真的嗎?我認爲PDO是SQL訪問最好也是最安全的解決方案..任何人都可以證實這一點嗎? – JKunstwald 2014-08-30 12:23:42

0

我我完全同意這PDO是不錯的選擇,以避免SQL注入,但是,你知道,你是無法調試查詢此類情況。但是,如果你明智地使用mysqli並在輸入時正確地檢查sql注入,那麼就不會有問題。