2013-11-28 3 views
2

У меня есть календарь доступности, в котором я в настоящее время добавляю даты один за другим, и используя запрос mysql для определения наличия строки с определенной датой и изменения класса день до «заказанного» (красный).Преобразование диапазона дат PHP в отдельные даты MYSQL

Я хотел бы ввести диапазон в мою форму и обработать его через php (или mysql) в несколько отдельных дат. Мой формат даты - M/D/YYYY, или MM/DD/YYYY, оба принимаются. К сожалению, когда я построил свой календарь, я не использовал формат даты в sql для записей, но использовал varchar.

Есть ли способ войти в мою форму, например 1/1/2014-1/3/2014, и у меня есть php, чтобы до 1/1/2014, 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)"); 

}

Мой обходной путь и последний курорт будет добавить несколько текстовых входов и просто добавить несколько дат вручную, так что я только должен представить один раз. Но диапазон намного быстрее!

В качестве последнего примечания, если бы я мог иметь эти несколько записей, сохранить значения «клиент» и «примечания» для каждой даты в диапазоне, который был бы потрясающим. Я готов потерять эти поля, хотя и сделать эту работу. Благодаря

+1

Конечно, PHP язык программирования. Он сделает все, что захочет. Выполнение диапазона дат тривиально. Что касается вашей БД, перестаньте работать с кодом и исправьте поля даты ** СЕЙЧАС **. Преобразуйте их в реальный родной тип даты/даты. Оставляя это как варчар, вы в конечном итоге причиняете вам огромные страдания. –

+0

Да, хорошо, я сделаю это, ты меня убедил. – idelest

ответ

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)

(это явно не не тестировались и окончательный код вы будете использовать - просто написано в этой веб-формы из памяти ... вы» придется писать его правильно с вводом санитарией и проверкой диапазона и этажеркой.)

+0

... хорошо выглядит! Правильный php-путь был бы следующим: '$ day-> add (новый DateInterval ('P1D'))' [Вы можете проверить его здесь] (http: //sandbox.onlinephpfunctions.com/code/42fc3d5019f15cd02fbd461be530a92cb92929ad) –

+0

@ V-Light. Правильно! Благодарю. отредактировал код – Brad

+0

Это отличная благодарность Брэду. Его очень близкое, то, что он производит, является окончательной датой, которая несколько раз равна количеству дней в диапазоне. Устранение неполадок, если я повторяю $ day в цикле while, он работает нормально. Что-то происходит, когда я добавляю даты к массиву. – idelest

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

Создать диапазон между датами и датами.

for ($date = $dates['from']; $date <= $dates['to']; $date = strtotime('+1 day', $date)){ 
    $dates['range'][] = date('m-d-Y', $date); 
} 
Смежные вопросы