【问题标题】:Delete multiple rows with checkbox and PDO prepared statements [duplicate]使用复选框和 PDO 准备语句删除多行 [重复]
【发布时间】:2020-01-07 11:59:05
【问题描述】:

如何使用复选框和 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>

【问题讨论】:

  • 这个函数只需要一个ID,所以它看起来不能删除多行,除非你多次调用它。我猜$_POST['id'] 是复选框值?它是数组还是单个值?如果该函数完全有效,我假设它是一个值,但也许它不应该是。你的表单是什么样子的?
  • 我已经在我的答案中更新并粘贴了form 代码。

标签: php mysql pdo prepared-statement


【解决方案1】:

如果你有多个同名的表单控件,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>"; 
        }
     }
}

【讨论】:

  • 它正在工作..问题已解决..非常感谢..您帮助我开始了我在公司的第一次工作..
  • 不客气!祝你工作顺利。
猜你喜欢
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 2014-04-19
  • 2015-10-13
相关资源
最近更新 更多