【问题标题】:Combine multiple fields to one value for form submission将多个字段合并为一个值以进行表单提交
【发布时间】:2010-06-23 15:00:29
【问题描述】:

my earlier question继续,我如何将月、日和年<select>s 组合成一个“日期”值,以便它到达我的 PHP 脚本

$_POST['date'], MySQL 格式YYYY-MM-DD?

【问题讨论】:

    标签: php javascript html forms


    【解决方案1】:

    你可以使用隐藏字段并在提交时建立​​它的值,但如果我是你,我会简单地在 name 属性中使用数组表示法,并用“-”作为胶水来内爆数组:像这样

    <select name="date[year]">
    ...
    <select name="date[month]">
    ...
    <select name="date[day]">
    ...
    

    php:

    $date = implode('-', $_POST['date'])
    //validate date format here
    

    【讨论】:

    • 我遇到了与原始海报相同的需求,但我避免将 php 脚本作为 CMS 的一部分。我将如何着手构建一个隐藏字段 onSubmit?
    • 在你的表单中创建一个隐藏输入,“日期”为name属性,然后编写一个js函数,获取三个选择的值,并将其注入到隐藏的value属性中输入,最后返回true,然后将其绑定到表单的提交事件。
    【解决方案2】:

    将它结合到您的 PHP 脚本中,没有理由为此添加对 JavaScript 的依赖。 Build on things that work。此外,如果您在服务器上执行此操作,则不会受到那么多潜在的恶意或意外干扰。

    【讨论】:

    • 嗯,该项目已经(必然)依赖于 JavaScript,并且没有办法绕过它。
    【解决方案3】:

    如果你想这样做,我建议你采取以下步骤:

    1. 编写您的 HTML 页面,这样即使没有 JS 也有意义 - 有一个普通的 &lt;input type="text" name="wtv" /&gt; 和一条指示预期格式的消息 YYYY-MM-DD
    2. 然后添加 JavaScript 以使 &lt;input type="text" name="wtv" /&gt; 变为 type="hidden";还添加三个 &lt;select&gt; 元素 - 一个代表日、月和年。不要给这些&lt;select&gt; 元素name 属性。
    3. 你需要一些 JS 来确保当用户选择不同的月份时,不可能的日期不会出现;因此,如果我在几个月内选择“二月”,则 28 日之后的日子不可用;但如果是闰年...
    4. onchange 事件处理程序添加到这三个&lt;select&gt; 元素,以便在修改它们时更改原始&lt;input type="hidden" name="wtv" /&gt; 的值以反映所选值。

    提交表单时,由于&lt;select&gt; 元素没有name 属性,因此它们的信息不会发送到服务器,但您隐藏的&lt;input /&gt; 确实有名称,因此将被发送, 格式为日期。

    实际上我以前写过这样的小部件...我会尝试建立一个演示页面并链接到它。

    【讨论】:

    • 不用担心 JS 支持。该应用需要JS开启。
    【解决方案4】:

    如果您执行以下操作,您可以获得您正在寻找的结果。

    <form method="post">
        <select name="date[]" id="year">
            <option>2010</option>
            <option>2011</option>
        </select>
        <select name="date[]" id="month">
            <option>8</option>
            <option>9</option>
        </select>
        <select name="date[]" id="day">
            <option>21</option>
            <option>22</option>
        </select>
        <input type="submit">
    </form>
    

    生成的$_POST var 包含以下内容

    Array
    (
        [date] => Array
            (
                [0] => 2011
                [1] => 9
                [2] => 22
            )
    )
    

    那么你需要做的就是$date = implode('-', $_POST['date']);

    【讨论】:

    • 好主意!但是,我需要在一个页面上有一堆这些,所以我需要明确指定索引:date[0][]date[1][] 等,这太复杂了,不值得。
    【解决方案5】:

    您可以创建一个隐藏字段,并在提交表单之前填写它

    【讨论】:

      【解决方案6】:

      单独收集这些数据的目的是确保其格式正确。如果您向 php 脚本提交完整的日期,则 php 脚本的验证选项会涉及更多。最好提交 3 个表单字段,以简单的方式验证它们,然后在 php 中创建日期。

      如果您坚持提交完整的日期,隐藏字段(如@kgb 所说)可能是最简单的方法。

      【讨论】:

        【解决方案7】:

        您可以使用 javascript 或 php 本身来执行此操作,但没有本地 xhtml 方法可以做到这一点(据我所知)。

        如果您使用 javascript 来实现这一点(使用隐藏字段将数据提交到您的 php 脚本),您仍然需要在使用 php 处理或将数据插入数据库之前验证服务器端的字段。出于这个原因,我将跳过 javascript 选项,直接使用我将使用的 php 方法。

        我假设数字数据形式为 dd 表示日期,mm 表示月份,yyyy 表示年份:

        $day = $_POST['day']; // assume 23
        $month = $_POST['month']; // assume 06
        $year = $_POST['year']; // assume 2010
        
        $mysql_date_format = $year . "-" . $month . "-" . $day; // should result in 2010-06-23
        

        根据需要在脚本中使用$mysql_date_format

        【讨论】:

          【解决方案8】:

          我从您的原始帖子中注意到,您首先使用 jQuery 的 Datepicker() 插件来获取日期。为什么不直接将default date format 设置为'yy-mm-dd'

          如果您想在获取到 PHP 时验证格式,请使用

          date('Y-m-d', strtotime($_POST['date']));
          

          【讨论】:

          • 不,我使用任何插件。除此之外,我查看这个的原因是因为 Safari 无法正确解析 YY-MM-DD 或 YYYY-MM-DD。
          • 我假设你是因为你提到这是对上一个问题的后续问题,在该问题中你询问的是 Datepicker 插件。我为混乱道歉。另外,作为提醒,上周我发现如果月份是数字的,IE 很难处理日期(2010-06-23 vs. 2010-Jun-23)。
          猜你喜欢
          • 2017-05-07
          • 1970-01-01
          • 1970-01-01
          • 2023-01-12
          • 1970-01-01
          • 2021-10-06
          • 2021-05-18
          • 1970-01-01
          • 2011-04-17
          相关资源
          最近更新 更多