删除foreach循环中的记录

时间:2014-10-25 20:23:28

标签: php mysql arrays

我有一个数组,我通过$ _POST变量传递。在foreach循环中,我想检查是否已检查“删除”。如果是这样,我将删除该记录。如果未选中删除,我将更新记录。当我运行此更新工作完美。如果我检查了删除 - 它将删除数组中的第一条记录 - 而不是带有复选框的记录的相应ID的记录。如果我有2个检查 - 它将采取第一个2.如果我所有检查它们 - 它显然将删除所有记录。我整天都在和这个人搏斗 - 寻求一点帮助。谢谢。

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

    $slo_id = $_POST['slo_id'];

    foreach ($_POST['score_id'] as $key=>$score_id) {
    $del = $_POST['del'][$key];

    if ($del == 'checked') {

                $sql2 = " DELETE FROM slo_score WHERE score_id = $score_id "; 
            #execute SQL statement 
           $result = mysql_query($sql2); 
        # check for error 
           if (mysql_error()) { print "Database ERROR in SQL Update Statement: " . mysql_error(); }
            }
    else {
        $growth_target = $_POST['growth_target'][$key];
        $final_score = $_POST['final_score'][$key];
        $meets = $_POST['meets'][$key];





                  //update table
      $sql1 = "UPDATE slo_score SET growth_target='$growth_target',final_score='$final_score',meets='$meets' WHERE score_id = $score_id";

         #execute SQL statement 
      $result = mysql_query($sql1); 
    # check for error 
      if (mysql_error()) { print "Database ERROR in SQL Update Statement: " . mysql_error(); } 

        }

        }



        header("location:...);

}

2 个答案:

答案 0 :(得分:0)

试试这个

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

    $slo_id = $_POST['slo_id'];

    foreach ($_POST['score_id'] as $key=>$score_id) {


    if (isset($_POST['del'][$key])) {

                //use mysqli to delete the record
            }
    else {
        $growth_target = $_POST['growth_target'][$key];
        $final_score = $_POST['final_score'][$key];
        $meets = $_POST['meets'][$key];





                   //update table
          use mysqli to update the record 

        }

        }



        header("location:...);

}

答案 1 :(得分:0)

您应该不惜一切代价避免循环删除MySQL。

如果您要收到要删除的ID数组,为什么不直接将其发送到一个(或几个,如果这是我们正在谈论的数千个ID;将它们分块)查询:

$score_ids = isset($_POST['score_id']) ? $_POST['score_id'] : array();

$score_ids_in = implode("', '", $score_ids);

$sql = sprintf("DELETE FROM slo_score WHERE score_id IN ('%s')", $score_ids_in);

$result = mysql_query($sql);

当然,这不会为您提供逐行反馈,但它会使您的数据库不会被窒息死亡。

此外,您已经知道应该使用Mysqli来防止人们破坏您的数据库,从中提取敏感数据,或两者兼而有之。这与你现在正在做的事情并没有太大的变化,除了它更加安全。