如何使用复选框和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>
答案 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>";
}
}
}