如何使用 php 向 mysql 数据库插入多行,增加 1

How to insert multiple, increasing by 1, rows to mysql database with php

我想向我的 SQL 数据库添加 30 行。 table 有 3 列:"Year"、"Month"、"Day"。这些行应添加到 "Day" 列。我使用以下代码,因为我想这样做一次。当我通过 RESTeasy post 它时,我可以在 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().'}';
    }

您需要将 try catch 移入 while

// 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().'}';
        }
    };
});

您的 $sql 变量在每次执行 while 循环时都会被覆盖。因此,执行 31 次后,它看起来像:

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

我至少可以想到两种不同的方法来解决这个问题:

要么将你的 try...catch 声明放在你的 while 中。这样,每次构建request,就执行。

或者将您的 $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);

虽然第一种方法可能更容易理解,但第二种方法肯定需要更少的资源并且执行时间更短。