将PHP日期范围转换为MYSQL单个日期

将PHP日期范围转换为MYSQL单个日期,php,mysql,date,calendar,range,Php,Mysql,Date,Calendar,Range,我有一个可用性日历,当前我正在其中逐个添加日期,并使用mysql查询确定是否存在具有特定日期的行,并将当天的类别更改为“已预订”(红色) 我想在我的表单中输入一个范围,并通过php(或mysql)将其处理为多个单独的日期。我的日期格式是M/D/YYYY或MM/DD/YYYY,两者都可以接受。不幸的是,当我构建日历时,我没有使用sql中的日期格式作为条目,而是使用varchar 有没有办法进入我的表单,例如2014年1月1日-2014年1月3日,让php将其转换为2014年1月1日、2014年1月

我有一个可用性日历,当前我正在其中逐个添加日期,并使用mysql查询确定是否存在具有特定日期的行,并将当天的类别更改为“已预订”(红色)

我想在我的表单中输入一个范围,并通过php(或mysql)将其处理为多个单独的日期。我的日期格式是M/D/YYYY或MM/DD/YYYY,两者都可以接受。不幸的是,当我构建日历时,我没有使用sql中的日期格式作为条目,而是使用varchar

有没有办法进入我的表单,例如2014年1月1日-2014年1月3日,让php将其转换为2014年1月1日、2014年1月2日、2014年1月3日,然后使用mysql INSERT查询一次插入多个值

if (empty($_POST) === false && empty($errors) === true) {
$adcp_data = array(
'date'      => $_POST['date'],
'customer'  => $_POST['customer'],
'notes'     => $_POST['notes'],
            );
insert_adcp($adcp_data);
header('Location: adcp.php?success');
exit();
insert_adcp函数如下所示:

function insert_adcp ($adcp_data) {
    array_walk($adcp_data, 'array_sanitize');
    $fields = '`' . implode('`, `', array_keys($adcp_data)) . '`';
    $data = '\'' . implode('\', \'', $adcp_data) . '\'';

    mysql_query("INSERT INTO `adcp` ($fields) VALUES ($data)");
}

我的解决方法和最后手段是添加多个文本输入,只需手动添加多个日期,所以我只需提交一次。但是射程要快得多

最后一点,如果我能让这些多个条目将每个日期的“customer”和“notes”值保持在一个范围内,那将是令人惊讶的。我准备失去这些领域,虽然使这项工作。谢谢

类似于:

$day = new DateTime($_POST['range_start']);
$end = new DateTime($_POST['range_end']);

$all_dates = array();

while ($day <= $end){
  $all_dates[] = $day;
  $day->add(new DateInterval('P1D'));
}
$day=新日期时间($\u POST['range\u start']);
$end=新的日期时间($\u POST['range\u end']);
$all_dates=array();
而($day add(新的日期间隔('P1D'));
}
这将为您提供一个DateTime对象数组,每个对象表示您范围内的一天。您可以通过调用DateTime::format()并将“m/d/Y”作为格式字符串传递,将每个对象返回到字符串中

至于将多个条目插入MySQL,INSERT语法允许
插入表(列)值(row1),(row2),…(rowN)

(这显然没有经过测试,或者您将使用的最终代码——只是从内存中写入此web表单……您必须通过输入卫生和范围检查等正确地将其写出。)

类似于:

$day = new DateTime($_POST['range_start']);
$end = new DateTime($_POST['range_end']);

$all_dates = array();

while ($day <= $end){
  $all_dates[] = $day;
  $day->add(new DateInterval('P1D'));
}
$day=新日期时间($\u POST['range\u start']);
$end=新的日期时间($\u POST['range\u end']);
$all_dates=array();
而($day add(新的日期间隔('P1D'));
}
这将为您提供一个DateTime对象数组,每个对象表示您范围内的一天。您可以通过调用DateTime::format()并将“m/d/Y”作为格式字符串传递,将每个对象返回到字符串中

至于将多个条目插入MySQL,INSERT语法允许
插入表(列)值(row1),(row2),…(rowN)


(这显然没有经过测试,或者您将使用的最终代码——只是从内存写入此web表单……您必须使用输入卫生和范围检查等方法正确地写出它。)

检查输入值是否与您的范围格式匹配,捕获零件并生成从到日期的

if (preg_match('%\A(?<fromMonth>\d{1,2})/(?<fromDay>\d{1,2})/(?<fromYear>\d{4})-(?<toMonth>\d{1,2})/(?<toDay>\d{1,2})/(?<toYear>\d{4})\Z%', $str, $res)) {
    $dates['from'] = mktime(0, 0, 0, $res['fromMonth'], $res['fromDay'], $res['fromYear']);
    $dates['to']   = mktime(0, 0, 0, $res['toMonth'], $res['toDay'], $res['toYear']);
}
if(preg_match('%\A(?\d{1,2})/(?\d{1,2})/(?\d{4})-(?\d{1,2})/(?\d{1,2})/(?\d{4})\Z%,$str,$res)){
$dates['from']=mktime(0,0,0,$res['fromMonth'],$res['fromDay'],$res['fromYear']);
$dates['to']=mktime(0,0,0,$res['toMonth']、$res['toDay']、$res['toYear']);
}
生成从日期到日期之间的范围

for ($date = $dates['from']; $date <= $dates['to']; $date = strtotime('+1 day', $date) ){
    $dates['range'][] = date('m-d-Y', $date);
}

for($date=$dates['from'];$date检查输入值是否与您的范围格式匹配,捕获零件并生成fromto日期

if (preg_match('%\A(?<fromMonth>\d{1,2})/(?<fromDay>\d{1,2})/(?<fromYear>\d{4})-(?<toMonth>\d{1,2})/(?<toDay>\d{1,2})/(?<toYear>\d{4})\Z%', $str, $res)) {
    $dates['from'] = mktime(0, 0, 0, $res['fromMonth'], $res['fromDay'], $res['fromYear']);
    $dates['to']   = mktime(0, 0, 0, $res['toMonth'], $res['toDay'], $res['toYear']);
}
if(preg_match('%\A(?\d{1,2})/(?\d{1,2})/(?\d{4})-(?\d{1,2})/(?\d{1,2})/(?\d{4})\Z%,$str,$res)){
$dates['from']=mktime(0,0,0,$res['fromMonth'],$res['fromDay'],$res['fromYear']);
$dates['to']=mktime(0,0,0,$res['toMonth']、$res['toDay']、$res['toYear']);
}
生成从日期到日期之间的范围

for ($date = $dates['from']; $date <= $dates['to']; $date = strtotime('+1 day', $date) ){
    $dates['range'][] = date('m-d-Y', $date);
}

对于($date=$dates['from'];$date我认为,strottime更适合您的情况。您可以在php.net网站上找到定义:

我认为,strotime更适合您的情况。您可以在php.net网站上找到定义:

当然,PHP是一种编程语言。它可以做任何你想做的事情。设置日期范围很简单。至于数据库,现在就停止编写代码并修复日期字段。将它们转换为真正的原生日期/日期时间类型。从长远来看,将其保留为varchar只会给你带来巨大的痛苦。是的,好的,我会这样做,你已经说服了我。当然,PHP是一种编程语言。它可以做你想做的任何事情。做一个日期范围很简单。至于你的数据库,停止编写代码,现在修复日期字段。将它们转换为真正的原生日期/日期时间类型。将其保留为varchar只会在长期内给你带来巨大的痛苦。是的,好的,我会做的。你已经说服我了……看起来不错!正确的php-方法是:
$day->add(新的日期间隔('P1D'))
非常感谢Brad。非常接近,它生成的是最终日期,其数量等于范围内的天数。故障排除,如果我在while循环中回显$day,它似乎工作正常。当我将日期附加到arrayOk时,出现了一些问题。我已经解决了它,正如您所说,它需要一些锡kering,但是你让我走上了正确的轨道…谢谢!我只是有点讨厌mysql查询,我总是有语法错误。问题是我不能将datetime对象作为字符串插入表中。所以我刚刚创建了一个名为$sqlday的新变量,并将其用于注入,并将$day作为变量用于while循环。太好了!Maybe不是最好的方式,但这正是我想要的……看起来不错!正确的php方式应该是:
$day->add(new DateInterval('P1D'))
非常感谢Brad。非常接近,它生成的是最终日期,其数量等于范围内的天数。故障排除,如果我在while循环中回显$day,它似乎工作正常。当我将日期附加到arrayOk时,发生了一些事情,我已按您所说的那样解决了它