2013-03-29 4 views
0

J'ai un script qui insère dans deux tables de base de données séparées: les ingrédients et les directions. Pour la première fois, j'utilise $this->db->query($sql), et pour la seconde: $this->db->query($sql2) (j'utilise CodeIgniter). Voici mon code:Les inserts de base de données sont combinés?

foreach($_POST as $key => $value) { 
     $value = $this->input->post($key); 
     $directions = $this->input->post('directions'); 
     $ingredientQTY = $this->input->post('ingredientQTY'); 
     $measurements = $this->input->post('measurements'); 
     $ingredientNAME = $this->input->post('ingredientNAME'); 
     $ingredientsROW[] = array($ingredientQTY, $measurements, $ingredientNAME); 

     //For inserting ingredients 
     for ($i = 0, $count = count($ingredientQTY); $i < $count; $i++) { 
      $rows[] = array(
       'ingredientamount'  => $ingredientQTY[$i], 
       'ingredientType'  => $measurements[$i], 
       'ingredientname'  => $ingredientNAME[$i], 
       'recipe_id'    => $recipe_id, 
       'order'     => $i + 1, 
       'user_id'    => $user_id 
      ); 
      $sql = "INSERT `ingredients` (`ingredientamount`,`ingredientType`,`ingredientname`,`recipe_id`, `listOrder`, `user_id`) VALUES "; 
      $coma = ''; 
      foreach ($rows as $oneRow) { 
       $sql .= $coma."('".implode("','",$oneRow)."')"; 
       $coma = ', '; 
      } 

     } 
     $this->db->query($sql);//Insert Query for ingredients 

     //For inserting directions 
     for ($i = 0, $count = count($directions); $i < $count; $i++) { 
      $rows[] = array(
       'direction'  => $directions[$i], 
       'recipe_id'    => $recipe_id, 
       'order'     => $i + 1, 
       'user_id'    => $user_id 
      ); 
      $sql2 = "INSERT `directions` (`direction`,`recipe_id`,`listOrder`,`user_id`) VALUES "; 
      $coma = ''; 
      foreach ($rows as $oneRow) { 
       $sql2 .= $coma."('".implode("','",$oneRow)."')"; 
       $coma = ', '; 
      } 
     } 
     $this->db->query($sql2); //Insert Query for directions 
     break; 
    } 

Je devrais avoir deux instructions SQL séparées, mais pour une raison quelconque, ils sont combinés en et générer l'erreur suivante:

Column count doesn't match value count at row 1 

INSERT `directions` (`direction`,`recipe_id`,`listOrder`,`user_id`) VALUES ('1','Bunch','Cilantro','1','1','1'), ('3','Cup','Sugar','1','2','1'), ('First, combine the cilantro and sugar','1','1','1'), ('then eat. ','1','2','1') 

Il devrait y avoir un INSERT ingredients ainsi , mais ses valeurs sont combinées dans l'instruction INSERT directions.

Pourquoi les deux instructions SQL seraient-elles combinées?

+0

@PreetSangha, Il y a 2 en compte ($ directions) – Muhambi

Répondre

1

La première moitié de votre code construit $rows pour insérer tous les ingrédients, puis la seconde moitié construit $rows d'insérer toutes les directions, mais il efface jamais hors $rows inbetween. Quand vous allez faire les directions les ingrédients sont toujours dans la rangée.

En outre, je pense que vous appelez le SQL trop souvent. Votre boucle for $i et la boucle foreach $rows ne doivent pas être imbriquées; ils devraient être l'un suivi de l'autre. Essayez quelque chose comme ceci:

for ($i = 0, $count = count($ingredientQTY); $i < $count; $i++) { 
    $rows[] = array(
    'ingredientamount' => $ingredientQTY[$i], 
    'ingredientType' => $measurements[$i], 
    'ingredientname' => $ingredientNAME[$i], 
    'recipe_id'  => $recipe_id, 
    'order'   => $i + 1, 
    'user_id'   => $user_id 
); 
} // <-- FIRST FOR LOOP SHOULD END HERE 

$sql = "INSERT `ingredients` (`ingredientamount`,`ingredientType`,`ingredientname`,`recipe_id`, `listOrder`, `user_id`) VALUES "; 
$coma = ''; 
foreach ($rows as $oneRow) { 
    $sql .= $coma."('".implode("','",$oneRow)."')"; 
    $coma = ', '; 
} 
// } <-- FIRST FOR LOOP USED TO END HERE; PROBABLY NOT RIGHT 

$this->db->query($sql);//Insert Query for ingredients 

$rows = array(); // <-- Clear out $rows to reuse it for directions 

Avec le tableau $rows effacé sur vous pouvez passer aux directions. Comme pour les ingrédients, placez les boucles les unes après les autres plutôt que de les imbriquer.

+0

Correction du problème et amélioration de mon code, merci! – Muhambi

-1
$sql2 = "INSERT directions ('direction','recipe_id','listOrder','user_id') VALUES "; 

la première série de crochets spécifie 4 colonnes, mais vous essayez d'insérer 6 valeurs.

code fixe:

$sql2 = "INSERT INTO directions VALUES "; 
+0

Merci pour la réponse! Je reçois les valeurs du tableau rows, donc il y a en réalité 4 colonnes et 4 valeurs, donc ça ne marche pas. – Muhambi

+0

Les 6 valeurs qui proviennent de l'erreur sont en fait censées être insérées dans l'instruction Ingredients, mais pour une raison quelconque, elles sont ajoutées à l'insert dans les directions – Muhambi

+0

change 'directions' dans' $ sql2 = "INSERT INTO directions VALUES"; ' à 'ingredients' :) –

Questions connexes