使用复选框和PDO准备好的语句删除多行

时间:2019-09-04 14:50:43

标签: php mysql pdo prepared-statement

如何使用复选框和PDO准备好的语句删除多行?

使用给定的代码,我只能从选中的行中删除最后一行,但不能全部删除。我想我在 Main.php 中有误,具体是在准备好的语句中。

我该如何解决这个问题?

Main.php

       // DELETE DATA with PDO
       public function delete($id){
        $sql = "DELETE FROM $this->table WHERE id IN (:id)";
        $stmt = DB::prepare($sql);
        $stmt->bindParam(':id', $id);
        return $stmt->execute();
    }

index.php

    // DELETE DATA
    if(isset($_POST['delete'])) {
      $id = $_POST['id'];
      if ($user->delete($id)){
        echo "Data Deleted Successfully.. </br>"; 
      }
    }
index.php

中的

form

<form method="POST"> 
<div class="row">
   <?php if ($user->readAll() > 0) : ?>
    <?php foreach ($user->readAll() as $value) : ?>
    <div class="col-md-3 ajax-del"> <!--Delete div with AJAX--> 
      <div class="card border-secondary mb-4">
          <a href="#"><img src="<?= $value['image'] ?>" alt="<?= $value['name']?>" class="card-img-top img-fluid"></a>
          <div class="card-body bg-light text-center">
            <input type="checkbox"  class="float-left" value="<?php echo $value['id']?>" name="id"></<input>
            <p class="card-text mt-3"><?=$value['barcode'] ?></p>
            <h5 class="card-title text-danger font-weight-bold"><?= $value['name']?></h5>
            <p class="card-text">$<?= number_format($value['price'], 2)?></p>
            <p class="card-text"><?=$value['weight']?></p>
            <p class="card-text"><?=$value['size']?></p>
            <p class="card-text mb-4"><?=$value['height']?> <?=$value['width'] ?><?=$value['length']?></p>
          </div>
        </div>
      </div>
   <?php endforeach ?>
   <?php endif ?>
  </div>
  <input type="submit" class="btn btn-danger float-right mr-3" id="delete" name="delete" onclick="return confirm('Are you sure?')"></input>
</form>

1 个答案:

答案 0 :(得分:0)

如果您有多个具有相同名称的表单控件,PHP将仅获得最后一个,因为name属性在$_POST中成为数组键,并且数组键在定义上是不同的。因此,您的复选框中的name="id"意味着PHP仅会获取最后一个。您可以定义名称,以便使用方括号可以在$_POST中访问数组。将其更改为name="id[]"

然后,您将需要修改函数以使其采用数组,或者使用数组中的每个ID多次调用它。

如果是我的项目,我希望修改该函数以采用数组。

public function delete(array $ids) {
    $placeholders = trim(str_repeat('?,', count($ids)), ',');
    $sql = "DELETE FROM $this->table WHERE id IN ($placeholders)";
    $stmt = DB::prepare($sql);
    return $stmt->execute($ids);
}

如果不更改功能,则只需多次调用它。

if (isset($_POST['delete'])) {
    foreach ($_POST['id'] as $id) {
        if ($user->delete($id)) {
            echo "Data Deleted Successfully for $id.. </br>"; 
        }
     }
}
相关问题