генерировать список дат между двумя датами и списком сохранения в базе данных

Я хотел бы немного помочь с проблемой, которую я сейчас имею. Мне нужно создать список дат, используя первую и последнюю дату в списке, а затем сохранить список дат, сгенерированных в таблице базы данных. Каков наилучший способ сделать это?

Мой код:

<?php $apartment = (isset($_POST['apartment']) ? $_POST['apartment'] : null); $name = (isset($_POST['name']) ? $_POST['name'] : null); $surname = (isset($_POST['surname']) ? $_POST['surname'] : null); $email = (isset($_POST['email']) ? $_POST['email'] : null); $address = (isset($_POST['address']) ? $_POST['address'] : null); $mobile = (isset($_POST['mobile']) ? $_POST['mobile'] : null); $pax = (isset($_POST['pax']) ? $_POST['pax'] : null); $address = (isset($_POST['address']) ? $_POST['address'] : null); $remarks = (isset($_POST['remarks']) ? $_POST['remarks'] : null); $day_from = (isset($_POST['day_from']) ? $_POST['day_from'] : null); $month_from = (isset($_POST['month_from']) ? $_POST['month_from'] : null); $year_from = (isset($_POST['year_from']) ? $_POST['year_from'] : null); $booking_from = $year_from."-".$month_from."-".$day_from; $day_to = (isset($_POST['day_to']) ? $_POST['day_to'] : null); $month_to = (isset($_POST['month_to']) ? $_POST['month_to'] : null); $year_to = (isset($_POST['year_to']) ? $_POST['year_to'] : null); $booking_to = $year_to."-".$month_to."-".$day_to; $no_of_nights = abs(strtotime($booking_to) - strtotime($booking_from)); $days = floor($no_of_nights / (60*60*24)); include 'connect.php'; if (!$conn->autocommit(FALSE)) { printf("Errormessage: %s\n", $conn->error); } if (!$conn->query("INSERT INTO client_details (clientID, name, email, address, mobile) VALUES ('', '$name $surname', '$email', '$address', '$mobile')")) { printf("Errormessage: %s\n", $conn->error); } if (!$conn->query("INSERT INTO bookings (bookingID, apartmentID, clientID, date_from, date_to, nights, pax, remarks) VALUES ('', '$apartment', LAST_INSERT_ID(), '$booking_from', '$booking_to', '$days', '$pax', '$remarks')")) { printf("Errormessage: %s\n", $conn->error); } function dateArray($booking_from, $booking_to) { echo "yo"; $aryRange = array(); $iDateFrom=mktime(1,0,0,substr($booking_from,5,2), substr($booking_from,8,2),substr($booking_from,0,4)); $iDateTo=mktime(1,0,0,substr($booking_to,5,2), substr($booking_to,8,2),substr($booking_to,0,4)); if ($iDateTo>=$iDateFrom) { array_push($aryRange, date('Ym-d', $iDateFrom)); { while ($iDateFrom<$iDateTo) { $iDateFrom+=86400; // add 24 hours array_push($aryRange,date('Ym-d',$iDateFrom)); } } return $aryRange; } dateArray($booking_from, $booking_to); if (!$conn->query("INSERT INTO room_nights (bookingID, apartmentID, dates) VALUES (LAST_INSERT_ID(), '$apartment', '$dates['dates']')")) { printf("Errormessage: %s\n", $conn->error); } if (!$conn->commit()) { printf("Errormessage: %s\n", $conn->error); } $conn->close(); } ?> 

Причина получения этой ошибки заключается в том, что вы вызываете функцию daterange не сохраняя результат, который она возвращает. Поэтому вместо того, чтобы называть это так:

 daterange($booking_from, $booking_to, $step = '+1 day', $output_format = 'ym-d'); 

Вы должны добавить переменную $dates чтобы сохранить возвращенный результат функции и использовать ее впоследствии.

 $dates = daterange($booking_from, $booking_to, $step = '+1 day', $output_format = 'ym-d'); 

РЕДАКТИРОВАТЬ:

Следующий код:

 <?php function daterange($booking_from, $booking_to, $step = '+1 day', $output_format = 'Ym-d') { $dates = array(); $first = strtotime($booking_from); $last = strtotime($booking_to); while ($first <= $last) { $dates[] = date($output_format, $first); $first = strtotime($step, $first); } return $dates; } $dates = daterange('2015-08-01', '2015-08-10'); print_r($dates); ?> 

возвращает массив дат, который хранится в параметре $dates date:

 Array ( [0] => 2015-08-01 [1] => 2015-08-02 [2] => 2015-08-03 [3] => 2015-08-04 [4] => 2015-08-05 [5] => 2015-08-06 [6] => 2015-08-07 [7] => 2015-08-08 [8] => 2015-08-09 [9] => 2015-08-10 ) 

Вот песочница, где вы можете увидеть результат.

Пожалуйста, обратите внимание на то, что $ output_format shold будет 'Ym-d' , чтобы получить дату в формате yyyy-mm-dd .

Вы не можете сохранить массив в поле DATE. Даже если вы хотите сохранить Array, вы должны использовать функцию serialize PHP и хранить ее в поле BLOB в базе данных. ( См. Документацию )

Поэтому, если вы хотите сохранить диапазон дат, вам понадобятся по крайней мере два поля в БД, например date_from и date_to . В этом случае оператор INSERT должен выглядеть следующим образом:

 $conn->query("INSERT INTO room_nights (bookingID, apartmentID, date_from, date_to) VALUES (LAST_INSERT_ID(), '$apartment', '$dates[0]', '". $dates[count($dates) - 1] ."')"); 

Ps Также я увидел, что вы переводите параметры $booking_from и $booking_to несколько раз из строки на дату – один раз перед определением функции daterange и один раз в той же самой функции.

Вот мое решение вопроса.

Шаг 1. Создайте массив с датами
Шаг 2: Прокрутите массив и вставьте даты в таблицу базы данных;

 <?php $day_from = (isset($_POST['day_from']) ? $_POST['day_from'] : null); $month_from = (isset($_POST['month_from']) ? $_POST['month_from'] : null); $year_from = (isset($_POST['year_from']) ? $_POST['year_from'] : null); $booking_from = $year_from."-".$month_from."-".$day_from; $day_to = (isset($_POST['day_to']) ? $_POST['day_to'] : null); $month_to = (isset($_POST['month_to']) ? $_POST['month_to'] : null); $year_to = (isset($_POST['year_to']) ? $_POST['year_to'] : null); $booking_to = $year_to."-".$month_to."-".$day_to; $no_of_nights = abs(strtotime($booking_to) - strtotime($booking_from)); $days = floor($no_of_nights / (60*60*24)); // create array with dates function daterange($booking_from, $booking_to, $step = '+1 day', $output_format = 'Ym-d') { $dates = array(); $first = new DateTime($booking_from); $last = new DateTime($booking_to); $interval = DateInterval::createFromDateString($step); $period = new DatePeriod($first, $interval, $last); foreach ($period as $date) { $dates[] = $date->format($output_format); } return $dates; } $dates = daterange($booking_from, $booking_to); print_r($dates); include 'connect.php'; if (!$conn->autocommit(FALSE)) { printf("Errormessage: %s\n", $conn->error); } // loop thru dates and save in database table foreach ($dates as $date) { if (!$conn->query("INSERT INTO room_nights (bookingID, apartmentID, dates) VALUES (LAST_INSERT_ID(), '$apartment', '$date')")) { printf("Errormessage: %s\n", $conn->error); } } if (!$conn->commit()) { printf("Errormessage: %s\n", $conn->error); } $conn->close(); ?>