【问题标题】:HTML5 date input, saving to MySQL databaseHTML5 日期输入,保存到 MySQL 数据库
【发布时间】:2014-11-19 03:53:02
【问题描述】:

我遇到了一些麻烦,似乎找不到任何可靠的答案。但是希望有人可以提供帮助。

我有一个获取选定日期的 HTML5 输入表单

<input type="date" name="launch_date" />

这会调出日期选择器,并在 dd/mm/yy 中输入日期

我正在尝试将其保存到 SQL 数据库中,该数据库使用表中的 DATE 类型。所以首先我制作所有表单输入的变量

$launch_date = $_POST['launch_date'];

然后我尝试将字符串转换为适当的时间戳,以便它可以在数据库中被接受。

然后作为 SQL INSERT/UPDATE 查询的一部分将所有变量添加到正确的列中。

$launch_date = strtotime($launch_date);

不过,每当我查看数据库时,它总是显示 0000-00-00,就像它期待 YYYY-MM-DD 格式一样。

如何才能让前端输入的日期是DD-MM-YYYY,但在数据库中正确存储为YYYY-MM-DD?

更新

好的,所以我想我试图让它变得过于复杂。通过使用 HTML5 日期输入,并将该输入直接保存到数据库中的 DATA 类型列中,将其保存为 YYY-MM-DD。似乎工作正常。

当我回显这些值时,它将输出例如 2014-09-24。我怎样才能让它显示 24-09-2014?

<?php echo $row['start_date'];?>

【问题讨论】:

  • 如果它作为日期存储在数据库中,则存储正确。格式仅在您显示数据时很重要。
  • 但是它没有将它存储在数据库中,它显示为0000-00-00
  • 数据库列类型是什么?
  • 列类型为DATE
  • 对不起,我明白了你的意思。只有从数据库中拉回需要格式化。

标签: php mysql sql html date


【解决方案1】:

使用 SQL 设置正确的格式:

.... VALUES (STR_TO_DATE('24-09-2014', '%d-%m-%Y'))

找回来

SELECT DATE_FORMAT(datefield, '%d-%m-%Y') FROM ......

【讨论】:

    【解决方案2】:

    根据我的经验,很多问题都归结为服务器上的区域设置。

    PHP 可能会将 dd/mm/yyyy 识别为 mm/dd/yyyy 并且如果日期部分无效,则可以进行匹配。为了让 PHP 正确验证日期为 dd/mm/yyyy,请将 / 换成 - (dd-mm-yyyy) when

    $launch_date = $_POST['launch_date'];
    $launch_date = str_replace("/", "-", $launch_date);
    $launch_date = strtotime($launch_date);
    

    这只是一个快速破解,看看是否是这种情况。如果没有,那么我建议至少在途中放入 var_dumps 以检查日期的格式是否正确。

    另一种方法是使用 date_create_from_format (http://php.net/manual/en/datetime.createfromformat.php) 解析日期以及要解析的格式。

    $launch_date = date_create_from_format('d/m/Y', $launch_date );
    

    我认为在 Windows PHP 上没有实现......所以如果你有麻烦,这里有一个功能实现

    if (!function_exists('date_parse_from_format')) {
    
        function date_parse_from_format($format, $date) {
            $returnArray = array('hour' => 0, 'minute' => 0, 'second' => 0,
                'month' => 0, 'day' => 0, 'year' => 0);
    
            $dateArray = array();
    
            // array of valid date codes with keys for the return array as the values
            $validDateTimeCode = array('Y' => 'year', 'y' => 'year',
                'm' => 'month', 'n' => 'month',
                'd' => 'day', 'j' => 'day',
                'H' => 'hour', 'G' => 'hour',
                'i' => 'minute', 's' => 'second');
    
            /* create an array of valid keys for the return array
             * in the order that they appear in $format
             */
            for ($i = 0; $i <= strlen($format) - 1; $i++) {
                $char = substr($format, $i, 1);
    
                if (array_key_exists($char, $validDateTimeCode)) {
                    $dateArray[$validDateTimeCode[$char]] = '';
                }
            }
    
            // create array of reg ex things for each date part
            $regExArray = array('.' => '\.', // escape the period
                // parse d first so we dont mangle the reg ex
                // day
                'd' => '(\d{2})',
                // year
                'Y' => '(\d{4})',
                'y' => '(\d{2})',
                // month
                'm' => '(\d{2})',
                'n' => '(\d{1,2})',
                // day
                'j' => '(\d{1,2})',
                // hour
                'H' => '(\d{2})',
                'G' => '(\d{1,2})',
                // minutes
                'i' => '(\d{2})',
                // seconds
                's' => '(\d{2})');
    
            // create a full reg ex string to parse the date with
            $regEx = str_replace(array_keys($regExArray), array_values($regExArray), $format);
    
            // Parse the date
            preg_match("#$regEx#", $date, $matches);
    
            // some checks...
            if (!is_array($matches) ||
                    $matches[0] != $date ||
                    sizeof($dateArray) != (sizeof($matches) - 1)) {
                return $returnArray;
            }
    
            // an iterator for the $matches array
            $i = 1;
    
            foreach ($dateArray AS $key => $value) {
                $dateArray[$key] = $matches[$i++];
    
                if (array_key_exists($key, $returnArray)) {
                    $returnArray[$key] = $dateArray[$key];
                }
            }
    
            return $returnArray;
        }
    
    }
    

    编辑:以防万一这被遗漏了...确保在进入数据库时​​将其转换为 YYYY-MM-DD:

    // Whatever you do to parse date into timestamp
    $launch_date_db = date("Y-m-d H:i:s", $launch_date)
    

    更新

    PHP 喜欢时间戳……所以就这样吧:

    $launch_date = strtotime($row['start_date']); // convert it into timestamp
    echo date('d-m-Y', $launch_date); // format timestamp
    
    【解决方案3】:

    它对我有用。请注意,stringToTime() 返回的 Unix 时间戳(即自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数)可能不是您的数据库所期望的。

    请记住,presentational 值可能会因浏览器和用户的区域设置而有所不同,但提交的 实际 值应该是 "A valid full-date as defined in [RFC 3339]"

    这是一个小演示:

    <?php 
    $launch_date = $_POST['launch_date'];
    echo '$launch_date = \''.$launch_date.'\' <br />';
    $launch_date = strtotime($launch_date);
    echo 'strtotime($launch_date) = \''.$launch_date.'\' '; //a unix timestamp eg '1410480000'
    ?>
    <form method="post">
    <input type="date" name="launch_date" />
    <input type="submit"/>
    </form>
    

    http://runnable.com/VCLkST-wq9cPvwJT/stackoverflow-com-questions-26020544-for-php

    更新

    进一步说明您的问题。您可以使用PHP's DateTime::format 格式化日期,如下所示:

    <?php echo date_format($row['start_date'], 'd-m-Y');?>
    

    【讨论】:

      【解决方案4】:

      我认为您的问题出在 strtotime() 上。 让我们用这个代替那行:

      list($day,$mon,$year) = explode('/', $launch_date);
      $launch_date = "$year-$mon-$day";
      

      【讨论】:

      • 在尝试处理时,我在这一行得到未定义的偏移量 0 和 1(列表...)
      • 这意味着您的错误来自“$launch_date = $_POST['launch_date'];”请检查您是否在表单中使用 POST 方法,并打印出 $_POST['launch_date'] 以查看您是否正确获取用户输入。编辑:我看到你写了你输入日期作为输入 dd/mm/yy,但在下面你说你想输入 DD-MM-YYYY。请确认您想要什么。在“explode('/',$launch_date)”中,我假设你使用的是 dd/mm/yyyy。
      • 我已经更新了我的问题,试图让它更简单
      • 您的更新仍然不清楚您使用的是哪种格式:dd/mm/yyyy 或 dd-mm-yyyy(/ 或 -)?关于你的最后一个问题(如何让它显示 24-09-2014),你可以使用 MySQL 格式化:DATE_FORMAT(start_date, "%d-%m-%Y")。
      • 注意您有两个问题:(1)格式化输入并放入数据库,以及(2)以您喜欢的格式再次显示来自数据库的数据。
      【解决方案5】:

      您可以在 JQuery 日期选择器本身中进行修改。

      $( "#launch_date" ).datepicker({
          dateFormat : 'yy-mm-dd'
      });
      

      这个函数会提供 MySQL 日期时间格式。

      【讨论】:

        猜你喜欢
        • 2018-11-19
        • 2016-12-19
        • 1970-01-01
        • 2017-02-03
        • 2011-12-15
        • 2015-04-25
        • 2019-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多