2010-03-26 115 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