【问题标题】:PHP form is not transferring all data via $_POST methodPHP 表单未通过 $_POST 方法传输所有数据
【发布时间】: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 方法传输任何内容的原因可能是什么。

【问题讨论】:

  • 只有&lt;form&gt;.... &lt;/form&gt; 标签内的输入才会在您单击提交按钮时发送。您只有表单标签中的复选框,并且看起来没有提交按钮
  • 不清楚你是如何实际提交的(随便)
  • 好吧,我的提交按钮(在第一个 sn-p 上,与我的表单具有相同的 ID,因此它们应该链接在一起)。如果没有,还有其他方法可以将表单之外的提交按钮与表单本身连接起来吗?因为我需要提交按钮保持在顶部,而所有的复选框都是用 foreach 循环生成的
  • 与您当前的问题无关,但您需要将删除测试放在脚本的 top 处,然后再进行任何输出。并在重定向后退出或死亡。对重定向的赞誉;这里的大多数海报都没有这样做。
  • 将所有迭代的内容封装在一个单一的表单标签中,将提交按钮更改为普通按钮,并使用javascript在按钮点击时触发表单提交。

标签: php html forms post submit


【解决方案1】:

您误解了表单的工作原理。

您认为将事物命名相同会以某种方式将它们联系在一起的想法是错误的。 id 属性在页面上应该是唯一的。浏览器不会将几个具有相同id 的小表单组合成一个大表单。

根据您发布的 HTML,您正在创建如下内容:

<input type="submit" value="Mass Delete" name="deleteProducts" form="deleteForm" class="btn btn-primary">

<form action="deleteproducts.php" method="post" class="text-center" id="deleteForm">
    <input type="checkbox" name="checkbox[]" class="text-center" value="<?=$product['sku']?>"> 
</form>
<form action="deleteproducts.php" method="post" class="text-center" id="deleteForm">
    <input type="checkbox" name="checkbox[]" class="text-center" value="<?=$product['sku']?>"> 
</form>
<form action="deleteproducts.php" method="post" class="text-center" id="deleteForm">
    <input type="checkbox" name="checkbox[]" class="text-center" value="<?=$product['sku']?>"> 
</form>

每个新的&lt;form&gt; 标记都会启动一个新表单,而您的提交按钮不是其中任何一个的一部分。当您点击Submit 时,只会提交Submit 按钮。

你需要做的是这样的:

<?php
$products = [
    ['sku'=>"product 1"],
    ['sku'=>"product 2"],
    ['sku'=>"product 3"],
    ['sku'=>"product 4"],

];

?>

<form method="POST">
<input type="submit" name="delete" value="Mass Delete"><br>
<?php foreach($products as $product) { ?>
<input type="checkbox" name="checkbox[]" class="text-center" value="<?=$product['sku']?>"><br> 
<?php  } ?>
</form>

&lt;form&gt; 包装了用于创建表格的所有 HTML,包括 Submit 按钮和所有复选框。当您点击submit 时,将提交submit 按钮的值以及所有活动复选框的值。

您将在$_POST 数组中看到如下内容:

Array
(
[delete] => Mass Delete
[checkbox] => Array
(
[0] => product 1
[1] => product 3
)

)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    相关资源
    最近更新 更多