【问题标题】:Only values of one form of many get send只有一种形式的值才能发送
【发布时间】:2016-02-16 16:44:17
【问题描述】:

我正在创建一个搜索界面,让用户从包含 1 到 500 行的表格中选择一行,并找到与所选条目相似的条目。

现在,我对每一行都有一个复选框形式,并直接在 php 中获取值。

index.php 的一部分

<table>
<tr><!-- several tds -->
    <td><form action="pfile.php" name="findsimilar1" method="post">
        <input type="checkbox" name="color" value="red">
        <!-- several more checkboxes with attributes -->
        <input type="checkbox" name="darkness" value="8">
        <input type="submit" name="submit_b">
   </form></td></tr>
<tr><!-- several tds-->
    <td><form action="pfile.php" name="findsimilar2" method="post">
        <input type="checkbox" name="color" value="blue">
        <!-- several more checkboxes with attributes -->
        <input type="checkbox" name="darkness" value="2">
        <input type="submit" name="submit_b">
    </form></td></tr>
<tr><!-- several tds-->
    <td><form action="pfile.php" name="findsimilar3" method="post">
        <input type="checkbox" name="color" value="green">
        <!-- several more checkboxes with attributes -->
        <input type="checkbox" name="darkness" value="5">
        <input type="submit" name="submit_b">
    </form></td></tr></table>

pfile.php 的一部分:

if(isset($_POST['submit_b'])){
    if(isset($_POST['color'])){
        $c = $_POST['color'];
    }
if(isset($_POST['darkness'])){
        $d = $_POST['darkness'];
    }
}

但只有第一个/最后一个条目的值被发送。我已经 - 在阅读了类似问题的答案之后 - 通过将行号附加到名称来将表单的名称更改为唯一,但这不会改变行为。

用户可以点击所有、一个或几个复选框。

我只希望发送单击其按钮的表单的值。 php 版本:5.3.3 浏览器:Firefox ESR 38.6.0

任何指向正确方向或我可能错过的指针?

Jquery 可能是更好的选择吗?


编辑:

  • 添加了 'method="post"'
  • 澄清了许多复选框并且没有强制性

【问题讨论】:

  • @JonStirling 是对的,我认为您必须告诉我们,如果您的 php 中只需要一种 color 和一种 darkness 或多个值。
  • 他不是说“我只想要发送按钮被点击的表单的值”吗?因此,只应发送 1 个 TR 的形式:2 项“颜色”和“黑暗”。
  • @hherger 你是对的。显然没有引起足够的重视。评论已删除。
  • 所以...他应该使用一个带有单选框的表单来表示颜色并禁用复选框来表示黑暗,只有选择了正确的颜色才会启用。
  • 但是如何向服务器发送数据呢?如果只是通过单击按钮提交表单,而不涉及任何 javascript,那么您所说的不应该发生。实际上,您发送的是 GET 请求,而不是 POST,但这与您所说的相矛盾,所以很难知道您的问题是什么......

标签: php jquery forms post


【解决方案1】:

要么添加method="POST"
(你的桌子有点美化了)

<table>
<tr><th style="text-align:left">color</th><th>darkness</th><th> </th></tr>
<tr><!-- several tds -->
    <form action="pfile.php" name="findsimilar1" method="POST">
        <td><input type="checkbox" name="color" value="red">red</input></td>
        <td><input type="checkbox" name="darkness" value="8">active</input></td>
        <td><input type="submit" name="submit_b" /></td>
   </form>
</tr>
<tr><!-- several tds-->
    <form action="pfile.php" name="findsimilar2">
        <td><input type="checkbox" name="color" value="blue">blue</input></td>
        <td><input type="checkbox" name="darkness" value="2">active</input></td>
        <td><input type="submit" name="submit_b" /></td>
    </form>
</tr>
<tr><!-- several tds-->
    <form action="pfile.php" name="findsimilar3">
        <td><input type="checkbox" name="color" value="green">green</input></td>
        <td><input type="checkbox" name="darkness" value="5">active</input></td>
        <td><input type="submit" name="submit_b" /></td>
    </form>
</tr>
</table>

...或将 $_POST 更改为 $_REQUEST(涵盖 GET 和 POST 方法)
顺便说一句:始终初始化变量,如果您以后访问,请不要让它们“取消设置”他们。

if(isset($_REQUEST['submit_b'])){
    $color    = isset($_REQUEST['color'])    ? $_REQUEST['color']    : false;
    $darkness = isset($_REQUEST['darkness']) ? $_REQUEST['darkness'] : false;
    if ($color !== false) && ($darkness !== false) {
        // Do anything...
    }
} else {
    // Nothing to do...
}

【讨论】:

  • 我用的是post,我忘了把它添加为表格属性,现在正在编辑。
  • 哦,method="POST" 不是表格属性,而是FORM 属性。我的 php 代码同时接受 GET 和 POST,因为我使用 $_REQUEST 变量而不是 $_GET 或 $_POST!在 html 代码中只有一个表单现在发送 POST 变量!
  • 我今天马虎了——当然是表单属性,所有表单都有,在帖子中更新。
【解决方案2】:

使用 jQuery 你也可以在 this new fiddle

上进行测试

HTML 和 JS

<form action="pfile.php" method="post" id="findsimilar">
    <table>
    <tr>
        <td>
            <input type="checkbox" name="ckColor" value="red">
            <input type="checkbox" name="ckDarkness" value="8">
        </td>
    </tr>
    <tr>
        <td>
            <input type="checkbox" name="ckColor" value="blue">
            <input type="checkbox" name="ckDarkness" value="2">
        </td>
    </tr>
    <tr>
        <td>
            <input type="checkbox" name="ckColor" value="green">
            <input type="checkbox" name="ckDarkness" value="5">
        </td>
    </tr>
    </table>
    <input type="hidden" name="color" />
    <input type="hidden" name="darkness" />
    <input type="submit" name="submit_b">
</form>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<script type="text/javascript">
var chkDarkness= $('#findsimilar input[name="ckDarkness"]');
var chkColors=$('#findsimilar input[name="ckColor"]');
var getGolor=$('input[name="color"]');
var getDarkness=$('input[name="darkness"]');

chkColors.on('click',function(){
    var el=$(this);
    var elDark=el.parent().find('input[name="ckDarkness"]');
    chkDarkness.not(elDark).prop('checked',false);
    if (el.is(':checked')){
        chkColors.not(el).prop('checked',false);
        getGolor.val(el.val());
        if (!elDark.is(':checked'))
           getDarkness.val('');
    } else {
       getGolor.val('');
       if (!elDark.is(':checked'))
           getDarkness.val('');

    }
});

chkDarkness.on('click',function(){
    var el=$(this);
    var elCol=el.parent().find('input[name="ckColor"]');
    getDarkness.val('');
    chkDarkness.not(el).prop('checked',false);
    chkColors.not(elCol).prop('checked',false);
    if (el.is(':checked'))
       getDarkness.val(el.val());
       if (!elCol.is(':checked'))
           getGolor.val('');

})
</script>

PHP

if(isset($_POST['submit_b'])){
    if(isset($_POST['color']))
        $c = $_POST['color'];

    if(isset($_POST['darkness']))
        $d = $_POST['darkness']
}

【讨论】:

  • 我不确定您的解决方案是否正常。将传输哪个复选框“颜色”和“暗度”值?而且,顺便说一句,OA 说“我只希望发送单击其按钮的表单的值”。
  • “强制性”是什么意思?这是一个复选框 - 选中或不选中。
  • 我知道,但至少需要一个吗?
  • 任何复选框都不是强制性的,只要您至少选中一个复选框即可。复选框的实际数量不固定,现在有8个,用户可以任意选择。
  • 但我仍然必须先检查颜色 - 如果我只想找到具有相同“暗度”值的条目怎么办?
猜你喜欢
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多