【问题标题】:Stop sql query from updating all columns in for each loop停止 sql 查询更新每个循环中的所有列
【发布时间】:2015-10-14 22:53:08
【问题描述】:

已经就这个问题提出了很多问题。我已经完成了一些在 stackoverflow 上给出的解决方案,但它们似乎都不起作用。我有一个带有 foreach 循环的表单,我试图提交 "the selected form" 及其唯一值,然后使用该值运行 SQL 查询。

问题是,正在提交的文本区域的名称属性。起初,查询只会更新循环中的最后一列。然后我尝试了另一种方法。例如,将 name 属性更改为“someattribute[ ]”。

现在查询中的所有选定列正在更新。

form.php

 <?php
  ...................
  foreach($stmt as $obj){

      $id = $obj['id'];
      $likes = $obj['like1'];


      echo '<form action="" method="post"    enctype="multipart/form-data">';
      echo '<input type="hidden" name="lkcv[]" value="'.$id.'">';
      echo '<input type="hidden" name="like" value="">';
      echo '<input type="image" src="images/like.png" id="lksub" width="15" 
  value="som" height="15" style="float:right;position:relative;margin-
  right:290px;"/><div class="ld">'.$likes.'</div>';
      echo '</form>’;
     }
  ?>

query.php

<?php

if (isset($_POST['like'])){

     $com_id = $_POST['lkcv'];

     for ($i=0; $i<sizeof($com_id);$i++){
         # query into db table to know current voting score 
         $query = mysql_query("SELECT like1 FROM comment WHERE id = '$com_id[$i]'");

         # increase or dicrease voting score
         if ($data = mysql_fetch_array($query)) {

               $like = ++$data['like1'];

               # update new voting score
               $query2 = mysql_query("UPDATE comment SET like1 = '{$like}' WHERE id = '$com_id[$i]'");

    }
        }
  }
    ?>

query.php [已解决]

  <?php
    if( isset( $_POST['lkcv'] ) && is_array( $_POST['lkcv'] ) )
    {
      $idArray = array();
      foreach( $_POST['lkcv'] as $value )
  {
    $idArray[] = intval( $value );
   }

   $db->query( "UPDATE comment SET like1 = like1 + 1 WHERE id IN (".implode( 
   ',', $idArray ).")" );
      }
         ?>

注意: 我将更新我的查询以使用 PDO 准备好的语句,一旦我得到这个工作。感谢您的帮助。

【问题讨论】:

  • 那么这里的实际问题是什么
  • @Uchiha,评论表中所有行的“like1”列都会更新。我只想更新 id 为“1”的行。
  • 能否提供结果查询的输出:echo "UPDATE comment SET like1 = '{$like}' WHERE id = '$com_id[$i]'"
  • @Andriy,所有 +1 都添加到“like1”列中的前一个值。所以结果是值+1,每次点击按钮。
  • @chris94 正如您在隐藏字段中将名称属性称为数组 [] 所说,您必须检查帖子值是否为数组。然后你必须通过 $_POST['lkcv'] 的 foreach 来检索它。例如

标签: php html mysql for-loop while-loop


【解决方案1】:

这个查询循环了多少次?如果每个表行都被添加到“lkcv”数组中,那么每一行都将被修改,因为 FOR 循环被告知为“lkcv”数组的每个成员循环。

因此,如果您的表有 50 行并且所有 50 行都被传递到数组中,那么这 50 行中的每一行都会受到影响。

您还可以通过增加 UPDATE 语句中的 'like1' 字段来优化您的代码...

UPDATE comment SET like1 = like1 + 1 WHERE id = '$com_id[$i]'

UPDATE comment SET like1 = like1 + 1 WHERE id = '$com_id'

如果你想像我假设的那样只执行一次。

【讨论】:

  • 是的,情况就是这样,因为它循环了 4 次,这与我在表中的行数相同。我该如何解决这个问题?
  • 它应该循环多少次?还是只应该执行一次?如果是后者,则发布不带数组括号的 id 并删除循环,以便查询只执行一次。
【解决方案2】:

为什么你需要使用 select 和 update 只是为了将 like 增加 1?为什么不直接在mysql中使用?它降低了代码复杂度。像下面这样尝试并检查值。如果还存在问题,则通过 print_r 调试,回显并退出。

<?php
if(isset($_POST['lkcv']) && isset($_POST['like'])){
  if (is_array($_POST['lkcv'])) {
    foreach($_POST['lkcv'] as $value){
               $query2 = mysql_query("UPDATE comment SET like1  = like1 + 1 where id = '$value'");
    }
  } 
}
?>

提示:不要使用 sizeof()。使用 count() 代替。参考这个link

【讨论】:

  • "$value" 中的值是正确的,但它没有在我的表中更新。
  • @chris94 只需使用 where id = '$value'
  • 使用“if(isset($_POST['lkcv']) && isset($_POST['like']))”语句时按钮不起作用。
  • @chris94 您没有在表单中显示任何按钮。你通过了 lkcv 并且喜欢两者都通过隐藏。所以这个表单提交后它必须在 POST 中可用。
【解决方案3】:

我会在这样的一个查询中执行此操作:

<?php

if( isset( $_POST['lkcv'] ) && is_array( $_POST['lkcv'] ) )
{
    $idArray = array();

    foreach( $_POST['lkcv'] as $value )
    {
        $idArray[] = intval( $value );
    }

    $db->query( "UPDATE comment SET like1 = like + 1 WHERE id IN (".implode( ',', $idArray ).")" );
}

【讨论】:

  • 你犯了一个小错误,like是mysql中的保留关键字,这就是我使用like1的原因。您没有使用 like1 + 1。感谢您的帮助,现在可以使用。
猜你喜欢
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
  • 2021-12-25
相关资源
最近更新 更多