Я хотел бы немного помочь с проблемой, которую я сейчас имею. Мне нужно создать список дат, используя первую и последнюю дату в списке, а затем сохранить список дат, сгенерированных в таблице базы данных. Каков наилучший способ сделать это?
Мой код:
<?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(); ?>