php HTML5日期输入,保存到MySQL数据库

gev0vcfq  于 2023-02-15  发布在  PHP
关注(0)|答案(5)|浏览(166)

我遇到了一点麻烦,似乎找不到任何可靠的答案。但我希望有人能帮助我。
我有一个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'];?>
jhdbpxl9

jhdbpxl91#

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

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

此函数将显示MySQL日期-时间格式。

idfiyjo8

idfiyjo82#

我认为您的问题出在strtetime()上,让我们将该行替换为以下代码:

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

oxf4rvwz3#

注意,stringToTime()返回一个Unix时间戳(即从1970年1月1日00:00:00 UTC开始的秒数),这可能不是数据库所期望的。
请记住,* presentational * 值可能因浏览器和用户的区域设置而异,但提交的 * actual * 值应为"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');?>
tvmytwxo

tvmytwxo4#

根据我的经验,很多问题都归结为服务器上的区域设置。
PHP可能会将dd/mm/yyyy识别为mm/dd/yyyy,如果日期部分无效,则会出现fit。要使PHP正确验证日期为dd/mm/yyyy,请在以下情况下将/替换为-(dd-mm-yyyy)

$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;
    }

}

编辑:以防遗漏......确保在进入DB时将其转换为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
fcy6dtqo

fcy6dtqo5#

使用SQL设置正确的格式:

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

把它拿回来

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

相关问题