Есть ли способ вставить диапазон дат в таблицу базы данных mysql - PullRequest
0 голосов
/ 07 апреля 2019

Я использую форму для пользователей, чтобы забронировать проживание в праздничные дни через мой веб-сайт, детали бронирования включают квартиру, регистрацию заезда, даты выезда и общее количество дней, рассчитанных с использованием функции различий в датах. Я также использую цикл for для итерации между датами регистрации и извлечения, которые затем генерируют диапазон дат. Проблема в том, что когда я выполняю свой запрос на вставку в mysql, в таблицу базы данных вставляется только конечная дата из диапазона. Моя цель - вставить весь диапазон в mysql, чтобы я мог отключить даты, уже забронированные в окне выбора даты. Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно, см. Мой код ниже.

Я уже пытался использовать объект периода даты и исследовал все типы данных для поля диапазона дат в phpmyadmin.

Я также пытался использовать отдельную таблицу для диапазона дат

if(isset($_POST['apmt'])){

$value = $_POST['apmt'];
$ds = $_POST['ds'];
$de = $_POST['de'];
$d = $_POST['d'];


 try{ 
$dateb = $de;
$datea = $ds;

  for ($i = $datea; $i <= $dateb; $i++)
  {
          $dr = date("Y-m-d", strtotime($i));
  }  


$query = "INSERT INTO bookings SET apmt = :apmt, dateStart = :dateStart, dateEnd = :dateEnd, dateRange = :dateRange, totalDays = :totalDays, date = NOW(), clientID = '".$_SESSION['ID']."' ";
$s = $pdo->prepare($query);
$s->bindvalue(":apmt", $value);
$s->bindvalue(":dateStart", $ds);
$s->bindvalue(":dateEnd", $de);
$s->bindvalue(":dateRange", $dr);
$s->bindvalue(":totalDays", $d);
$s->execute();

$id = $pdo->lastInsertId();

if($id > 0 ){

    $table = "";
    $table .= '<table style="text-align:center;width:100%;margin:auto"><tr><th>APARTMENT</th><th>DATE START</th><th>DATE END</th><th>DAYS</th></tr>';
    $table .= '<tr><td>' .$value. '</td>';
    $table .= '<td>' .$ds. '</td>';
    $table .= '<td>' .$de. '</td>';
    $table .= '<td>' .$d. '</td>';
    $table .= '</tr></table>';
    echo $table ."</br>";

}

}
catch (PDOException $e) {
  $output = "Unable to connect to database server" . $e->getMessage();
  echo "$output";
  exit();   
}

}

1 Ответ

1 голос
/ 07 апреля 2019

Итак, проблема, которую вы определили, связана с вашим циклом for, который дает неожиданные результаты, вы присваиваете значение $br после каждой итерации, поэтому при завершении цикла у вас есть последняя дата хранится в $br.

Я бы порекомендовал следующее решение, так как позже будет проще всего манипулировать и дать вам самый чистый код. Заменив $br на Array , вы можете добавлять к нему элемент после каждой итерации. При вставке в базу данных использование функции implode позволит вам привести ее в соответствие с вашими предпочтениями без использования хакерских манипуляций со строками.

$dr = [];
for ($i = $datea; $i <= $dateb; $i++)
{
    array_push($dr, date("Y-m-d", strtotime($i)));
}  

Теперь, когда вы идете вставлять в свою таблицу, ссылаться на массив следующим образом:

$drString = implode(',', $dr) # (String) "date,date,date,date"

Дальнейшие советы

В случае, если вы используете схему SQL Date, как слегка подсказано в вопросе, сохранение диапазонов не является для них значением по умолчанию. Поэтому сохранение в виде Text или Varchar может быть вашим лучшим вариантом, затем итерация по строке диапазона («дата, дата, дата») и создание нового Дата PHP-объект для каждой разнесенной строки в отдельности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...