【发布时间】:2021-04-18 20:18:25
【问题描述】:
目前,我正在尝试使用 PHP 中的表单和 $_POST 方法删除带有复选框的多个项目。但是,当我提交表单时,我只收到提交按钮的值,而没有收到任何复选框值。
首先,我有一个 index.html.php 文件(模板文件),我的提交按钮所在的位置(最后一个导航项)。
<nav class="navbar navbar-expand-lg navbar-light">
<div class="container-fluid border-bottom m-3">
<a class="navbar-brand" href="#">Product List</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"
aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse justify-content-end" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item">
<a class="btn btn-primary mx-2" href="#">Add</a>
</li>
<li class="nav-item">
<input type="submit" value="Mass Delete" name="deleteProducts" form="deleteForm" class="btn btn-primary">
</li>
</ul>
</div>
</div>
</nav>
<main>
<div class="container">
<?=$output?>
</div>
</main>
然后我将所有产品和一个表格(表格位于底部)输出到页面上:
<?php foreach ($products as $product): ?>
<div class="card my-2">
<div class="card-body">
<p class="card-text text-center"><?php echo htmlspecialchars($product['sku'], ENT_QUOTES, 'UTF-8') ?></p>
<p class="card-text text-center"><?php echo htmlspecialchars($product['name'], ENT_QUOTES, 'UTF-8') ?></p>
<p class="card-text text-center"><?php echo htmlspecialchars($product['price'], ENT_QUOTES, 'UTF-8') . '$'?></p>
<?php if (!is_null($product['size'])): ?>
<p class="card-text text-center"><?php echo 'Size: ' . htmlspecialchars($product['size'], ENT_QUOTES, 'UTF-8') . ' MB'?></p>
<?php endif; ?>
<?php if (!is_null($product['dimensions'])): ?>
<p class="card-text text-center"><?php echo 'Dimensions: ' . htmlspecialchars($product['dimensions'], ENT_QUOTES, 'UTF-8')?></p>
<?php endif; ?>
<?php if (!is_null($product['weight'])): ?>
<p class="card-text text-center"><?php echo 'Weight: ' . htmlspecialchars($product['weight'], ENT_QUOTES, 'UTF-8') . ' KG'?></p>
<?php endif; ?>
<form action="deleteproducts.php" method="post" class="text-center" id="deleteForm">
<input type="checkbox" name="checkbox[]" class="text-center" value="<?=$product['sku']?>">
</form>
</div>
</div>
最后,我尝试使用以下代码删除在上一页中选中的项目:
$ids = array();
foreach($_POST['checkbox'] as $pval) {
$ids[] = (int)$pval;
}
$ids = implode(',', $ids);
$query = $pdo->prepare("DELETE FROM `products` WHERE `sku` IN ( $ids )");
$query->execute();
header('location: index.php');
} catch (PDOException $e) {
$title = 'An error has occured';
$output = 'Database error: ' . $e->getMessage() . ' in ' . $e->getFile() . ':' . $e->getLine();
}
但是,我收到以下消息:注意:未定义索引:C:\xampp\htdocs\scandiweb\deleteproducts.php 中的复选框
那么,除了提交按钮本身的值之外,没有通过 POST 方法传输任何内容的原因可能是什么。
【问题讨论】:
-
只有
<form>.... </form>标签内的输入才会在您单击提交按钮时发送。您只有表单标签中的复选框,并且看起来没有提交按钮 -
不清楚你是如何实际提交的(随便)
-
好吧,我的提交按钮(在第一个 sn-p 上,与我的表单具有相同的 ID,因此它们应该链接在一起)。如果没有,还有其他方法可以将表单之外的提交按钮与表单本身连接起来吗?因为我需要提交按钮保持在顶部,而所有的复选框都是用 foreach 循环生成的
-
与您当前的问题无关,但您需要将删除测试放在脚本的 top 处,然后再进行任何输出。并在重定向后退出或死亡。对重定向的赞誉;这里的大多数海报都没有这样做。
-
将所有迭代的内容封装在一个单一的表单标签中,将提交按钮更改为普通按钮,并使用javascript在按钮点击时触发表单提交。
标签: php html forms post submit