多选字段仅提交最后选择的选项

Posted

技术标签:

【中文标题】多选字段仅提交最后选择的选项【英文标题】:Multiple select field only submitting last selected option 【发布时间】:2017-10-28 15:17:30 【问题描述】:

我创建了一个表单,其中一些字段是多项选择,但是在提交表单后,只有在进行多项选择的字段中的最终选择被插入到 mysql 中。我不知道该怎么办。我是 mysql 和 php 的新手,所以我需要保持简单。先感谢您。

这是我的代码:

if(isset($_POST['add']))
    $dbhost = 'xxxxxxx';
    $dbuser = 'xxxxxxx';
    $dbpass = 'xxxxxxx';
    $conn = mysql_connect($dbhost, $dbuser, $dbpass);
    if(! $conn )
        die('Could not connect: ' . mysql_error());
    

    if(! get_magic_quotes_gpc() )
        $TypeOfDwelling = addslashes ($_POST['TypeOfDwelling']);
        $EmailAdd = addslashes ($_POST['EmailAdd']);
    else
        $TypeOfDwelling = $_POST['TypeOfDwelling'];
        $EmailAdd = $_POST['EmailAdd'];
    
    $sql = "
    INSERT INTO zzzzDB 
    ( TypeOfDwelling
    , EmailAdd
    , CreateDate) VALUES
    ('$TypeOfDwelling'
    ,'$EmailAdd'
    , NOW())
    ";
    mysql_select_db('xxxxx_xxxxx');
    $retval = mysql_query( $sql, $conn );
    if(! $retval )
        die('Could not enter data: ' . mysql_error());
    
    echo '<img src="../../../images/content__images/image_480x320_a.jpg"    class="img-responsive">'; 
    echo "<br />Thank you for your submission!";
    mysql_close($conn);
    ?>

    <form name="MLSrequest" action="<?php $_PHP_SELF ?>" method="post" class="form-inline" role="form">
        <table  cellspacing="0" cellpadding="0" border="0" align="left">
            <tbody>
                <tr>
                    <td>
                        <input type="hidden" name="recipient" value="xxx@xxx.ca">          
                    </td>
                </tr>
                <tr>
                    <td colspan="2"> <div class="form-group">
                        <label class="sr-only" for="TypeOfDwelling">Select The Type Of Dwelling</label>
                        <select name="TypeOfDwelling" size="5" class="form-control form-control-lg" id="TypeOfDwelling" multiple="multiple">
                            <option selected>Select DWELLING TYPE.</option>
                            <option value="1">1</option>
                            <option value="2">2</option>
                            <option value="3">3</option>
                            <option value="4">4</option>
                         </select>
                     </div>
                     </td>
                 </tr>
                 <tr>
                     <td colspan="2">
                         <div class="form-group">
                             <label class="sr-only" for="EmailAdd">Email Address</label>
                             <input name="EmailAdd" type="email" class="form-control form-control-lg" id="EmailAdd" size="17px" maxlength="30" placeholder="Email Address" required>
                         </div>  
                     </td>
                 </tr>
                     <td colspan="2">
                         <button name="add" id="add" type="submit" class="btn btn-primary">Submit Request</button>          
                     </td>
                 </tr>
            </tbody>
        </table>
    </form>
<?php

【问题讨论】:

作为单独的建议,出于安全原因,我建议您停止使用 mysql() 函数并升级到 mysqli 的准备好的语句或 pdo。此外,您可能要考虑不要在 Select DWELLING TYPE. 上使用 selected,因为如果您的用户不取消选择它,那么选项值将与提交一起发送。 另外,在编辑您的问题时,我注意到您有一些额外的和缺少的 html 标签。具体来说,我发现了一个额外的&lt;/div&gt; 和一个缺失的&lt;tr&gt;。最后我担心你写了一段自相矛盾的代码,开头的 isset() 条件需要$_POST["add"] 才能进入代码块。代码块内的表单 POST add 键控元素。 ...它发布的方式看起来你永远不会进入条件。我希望这一切对你有帮助,并且我没有让你超负荷。 【参考方案1】:

这里是诀窍,你需要将选择标签的名称属性值设置为这样的数组:

<select name="TypeOfDwelling[]" multiple>

通过这样做,您将为提交期间要存储的所有选定值提供一个“适当的容器”。

这将为您提供 $_POST 数组中的一个元素,如下所示:

$_POST["TypeOfDwelling"]=array(....);

如果您不使用方括号,那么 TypeOfDwelling 中的每个后续值都会覆盖之前的值,正如您所注意到的。


让我用GET形式的情况来解释一下……

假设这是你的表单:

<form action="">
  <select name="multi" multiple>
      <option>1</option>
      <option>2</option>
      <option>3</option>
      <option>4</option>
  </select>
  <button>Submit</button>
</form>

如果您选择选项 2 和 4 然后提交,您会在 url 末尾看到一个查询字符串:?multi=2&amp;multi=4 如果您写的是var_export($_GET["multi"]),您会看到4

如果您改为使用 multi[] 作为名称属性值,选择选项 2 和 4,然后提交,您将看到以下查询字符串:?multi%5B%5D=2&amp;multi%5B%5D=4 %5B%5D[] 的 url 编码版本。如果你写了var_export($_GET["multi"]),你会看到array(0=&gt;'2',1=&gt;'4')


现在,就您的实现而言,您需要先处理此数据数组,然后才能将其添加到查询中。您将需要决定是要插入多行数据还是用逗号分隔值。如果您只想用逗号分隔值,则可以使用 implode(',',$_POST["TypeOfDwelling"]) 将值数组缩减为字符串。关于这个问题的正确决定超出了这个问题的范围,但你肯定可以通过一些搜索找到关于这个主题的一些好的页面。

简短的回答是,您可以在为查询声明变量时将它们内爆。

// in there respective locations...

$TypeOfDwelling = addslashes(implode(',',$_POST['TypeOfDwelling']));

// and

$TypeOfDwelling = implode(',',$_POST["TypeOfDwelling"]);

如果我有更多的时间,我会给你更全面的帮助,但是现在,请立即用 mysqli 研究准备好的语句——这是必要的。

【讨论】:

感谢 Mickmackusa 的帮助! 感谢 Mickmackusa 的帮助!我把 $_POST["TypeOfDwelling"]=array(....);是的,我想使用 implode 来处理数组我只需要关于在哪里拍它的指导,因为我对代码 implode(',',$_POST["TypeOfDwelling"]) 有基本的了解 @MartinCIok 如果我的回答解决了您的问题,请给我的回答打上绿色的勾,这样这个问题就被视为已解决。

以上是关于多选字段仅提交最后选择的选项的主要内容,如果未能解决你的问题,请参考以下文章

如何使复选框作为多选选项?

仅从选定的单选按钮选项提交表单数据

完成选择时的jQuery多选事件

仅提交所选项目的值

Dynamics 365 V9.0 多选选项集之组织服务查询数据过滤及字段赋值

php ACF |从多选字段中获取所有选定的选项。