【问题标题】:Php : Post a list of checkboxesPhp:发布复选框列表
【发布时间】:2015-05-26 13:27:02
【问题描述】:

在一个 SQL 请求之后,我获得了一个包含数据列表的表单,每行末尾都有复选框。目标如下。如果用户选中了其中的一些,那么在提交表单时,该行将在数据库中被删除。

我用我的 SQL 请求结果来命名我的复选框,这样我的 Php 脚本就可以找到要删除的行:

<input type="checkbox" name="chk[<?echo '/'.'$t[datetr]'.'/'.'$t[beneficiaire]'.'/'.'$t[objet]'.'/'.'$t[montant]';?>]">

我的目标是使用 $_POST 将所有复选框值添加到我的 Php 脚本中。但即使这样......

foreach ($_POST as $key => $value) {
        echo "<tr>";
        echo "<td>";
        echo $key;
        echo "</td>";
        echo "<td>";
        echo $value;
        echo "</td>";
        echo "</tr>";
    }

...我的 php 脚本似乎没有得到复选框值...我做错了吗?感谢您的帮助。

【问题讨论】:

  • 您的复选框的最终name 属性是什么?请注意,未选中的复选框不会传输数据。
  • @Heru-Luin :现在,即使是 cheked 也不会传输数据。而且我不能检查我的名字属性,因为我不能发布它们中的任何一个(或者可能存在另一种方法)?
  • 只需在页面上查看源代码并打开表单...使用您发布的代码,您的输入可能看起来像&lt;input type="checkbox" name="chk[]" /&gt; &lt;input type="checkbox" name="chk[/$t[datetr]/$t[beneficiaire]/$t[objet]/$t[montant]]" /&gt; 取决于是否启用了 PHP 短开始标签或您的错误捕获级别。

标签: php html post


【解决方案1】:

除了关于未通过 HTTP 请求传递的未选中框的其他(完全准确的)cmets - 您的实际 PHP 存在一些问题。

<?echo '/'.'$t[datetr]'.'/'.'$t[beneficiaire]'.'/'.'$t[objet]'.'/'.'$t[montant]';?>

首先,你的回声是错误的;它可能应该是&lt;?php echo&lt;?= 而不是&lt;?echo(尽管这可能适用于短开始标签启用)。

其次,PHP 中的撇号是非插值字符串文字(即 '$t[objet]' 将被视为字符串 '$t[objet]' 而不是变量)。

最后,假设$t 是一个数组,您的关联索引需要有引号,否则它们将被解释为常量——这可能会引发错误。


我认为你想要的可以写成:

<?= "/{$t['datetr']}/{$t['beneficiaire']}/{$t['objet']}/{$t['montant']}"; ?>

一旦你解决了这个问题,$_POST['chk'] 数据应该被正确设置,它将是一个你所期望的关联数组。

然后foreach($_POST['chk'] as $key =&gt; $value) { ... } 循环应该可以工作...当然,您的输入目前实际上都没有 值。

【讨论】:

    【解决方案2】:

    当使用&lt;input type="checkbox" name="foo" value="42"/&gt; 时,变量 foo=42 仅在复选框被选中时发送。如果不选中该框,则根本不会发送任何内容。

    如果您需要一些 0/1 信息,我建议您使用 &lt;select&gt; 或几个 &lt;input type="radio"&gt; 标签代替:

    <input type="radio" name="foo" value="1"/> Yes
    <input type="radio" name="foo" value="0"/> No
    

    【讨论】:

      【解决方案3】:

      空白复选框不会发布到接收脚本,只有选中的才会发布。为了解决这个问题,有一组相应的隐藏字段,并根据单击复选框的方式将它们的值设置为“ON”或“OFF”。您可能想要使用 onClick 事件,确定是否单击了框,然后设置适当的隐藏字段,即 Checkbox_One Hidden_​​One Checkbox_Two Hidden_​​Two 等。 当您发布表单时,让您的脚本忽略复选框,只处理隐藏字段。

      【讨论】:

        【解决方案4】:

        执行这些多复选框时要记住的是,当您提交时,它将在 PHP 中解释为一个数组,在您的情况下,$_POST['chk'] 将是一个选中复选框的数组。

        但是,您还应该确保为复选框指定一个值,即使只是 1

        在处理您的 POST 时,最初只需尝试使用 var_dump($_POST); die(); 来查看数据的样子。

        【讨论】:

          【解决方案5】:

          使用下面的代码:

          foreach ($_POST['chk'] as $key => $value) {
                  echo "<tr>";
                  echo "<td>";
                  echo $key;
                  echo "</td>";
                  echo "<td>";
                  echo $value;
                  echo "</td>";
                  echo "</tr>";
              }
          

          【讨论】:

          • 你只是漏掉了$_POST中的复选框名称
          【解决方案6】:

          如果您将所有复选框命名为 name="boxArray[]",它将在提交表单时创建一个名为 $_POST["boxArray"] 的数组。

          然后您可以执行 foreach 循环来显示值:

          foreach ($_POST["boxArray"] as $item) {
                  echo "<tr>";
                  echo "<td>";
                  echo $item;
                  echo "</td>";
                  echo "</tr>";
              }

          添加到此,如果您只想删除选中的项目,则为每个复选框分配记录的 ID 作为其值:

          <input type="checkbox" name="boxArray[]" value="RECORD ID">
          

          现在,当您运行 foreach 循环时,只有选中的框会发布值,因此您可以更改代码以删除数组中的每个项目:

          foreach ($_POST["boxArray"] as $item) {
                 //SQL TO DELETE RECORD WHERE ID = $item;
              }
          

          【讨论】:

          • 感谢您的回答。我可以在 [ ] 中添加一些参数吗?
          • 您可以为每个复选框添加一个唯一键,以便 name="boxArray['colour']" value="blue" 将具有 $key = "color" 和 $value = "blue" 。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-24
          • 2014-12-03
          • 1970-01-01
          • 2013-11-09
          • 1970-01-01
          • 2013-03-26
          相关资源
          最近更新 更多