我有一个可用性日历,我目前正在逐个添加日期,并使用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)");
}
我的解决方法和最后的手段是添加多个文本输入,只需手动添加多个日期,所以我只需提交一次。但范围要快得多!
作为最后一点,如果我可以拥有这些多个条目,请保留范围内每个日期的“客户”和“注释”值,这将是惊人的。我准备失去那些领域,但要做到这一点。感谢
答案 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