2017-03-29 1 views
0

Je veux ajouter 30 lignes à ma base de données SQL. La table a 3 colonnes: "Année", "Mois", "Jour". Les lignes doivent être ajoutées à la colonne "Jour". J'utilise le code suivant, comme je veux le faire une fois. Quand je l'affiche à travers RESTeasy je peux voir dans PHPmyadmin que seulement dernière ligne a été ajouté, dans ce cas: "2017" "1" "31".Comment insérer plusieurs lignes, en augmentant de 1, dans la base de données mysql avec php

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

Répondre

0

Vous devez déplacer try catch dans le tout

variables
// 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

Solution très simple et efficace. J'ai oublié '$ stmt = $ dbcalendar-> prepare ($ sql);' et '$ stmt-> execute();' qui doivent être exécutés pour chaque sql querry dans ce cas précis. Merci beaucoup! – Rico11112016

0

Votre $sql est écrasé dans chaque exécution de la boucle while. Par conséquent, après 31 exécutions, il ressemble à:

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

Je peux penser à au moins deux approches différentes pour résoudre ce:

Ou mettre votre déclaration try...catch dans votre while. De cette façon, chaque fois que la requête est construite, elle est exécutée.

Ou transformer votre var $sql en un tableau et ajouter toutes les valeurs définies comme une nouvelle entrée, puis implode il. De cette façon, vous aurez une seule requête SQL et exécution:

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

Alors que la première méthode pourrait être plus facile à comprendre, le second, il faudra certainement moins de ressources et un temps d'exécution plus courte.

+0

Je viens d'essayer la solution 'try ... catch', mais merci quand même pour les années à venir. – Rico11112016