Добавление списка дат в базу данных

1

У меня есть два выбора даты на моем веб-сайте, где администратор может выбрать "start date" и "end date". Все даты от начала до конца будут затем загружены в базу данных. Например:

Start Date: 2015-01-01
End Date: 2015-01-05

Upload to database:
2015-01-01
2015-01-02
2015-01-03
2015-01-04
2015-01-05

У меня уже есть код для этого, хотя он ТОЛЬКО загружает ОДНУ дату в базу данных, дату начала. Любые идеи, как я получаю эту работу, чтобы загрузить все даты между выбранными датами начала и окончания? Вот мой текущий код:

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

$servername = "localhost";
$username = "u779108225_admin";
$password = "password";
$dbname = "u779108225_main";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$date_from = $_POST['date_from']; 
$date_from = strtotime($date_from); // Convert date to a UNIX timestamp

// Specify the end date. This date can be any English textual format
$date_to = $_POST['date_to'];
$date_to = strtotime($date_to); // Convert date to a UNIX timestamp

// Loop from the start date to end date and output all dates inbetween
for ($i=$date_from; $i<=$date_to; $i+=86400) {
    $date = date("Y-m-d", $i);
    $sql = "INSERT INTO calendar (date)
VALUES
('$date')";

}


if ($conn->query($sql) === TRUE) {
    echo "New record created successfully";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

$conn->close();
// Specify the start date. This date can be any English textual format



}
Теги:
database
date
mysqli

2 ответа

3
Лучший ответ

Вы выполняете свой последний запрос только при перезаписывании $sql в каждой итерации цикла. Переместите оператор выполнения в свой цикл:

for ($i=$date_from; $i<=$date_to; $i+=86400) {
    $date = date("Y-m-d", $i);
    $sql = "INSERT INTO calendar (date) VALUES ('$date')";
     if ($conn->query($sql) === TRUE) {
        echo "New record created successfully";
    } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
    }
}

или сделать один запрос и выполнить это:

$sql = "INSERT INTO calendar (date) VALUES ";
$values = array();
for ($i=$date_from; $i<=$date_to; $i+=86400) {
    $date = date("Y-m-d", $i);
    $values[] = "('$date')";

}
$sql .= implode(',', $values);
if ($conn->query($sql) === TRUE) {
    echo "New record created successfully";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}
  • 0
    Это отлично работает, спасибо за ответ! Будет ли это работать для выполнения того же запроса, но удаления дат вместо их добавления? Как мне нужно будет реализовать эту функцию тоже?
1

Я предпочитаю использовать объекты DateTime по меткам времени и т.д.

Ваш цикл for задавал запрос несколько раз, однако вы только выполняли запрос один раз.

Это фиксированная версия с использованием DateTime.

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

    $servername = "localhost";
    $username = "u779108225_admin";
    $password = "password";
    $dbname = "u779108225_main";

    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    } 

    $date_from = $_POST['date_from']; 
    $date_from = new DateTime($date_from);

    $date_to = $_POST['date_to'];
    $date_to = new DateTime($date_to);

    $cur_date = $date_from;
    while($cur_date < $date_to) {
        $date = $cur_date->format('Y-m-d');
        $sql = "
            INSERT INTO calendar (date)
            VALUES
            ('$date');
        ";
        $cur_date->modify('+1 day');

        if ($conn->query($sql) === TRUE) {
            echo "Date inserted: {$date}";
        } else {
            echo "Error: " . $sql . "<br>" . $conn->error;
        }
    }

    $conn->close();

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню