2013-08-09 7 views
5

Ho un problema quando voglio inserire più campi in una tabella.inserire più campi utilizzando il ciclo foreach

Ecco la mia forma:

<h1>Add user</h1> 
<form method="post" action="index.php"> 

<table> 
    <thead> 
     <th>Name</th> 
     <th>Age</th> 
    </thead> 

    <tr> 
     <td><input name="name[]" type="text" /></td> 
     <td><input name="age[]" type="text" /></td> 
    </tr> 

    <tr> 
     <td><input name="name[]" type="text" /></td> 
     <td><input name="age[]" type="text" /></td> 
    </tr> 

    <tr> 
     <td><input name="name[]" type="text" /></td> 
     <td><input name="age[]" type="text" /></td> 
    </tr> 
</table> 

<input type="submit" name="submit" value="Submit" /> 
</form> 

Ed ecco il codice di conferma:

if (isset($_POST['submit'])) { 

    foreach ($_POST as $val) { 
     $name = $val['name']; 
     $age = $val['age']; 

     mysql_query("INSERT INTO users (name, age) VALUES ('$name', '$age')"); 
    } 
} 

La query inserisce nel database, ma non i valori che ho inserito.

Qualcuno può aiutarmi?

+1

iniezione SQL chiunque? – Mike

+0

sì, lo aggiusterò più tardi, basterà sistemarlo subito –

risposta

13

Si sta facendo un foreach su $_POST anziché sul nome/matrici di età. Si dovrebbe fare foreach sul nome o un array di età in questo modo:

if (
    !empty($_POST['name']) && !empty($_POST['age']) && 
    is_array($_POST['name']) && is_array($_POST['age']) && 
    count($_POST['name']) === count($_POST['age']) 
) { 
    $name_array = $_POST['name']; 
    $age_array = $_POST['age']; 
    for ($i = 0; $i < count($name_array); $i++) { 

     $name = mysql_real_escape_string($name_array[$i]); 
     $age = mysql_real_escape_string($age_array[$i]); 

     mysql_query("INSERT INTO users (name, age) VALUES ('$name', '$age')"); 
    } 
} 

Vorrei anche notare che siete attualmente suscettibili di SQL injection così ho aggiunto la fase di sfuggire corde per ottenere il nome/età.

Vorrei anche suggerire semplicemente di creare un singolo inserto di massa nel DB invece di un inserto di ogni record individualmente (lo lascerò a voi per implementarlo). Questo approccio è quasi sempre preferibile dal punto di vista delle prestazioni.

Infine, NON si dovrebbero usare le funzioni mysql_* come sono deprecate. Valuta di passare a mysqli o PDO.

+0

Grazie! Ha funzionato davvero! –

+0

GRAZIE MOLTA MIKE! – falcon

+0

Grazie. ma sto avendo problemi con la soluzione. – yaqoob

4
if (isset($_POST['submit'])) { 

$i = 0; 
foreach ($_POST as $val) { 
    $name = $_POST['name'][$i]; 
    $age = $_POST['age'][$i]; 

    mysql_query("INSERT INTO users (name, age) VALUES ('$name', '$age')"); 
    $i++; 
    } 
} 

Questo risolverà il problema!

+0

Anche questo ha funzionato, grazie! –

0

Un codice un po 'più semplice che funziona bene per me.

if (isset($_POST['submit'])) { 
    $i = 0; 
    for ((array) $_POST as $val) { 
     $sql = "INSERT INTO users (name, age) VALUES (
        '{$_POST["name"][$i]}','{$_POST["age"][$i]}' 
       ); 
     mysql_query($sql); 
     echo (!mysql_affetced_rows()) ? "Query Wrong" : "Query Okay"; 
     $i++; 
    } 
    } 
0

seguito è la fxample come INSET più riga alla volta

$query_string = "INSERT INTO YOURTBL_NAME(column_1,column_2)VALUES"; 
    $data =""; 
    for($i=0;$i<count($YOUR FILE ARRAY);$i++) 
    { 
     $data .='("'.$paramater_1[$i].'","'.$paramater_2.'"),'; 
    } 
    $qry = substr($query_string.$data, 0, -1); 
    $result = mysql_query($qry); 
0
$education_institute_array = $_POST['education_institute']; 
     $education_qualification_array = $_POST['education_qualification']; 
     $education_start_date_array = $_POST['education_start_date']; 
     $education_end_date_array = $_POST['education_end_date']; 
     $education_note_array = $_POST['education_note']; 
     for ($i = 0; $i < count($education_institute_array); $i++) { 
      $education_institute = mysql_real_escape_string($education_institute_array[$i]); 
      $education_qualification = mysql_real_escape_string($education_qualification_array[$i]); 
      $education_start_date = mysql_real_escape_string($education_start_date_array[$i]); 
      $education_end_date = mysql_real_escape_string($education_end_date_array[$i]); 
      $education_note = mysql_real_escape_string($education_note_array[$i]); 
      $sql_education_insert = "INSERT INTO `education` (`user_id`, `education_institute`, `education_qualification`, `education_start_date`, `education_end_date`, `education_note`) VALUES ('$user_id', '$education_institute', '$education_qualification', '$education_start_date', '$education_end_date', '$education_note')"; 
      $sql_result_education = mysql_query($sql_education_insert); 
     } 
1
foreach($_POST['firstname'] as $key=>$value) { 
    $firstname = $_POST['firstname'][$key]; 
    $lastname = $_POST['tipo'][$key]; 
    echo "Parte: $lastname"; 
    echo "<br>"; 
    echo "Tipo: $firstname"; 
    echo "<br>"; 
} 
+0

È necessario aggiungere una spiegazione alla risposta per aiutare OP e altri lettori a comprendere questa soluzione. Le risposte al solo codice sono scoraggiate. – Goose