2010-10-03 49 views
8

Estoy actualizado para Codeigniter. Tengo un formulario que se ve así.Codeigniter Insertar varias filas en 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> 

Puede haber de 0 a n filas, generalmente de 5 a 10 filas. ¿Cómo los inserto en SQL? ¿Es esto posible con Codeigniter o debería usar un script PHP nativo?


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

lo hice. Funciona. Pero la solución parece poco elegante.

La respuesta de kevtrout se ve mejor, pero actualmente está arrojando muchos errores.

¿Hay alguna forma de insertar todos los datos de una vez?

+0

Ver mi solución http: //stackoverflow.com/a/14332078/1045444 ... Ha aceptado una solución que no es la más eficiente ... Deberíamos usar insert_batch(); –

+0

@SomnathMuluk Estás en lo correcto. Por favor, vea la pregunta vinculada que pedí más tarde http://stackoverflow.com/questions/4166146/codeigniter-inserting-multidimensional-array-as-rows-in-mysql?lq=1 –

Respuesta

8

Haga su forma como esto:

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

, entonces puede simplemente hacer:

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

En un análisis más detallado, es muy similar a la solución de kevtrout, $ this-> perhaps-> more-> elegant(); Debe aprender más sobre las matrices. –

+4

Eche un vistazo al método 'insert_batch()' [http://codeigniter.com/user_guide/database/active_record.html] – Shahid

2

El formulario que muestre creará una matriz $ _POST con índices de nombre, dirección, edad y correo electrónico. Cada uno de estos contendrá la n cantidad de "filas" que proporciona su formulario. Por ejemplo:

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

Es posible que desee reorganizar esa matriz en uno, donde cada índice de la matriz es una "persona". Esto simplificará la inserción de la información en su base de datos.

//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]; 
    } 

Esto creará algo como esto:

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

Ahora puede utilizar un bucle para insertar cada persona en el PP.

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

Actualmente, al devolver un error, publicaré una actualización pronto. –

+0

¿Qué errores se están produciendo? Repare un error de sintaxis con '$ this-> input-> post {'Name');' arriba. – kevtrout

+0

¡Eso lo hice! Parte de una llamada Ajax con función de retorno compleja, por eso tuvo que sustituir un ejemplo más simple de arriba. Ver mi respuesta a continuación. No parece ser el modo Codeigniter. –

23

inserción múltiple inserción/lote es ahora compatible con CodeIgniter. Se ejecutará una consulta en lugar de generar demasiadas consultas.

$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

Esto asume que el controlador lo admite. No funciona con CodeIgniter 2.1.4 y el controlador sqlsrv. –

Cuestiones relacionadas