如何在PHP中创建一个漂亮的“日期选择器”?

时间:2010-11-11 12:40:22

标签: php javascript datetime datepicker

我正在做一些MySQL和PHP的实验,我很想创建一个不错的“日期选择器”,例如选择日期2010-11-11(今天的日期)。

我想在我的MySQL数据库中存储有效的DATETIME值,我想要一个PHP页面为天提供滚动列表(例如2010-11-11)以避免强迫用户在表单中手动编写日期然后进行检查。

我的问题是,让我们说用户选择日期2010-11-31(不存在);如何创建简单的滚动列表以便动态调整?也就是说,用户FIRST选择年份,然后是月份,最后是当天(动态改变以适应给定月份中的实际天数)。希望闰年也将得到照顾。在全部选择并且用户按下提交后,脚本将向数据库提交格式正确的DATETIME值(例如YYYY-MM-DD或YYYYMMDD)。

据我所知,DATETIME类型是严格的标准,这意味着服务器将跟踪无效日期,这应该足够容易进行错误检查。但我想通过做上面描述的事情来避免这种情况。

您是否只使用PHP(和MySQL)轻松实现我所描述的“解决方案”?或者我需要一些其他东西(例如AJAX / JavaScript,JQuery等)来管理它?任何建议和指示都是非常受欢迎的,尤其是可能更容易实现的同一问题的替代方法。提前谢谢!

5 个答案:

答案 0 :(得分:8)

已经有很多基于JavaScript的日历小部件。如果您不想为了学习目的而这样做,没有理由重新发明轮子。

服务器端验证当然仍然是强制性的,但是这些小部件将使用户无法在正常情况下选择无效日期。

E.g。

答案 1 :(得分:3)

你正试图在这里解决客户端问题服务器端imho,虽然验证永远不会被省略服务器端。

但是无效的日期,作为你的例子,确实不是问题,因为你可以使用strtotime很好地吃大多数日期。当然,在这种情况下,它将评估到12月1日,但无论如何都是有效的日期。您可以使用strtotimedate的输出以数据库友好的方式对其进行格式化。

为了更进一步,如果您想确保输入的日期不仅正式有效,您可以使用strtotime解析它,使用date格式将其格式化为发送到你的脚本并比较两个字符串。如果不相同,你就会知道出了什么问题。

根据你的例子:

$datePosted = '2010-11-31';    
$fromClient = date('Y-m-d', strtotime($datePosted));

// $fromClient == '2010-12-01' 

if (strcmp($datePosted, $fromClient) != 0) {
  // Invalid date posted
} else {
  // All is well on the western front
}

您可能也对使用较新版本的PHP提供的DateTime类感兴趣。

答案 2 :(得分:2)

不应该使用Ajax。 Ajax回调服务器,但服务器不再了解有效日期而不是客户端,所以这一切都可以在javascript中完成。如果您已经在使用jQuery,请使用jQuery插件,但不要为此加载整个jQuery库:这太过分了。有很多轻量级的日期选择器。您想要做的就是重新加载有人更改月/年的可用天数(请记住二月:您还需要重新加载年份更改)。

我们已经完成了一个方法,其中包括星期几的名称和日期:

function OnMonthYearChange(name) {
    var week = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
    var year = document.getElementById(name + '-year');
    var mon  = document.getElementById(name + '-mon');
    var mday = document.getElementById(name + '-mday');
    if ((mon.value  == '') || (year.value == '')) {
        return;
    }

    var date = new Date();
    date.setYear(year.value);
    date.setMonth(mon.value);
    var l = getDaysInMonth(year.value, mon.value);
    var day = mday.value;

    clearSelect(mday);
    var w = 0;
    for (i = 0; i < l; i++) {
        date.setFullYear(year.value, mon.value - 1, i + 1);
        w = date.getDay();
        var o = document.createElement('option');
        o.value = getLeadingZero(i + 1);
        o.text = o.value + ' - ' + week[w];
        //alert(o.text);
        if (i == (day - 1)) o.selected = true;
        if (app.IsIE) {
            mday.add(o);
        } else {
            mday.options.add(o);
        }
    }
}
function getDaysInMonth(year, month) {
    var m = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    if (month != 2) return m[month - 1];
    if (year % 4 != 0) return m[1];
    if (year % 100 == 0 && year % 400 != 0) return m[1];
    return m[1] + 1;
}
function clearSelect(e) {
    var first = e.options[0].innerHTML;
    if (first) {
        // Form does not allow selection of a blank date. Drop all existing options.
        e.options.length = 0;
    } else {
        // Form allows selection of a blank date. First option is blank. Keep it.
        e.options.length = 1;
    }
}
function getLeadingZero(n) {
    if (n < 10) n = '0' + n;
    return n;
}

请参阅http://www.mattkruse.com/javascript/calendarpopup/了解其他方法,该方法会弹出日历。可以将两者集成在一起,将弹出日历中的结果反馈到选择框中。

请记住,人们可以禁用javascript并在客户端执行各种奇怪的操作,因此服务器端验证仍然很重要。

答案 3 :(得分:1)

jQuery和另一个可以完成工作的JavaScript框架。

答案 4 :(得分:1)

你做不到。你需要一个客户端解决方案。

PHP处理数据处理,因此您将拥有一个由JavaScript驱动的日期选择器,用户可以在其中选择日期,然后您可以在提交表单时将PHP保存在数据库中的所选日期。 / p>