2010-10-03 21 views
8

Je suis fraîche à Codeigniter. J'ai un formulaire qui ressemble à ceci.Codeigniter Insérer plusieurs lignes dans SQL

<tr> 
<td><input type="text" name="Name[0]" value=""></td> 
<td><input type="text" name="Address[0]" value=""><br></td> 
<td><input type="text" name="Age[0]" value=""></td> 
<td><input type="text" name="Email[0]" value=""></td> 
</tr> 



<tr> 
<td><input type="text" name="Name[1]" value=""></td> 
<td><input type="text" name="Address[1]" value=""><br></td> 
<td><input type="text" name="Age[1]" value=""></td> 
<td><input type="text" name="Email[1]" value=""></td> 
</tr> 

Il peut y avoir de 0 à n rangées, habituellement de 5 à 10 rangées. Comment puis-je les insérer dans SQL? Est-ce possible avec Codeigniter ou dois-je utiliser un script PHP natif?


$name=$_POST['Name']; 
$address=$_POST['Address']; 
$age=$_POST['Age']; 
$email=$_POST['Email']; 
$count = count($_POST['Name']); 



for($i=0; $i<$count; $i++) { 
$data = array(
      'name' => $name[$i], 
      'address' => $address[$i], 
      'age' => $age[$i], 
      'email' => $email[$i], 

      ); 


    $this->db->insert('mytable', $data); 
} 

Je l'ai fait. Ça marche. Mais la solution semble inélégante.

La réponse de kevtrout est meilleure mais génère actuellement beaucoup d'erreurs.

Est-il possible d'insérer toutes les données en même temps?

+0

Voir ma solution http: //stackoverflow.com/a/14332078/1045444 ... Vous avez accepté la solution la plus efficace qui ne ... Nous devrions utiliser insert_batch(); –

+0

@SomnathMuluk Vous avez raison. S'il vous plaît voir la question liée que je ai demandé plus tard http://stackoverflow.com/questions/4166146/codeigniter-inserting-multidimensional-array-as-rows-in-mysql?lq=1 –

Répondre

8

Faites votre formulaire comme ceci:

<tr> 
    <td><input type="text" name="user[0][name]" value=""></td> 
    <td><input type="text" name="user[0][address]" value=""><br></td> 
    <td><input type="text" name="user[0][age]" value=""></td> 
    <td><input type="text" name="user[0][email]" value=""></td> 
</tr> 
<tr> 
    <td><input type="text" name="user[1][name]" value=""></td> 
    <td><input type="text" name="user[1][address]" value=""><br></td> 
    <td><input type="text" name="user[1][age]" value=""></td> 
    <td><input type="text" name="user[1][email]" value=""></td> 
</tr> 

Ensuite, vous pouvez simplement faire:

foreach($_POST['user'] as $user) 
{ 
    $this->db->insert('mytable', $user); 
} 
+0

En y regardant de plus près, il est très similaire à la solution de kevtrout, $ this-> maybe-> more-> elegant(); Doit en apprendre davantage sur les tableaux. –

+4

Jetez un coup d'œil à la méthode 'insert_batch()' [http://codeigniter.com/user_guide/database/active_record.html] – Shahid

2

Le formulaire que vous affichez crée un tableau $ _POST avec des index de nom, d'adresse, d'âge et de courrier électronique. Chacun d'entre eux contiendra le nombre n de "lignes" que votre formulaire fournit. Par exemple:

array(
    'name' => array('First Name','Second Name'), 
    'address' => array ('First Address','Second Address'), 
    'age' => array('First Age','Second Age'), 
    'email' => array('First Email', 'Second Email') 
    ); 

Vous pouvez réorganiser ce tableau dans un où chaque indice du tableau est une « personne ». Cela facilitera l'insertion des informations dans votre base de données.

//subtract 1 from below to account for the assumed submit button 
$number_of_rows = count($_POST)-1; 

for($i=0;$i<$number_of_rows;$i++){ 
    $person[]['name'] = $this->input->post('Name')[$i]; 
    $person[]['address'] = $this->input->post('Address')[$i]; 
    $person[]['age'] = $this->input->post('Age')[$i]; 
    $person[]['email'] = $this->input->post('Email')[$i]; 
    } 

Cela va créer quelque chose comme ceci:

array(
    0=>array('First Name','First Address','First Age','First Email'), 
    1=>array ('Second Name','Second Address','Second Age','Second Email') 
    ); 

Maintenant, vous pouvez utiliser une boucle pour insérer chaque personne dans la db.

for($y=0;$y<count($person);$y++){ 
    $this->db->insert('mytable',$person[$y]; 
} 
+0

Actuellement en retournant une erreur, publiera une mise à jour bientôt. –

+0

Quelles sont les erreurs soulevées? J'ai corrigé une erreur de syntaxe avec '$ this-> input-> post {'Name');' ci-dessus. – kevtrout

+0

L'a fait! Partie d'un appel d'Ajax avec la fonction de retour complexe, c'est pourquoi a dû substituer un exemple plus simple ci-dessus. Voir ma réponse ci-dessous. Ne semble pas être le moyen Codeigniter. –

23

multiples insertion/insertion de lot est désormais pris en charge par CodeIgniter. Il lancera une requête plutôt que de lancer trop de requêtes.

$data =array(); 
for($i=0; $i<$count; $i++) { 
$data[$i] = array(
      'name' => $name[$i], 
      'address' => $address[$i], 
      'age' => $age[$i], 
      'email' => $email[$i], 

      ); 
} 

$this->db->insert_batch('mytable', $data); 
+0

Ceci suppose que le pilote le supporte. Cela ne fonctionne pas avec CodeIgniter 2.1.4 et le pilote sqlsrv. –