Как вставить несколько, увеличивая на 1, строк в базу данных MySQL с переполнением стека

Я хочу добавить 30 строк в базу данных SQL. Таблица имеет 3 столбца: «Год», «Месяц», «День». Строки должны быть добавлены в столбец «День». Я использую следующий код, так как я хочу это сделать один раз. Когда я отправляю это через RESTeasy, я вижу в PHPmyadmin, что только последний ряд было добавлено, в данном случае: «2017», «1», «31».

// Add days in month
$app->post('/api/calendar/add', function (Request $request, Response $response) {
$year = $request->getParam('Year');
$month = $request->getParam('Month');
$day = $request->getParam('Day');

$day = 1;
while($day < 31) {
$day = $day + 1;
$sql = "INSERT INTO `days` (`Year`, `Month`, `Day`) VALUES ('2017', '1', '$day')";
};

try {
// Get DB Object
$dbcalendar = new dbcalendar();
// Connect
$dbcalendar = $dbcalendar->connect();

$stmt = $dbcalendar->prepare($sql);

$stmt->bindParam(':Year', $year);
$stmt->bindParam('Month', $month);
$stmt->bindParam('Day', $day);

$stmt->execute();

echo '{"notice": {"text": "Days Added"}';

} catch(PDOException $e) {
echo '{"error": {"text": '.$e->getMessage().'}';
}

0

Решение

Вам нужно двигаться try catch в то время

// Add days in month
$app->post('/api/calendar/add', function (Request $request, Response $response) {
$year = $request->getParam('Year');
$month = $request->getParam('Month');
$day = $request->getParam('Day');

$day = 1;
while($day < 31) {
$day = $day + 1;
$sql = "INSERT INTO `days` (`Year`, `Month`, `Day`) VALUES ('2017', '1', '$day')";

try {
// Get DB Object
$dbcalendar = new dbcalendar();
// Connect
$dbcalendar = $dbcalendar->connect();

$stmt = $dbcalendar->prepare($sql);

$stmt->bindParam(':Year', $year);
$stmt->bindParam('Month', $month);
$stmt->bindParam('Day', $day);

$stmt->execute();

echo '{"notice": {"text": "Days Added"}';

} catch(PDOException $e) {
echo '{"error": {"text": '.$e->getMessage().'}';
}
};
});
0

Другие решения

Ваш $sql переменная перезаписывается при каждом выполнении вашего while петля. Следовательно, после 31 казни это выглядит так:

INSERT INTO `days` (`Year`, `Month`, `Day`) VALUES ('2017', '1', '31')

Я могу придумать как минимум два разных подхода к решению этой проблемы:

Либо поставь свой try...catch заявление внутри вашего while, Таким образом, каждый раз, когда запрос создается, он выполняется.

Или трансформируй свой $sql var в массив и добавить все значения, заданные в качестве новой записи, затем implode Это. Таким образом, у вас будет один SQL-запрос и выполнение:

$sql_array = array();
while($day < 31) {
$day = $day + 1;
$sql_array[] = "('2017', '1', '$day')";
};
$sql = 'INSERT INTO `days` (`Year`, `Month`, `Day`) VALUES ' . implode(', ', $sql_array);

Хотя первый метод может быть проще для понимания, второй определенно потребует меньше ресурсов и будет иметь более короткое время выполнения.

0

По вопросам рекламы [email protected]