2013-08-09 18 views
5

Mam problem, gdy chcę wstawić wiele pól do jednej tabeli.wstawianie wielu pól przy użyciu pętli foreach

Oto moja postać:

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

A oto kod złożyć:

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

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

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

Zapytanie wstawia do bazy danych, ale nie wartości, które mam wpisane.

Czy ktoś może mi pomóc?

+1

ktoś SQL injection? – Mike

+0

Tak, naprawię to później, po prostu muszę to teraz naprawić –

Odpowiedz

13

Robisz foreach na $_POST, a nie na tablicach nazw/wiekowych. należy robić foreach na nazwę lub tablicy wiekowej tak:

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

Chciałbym również zauważyć, że obecnie jesteś podatna na SQL injection więc dodałem etap ucieczki struny na nazwisko/wiek.

Chciałbym również zasugerować po prostu zrobienie pojedynczej wkładki luzem w DB zamiast wkładki każdego rekordu indywidualnie (pozostawiam to do wykonania). Takie podejście jest prawie zawsze preferowane z punktu widzenia wydajności.

Wreszcie, NAPRAWDĘ nie powinieneś używać funkcji mysql_*, ponieważ są przestarzałe. Rozważ zmianę na mysqli lub PDO.

+0

Dzięki! To naprawdę działało! –

+0

DZIĘKI DUŻO MIKE! – falcon

+0

Dzięki. ale mam problemy z rozwiązaniem. – 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++; 
    } 
} 

To rozwiąże Twój problem!

+0

To też zadziałało, dzięki! –

0

Trochę łatwiejszy kod, który działa dobrze dla mnie.

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

poniżej jest fxample jak wstawka wielu wierszy naraz

$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

Powinieneś dodać wyjaśnienie swojej odpowiedzi, aby pomóc OP i innym czytelnikom zrozumieć to rozwiązanie. Odpowiedzi tylko na kod są odradzane. – Goose

Powiązane problemy