我正在做一些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等)来管理它?任何建议和指示都是非常受欢迎的,尤其是可能更容易实现的同一问题的替代方法。提前谢谢!
答案 0 :(得分:8)
已经有很多基于JavaScript的日历小部件。如果您不想为了学习目的而这样做,没有理由重新发明轮子。
服务器端验证当然仍然是强制性的,但是这些小部件将使用户无法在正常情况下选择无效日期。
E.g。
答案 1 :(得分:3)
你正试图在这里解决客户端问题服务器端imho,虽然验证永远不会被省略服务器端。
但是无效的日期,作为你的例子,确实不是问题,因为你可以使用strtotime
很好地吃大多数日期。当然,在这种情况下,它将评估到12月1日,但无论如何都是有效的日期。您可以使用strtotime
和date
的输出以数据库友好的方式对其进行格式化。
为了更进一步,如果您想确保输入的日期不仅正式有效,您可以使用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>