2010-03-26 119 views
0

我的表是comment_likedislike。它有comment_counterid,comment_counter,comment_id(來自另一個表)字段。 我有一個url(LIKE),點擊時鏈接到這個代碼並獲得comment_id和like_id。似乎無法讓我喜歡/不喜歡在PHP中工作

我想做一個計數,如果它是第一個'like',它會在comment_likedislike表中存儲一個新的comment_counter。但是,如果表中的評論已經有了'喜歡',它只會將comment_counter更新爲+1。

問題:當我運行這段代碼時,它不會更新(第一條語句),而是INSERT(第二條語句),不管是否有類似的評論。我不認爲代碼正在檢查comment_id是否已經在表中。

我是一名PHP程序員。

謝謝!

if (isset($_GET['comment_id']) && isset($_GET['like_id'])) { 
    $query5="SELECT * FROM comment_likedislike "; 
    $data5=mysqli_query ($dbc, $query5); 
    while ($row5= mysqli_fetch_array($data5)){ 
     $comment_id2=$row5['comment_id']; 
    } 

     if ($comment_id2 == $_GET['comment_id']){ 

      $counter=$row5['comment_counter']; 
      $counter++; 

      $query= "UPDATE comment_likedislike SET comment_counter ='$counter' WHERE comment_id= '".$_GET['comment_id']."' "; 
      mysqli_query($dbc, $query); 

     } 
     if ($comment_id2 != $_GET['comment_id']) { 
      $counter2=1; 
      $query9 = "INSERT INTO comment_likedislike (comment_counter, comment_id) VALUES ('$counter2', '".$_GET['comment_id']."')"; 
      mysqli_query($dbc, $query9); 
     } 

} 
+0

代碼在頂部被切斷...對不起 – ggfan 2010-03-26 18:39:03

回答

3

我試圖根據您的代碼推斷您要做的事。看起來你正在試圖增加一個對應於GET參數中給定註釋ID的計數器。如果沒有對應於該評論的行,則要創建一個新評論。

如果這就是你打算做的事情,那麼你會發現一切都是錯誤的。這很難解釋你的代碼是多麼的錯誤,因爲我無法弄清楚你需要用什麼樣的思維來提出這樣的代碼。

首先,你應該把你的支票在SQL查詢該行的存在,那麼你就需要修改你的if語句的結構:

if (isset($_GET['comment_id']) && isset($_GET['like_id'])) { 

    // Ignoring obvious SQL injection vulnerability for now 
    $query5="SELECT * FROM comment_likedislike WHERE comment_id = '" . 
     $_GET['comment_id'] . "'"; 

    $data5=mysqli_query ($dbc, $query5); 
    if ($row5= mysqli_fetch_array($data5)){ 
     $counter=$row5['comment_counter']; 
     $counter++; 

     $query= "UPDATE comment_likedislike SET comment_counter ='$counter' WHERE comment_id= '".$_GET['comment_id']."' "; 
     mysqli_query($dbc, $query); 
    } 
    else 
     $counter2=1; 
     $query9 = "INSERT INTO comment_likedislike (comment_counter, comment_id) VALUES ('$counter2', '".$_GET['comment_id']."')"; 
     mysqli_query($dbc, $query9); 
    }  
} 

我也建議你閱讀Best way to stop SQL Injection in PHP因爲你永遠不想按照你在示例中所做的方式構建查詢。 (或者我的,對於這個問題。)

+0

感謝您的輸入。我會嘗試修改我的編碼。 – ggfan 2010-03-26 19:21:33

0

使用的echo聲明,看看有什麼值,您實際上得到了$_GET['comment_id']$comment_id2。由於您從未觸及過更新情況,因此這兩個值絕不能相等。

可能有任何數量的原因,他們不匹配,從一個或另一個值(你可以修剪出)的額外空間到HTML表單,其中包含一個導致參數永遠不會被髮送的錯誤。

4

您應該在您的SQL查詢中放入WHERE子句,而不是抓取整個表並在PHP中解析它。

if (isset($_GET['comment_id']) && isset($_GET['like_id'])) { 
    $query5="SELECT * FROM comment_likedislike WHERE comment_id = '" . $_GET['comment_id'] . "'"; 
    $data5 = mysqli_query ($dbc, $query5); 
    $row5 = mysqli_fetch_array($data5); 

然後您可以打開空($ row5)的值。

您的代碼已損壞,因爲$ comment_id2將始終是表中的最後一個註釋ID。您拉動整個表格,然後依次將$ comment_id2設置爲每個'comment_id'字段。

+2

+1:雖然我會使用參數化查詢來避免SQL注入攻擊。 – Powerlord 2010-03-26 18:52:39

+0

我同意。感謝您指出了這一點。 :) – David 2010-03-26 18:54:44