2017-03-29 20 views
0

SQLデータベースに30行追加したい。テーブルには、「年」、「月」、「日」の3つの列があります。行は「日」列に追加する必要があります。私はを一度としたいので、次のコードを使用します。私がRESTeasyを介して投稿すると、最後の行(この場合は「2017」「1」「31」)だけがPHPmyadminに表示されます。PHPを使ってmysqlデータベースに複数行を1行追加する方法

// 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ループの実行ごとに上書きされている

// 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クエリごとに実行する必要のある '$ stmt = $ dbcalendar-> prepare($ sql);と' $ stmt-> execute(); 'を忘れていました。どうもありがとう! – Rico11112016

0

中にtry catchを移動する必要があります。したがって、31回の実行後、それは次のようになります。どちらの

あなたwhileの内側にあなたのtry...catch文を置く:

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

私はこの問題を解決するには、少なくとも2つの異なるアプローチを考えることができます。こうして、リクエストがビルドされるたびに、リクエストが実行されます。

または、$sql varを配列に変換し、すべての値を新しいエントリとして追加してからimplodeに設定します。第1の方法は理解しやすいかもしれませんが、二つ目は間違いなく少ないリソースを必要と短い実行時間を持つことになります

$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); 

:このように、あなたは、単一のSQL要求と実行を持っています。

+0

私はちょうど 'try ... catch'の解決策を試しましたが、とにかく徹底的な回答に感謝します。 – Rico11112016

関連する問題