【问题标题】:Making a checkbox recognize its intended data使复选框识别其预期数据
【发布时间】:2011-01-11 10:56:38
【问题描述】:

级别:PHP 学习者

我遇到了复选框问题。我有一个包含名称和唯一 ID 号的数据库。

使用查询,我正在提取学生的选择,并在表单上的超简单 HTML 表格中向用户展示他们。每行都以一个复选框开头。方法是 POST。到目前为止,一切都很好。我的桌子是这样的:

+-----------+----------+----------+
|   SELECT  |    NAME  |    ID    |
+-----------+----------+----------+
|   []      |    John  |    2233  |
+-----------+----------+----------+
|   []      |    Susie |    5577  |
+-----------+----------+----------+

[-SUBMIT-]

我的问题是我似乎无法使复选框与每条记录的唯一 ID 相关联。用户选择行并单击提交后,$_POST 数组保持为空。

我的初学者书籍都没有提到这个特定问题。他们通过不涉及与数据库中的行交互的“常规”复选框例程。我在 Stackoverflow 上也找不到解决此问题的问题。还尝试了谷歌:复选框上有很多东西,但我找不到任何可以帮助我解决这个问题的东西。

【问题讨论】:

    标签: php mysql checkbox html-table


    【解决方案1】:

    只要做这样的事情:

    <input type="checkbox" name="ids[]" value="2233" /> ... rest of row
    <input type="checkbox" name="ids[]" value="5577" /> ... rest of row
    

    现在,在 PHP 中,您可以像这样获取选定的ids

    $ids = $_POST['ids'];
    if( empty($ids) ) $ids = array();
    

    如果提交表单时未选中任何复选框,则这会将 $ids 设置为空数组。

    【讨论】:

    • [] 需要变为 Array() (或者这是我不知道的 PHP 表示法)。而 PHP,不像 Javascript 有 or :D
    • 哈哈,是的,那是一种我喜欢称之为“PHPRubyScript”的特殊语言 :) 感谢您发现这些错误。
    • 大声笑..我的回答有明显的问题,我没有得到任何反对意见。我修复了它们,没有评论就被否决了。
    • 谢谢你,道格。恐怕您的建议中的 PHP 部分有点超出我的想象,但我会一直使用它,直到我理解为止。
    • 嘿,没问题。它只是给你一个带有 id 的 PHP 数组。例如,如果两者都被选中,它会给你相当于$ids = array(2233, 5577)
    【解决方案2】:

    编辑:如果您的表单没有像您描述的那样变得更复杂,请采用 Doug Neiner 的方法,因为它更简单。如果一个表可能有很多列,这种方法是正确的。

    我喜欢这样做:

    按顺序为复选框编号(1 到 100)并添加一个隐藏字段,将行号连接到真实的数据库 ID:

    <input type="checkbox" name="row_1" value="checked">`
    <input type='hidden' name='row_1_id' value='2233'>`
    

    将总行数存储在另一个隐藏字段中

    &lt;input type='hidden' name='row_total' value='99'&gt;

    然后,在接收脚本中,使用for从1迭代到总行数,检查该行是否被选中,并获取关联的数据库ID:

    for ($i = 1; $i <= $number_of_rows; $i++)
    {
      if ($_POST["row_$i"] == "checked")
       {
         $database_id_unsafe = $_POST["row_{$i}_id"];
     ...
    

    当然,后者需要经过适当的消毒和转义,以防进一步处理。

    【讨论】:

    • +1 很好,您可以使用 &lt;input type="checkbox" name="row[2223]" value="checked" /&gt;&lt;input type="hidden" name="row[2223]" value="not_checked" /&gt; 跳过测试,然后无论是否提交了复选框,都会提交该值。然后,您只需使用 $key =&gt; $value 对迭代返回的 row 参数,您将拥有 ID 和选中/未选中状态。还是我又在想 Ruby 了 :)
    • 有趣的想法。我现在无法测试它,但听起来它可以工作!
    • 谢谢,佩卡。是的,字段的实际数量可能会大幅增长。我将尝试实现这个概念。
    猜你喜欢
    • 1970-01-01
    • 2019-06-20
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 2015-02-16
    • 1970-01-01
    相关资源
    最近更新 更多