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

时间:2013-11-28 15:54:12

标签: php mysql date calendar range

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

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

有没有办法进入我的表格,例如1/1 / 2014-1 / 3/2014,并将php转换为2014年1月1日,1/2/2014,1/3/2014,然后有一个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)");

}

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

作为最后一点,如果我可以拥有这些多个条目,请保留范围内每个日期的“客户”和“注释”值,这将是惊人的。我准备失去那些领域,但要做到这一点。感谢

3 个答案:

答案 0 :(得分:4)

类似的东西:

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

这将为您提供一组DateTime对象,每个对象代表您范围内的一天。您可以通过调用DateTime :: format()并将'm / d / Y'作为格式字符串传递给每个对象。

对于获取MySQL的多个条目,INSERT语法允许INSERT INTO table (column) VALUES (row1), (row2), ... (rowN)

(显然没有经过测试或者你会使用的最终代码 - 只是从内存写入这个网页表单......你必须用输入卫生和范围检查以及诸如此类的东西来正确编写它。)< / p>

答案 1 :(得分:0)

检查输入值是否与您的范围格式匹配,捕获部分并生成日期。

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']);
}

生成from和to之间的范围。

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

答案 2 :(得分:0)

我认为, strtotime 更适合您的情况。你可以在php.net网站找到定义: http://php.net/manual/en/function.strtotime.php