2013-02-21 15 views
20

Obecnie mam tablicę, która wygląda następująco, gdy wyjście przez print_r();Jak wstawić tablicę danych do mysql za pomocą php

Array 
(
    [0] => Array 
     (
      [R_ID] => 32 
      [email] => [email protected] 
      [name] => Bob 
     ) 

    [1] => Array 
     (
      [R_ID] => 32 
      [email] => [email protected] 
      [name] => Dan 
     ) 

    [2] => Array 
     (
      [R_ID] => 32 
      [email] => [email protected] 
      [name] => Paul 
     ) 

    [3] => Array 
     (
      [R_ID] => 35 
      [email] => [email protected] 
      [name] => Mike 
     ) 
) 

Chciałbym wstawić te dane do jednej tabeli z każdą wartością elementu należącą do odpowiedniego pola.

Obecnie mój kod php wygląda następującym

if(is_array($EMailArr)){ 
    foreach($EMailArr as $R_ID => $email => $name){ 

    $sql = "INSERT INTO email_list (R_ID, EMAIL, NAME) values ('$R_ID', '$email', '$name')"; 
    mysql_query($sql) or exit(mysql_error()); 
    } 
} 

* Uwaga: R_ID NIE jest kluczem podstawowym w tabeli *

Czy ktoś może mi pomóc zrozumieć, w jaki sposób należy podejść do tej sytuacji.? Dziękuję za przeczytanie i pomoc!

Pozdrawiam.

+2

Powinieneś najpierw przestać używać funkcji 'mysql_'. Następnie należy użyć przygotowanych wyciągów. [Zobacz to pytanie] (http://stackoverflow.com/questions/14860606/mysqli-inserting-multiple-rows-with-one-prepared-statement) na temat tego, jak to zrobić. – Kermit

Odpowiedz

31

Unikałbym wykonywania zapytania dla każdego wpisu.

if(is_array($EMailArr)){ 

    $sql = "INSERT INTO email_list (R_ID, EMAIL, NAME) values "; 

    $valuesArr = array(); 
    foreach($EMailArr as $row){ 

     $R_ID = (int) $row['R_ID']; 
     $email = mysql_real_escape_string($row['email']); 
     $name = mysql_real_escape_string($row['name']); 

     $valuesArr[] = "('$R_ID', '$email', '$name')"; 
    } 

    $sql .= implode(',', $valuesArr); 

    mysql_query($sql) or exit(mysql_error()); 
} 
+0

Dziękuję bardzo. – BaconJuice

+0

Jak to odzyskać? –

0
if(is_array($EMailArr)){ 
    foreach($EMailArr as $key => $value){ 

    $R_ID = (int) $value['R_ID']; 
    $email = mysql_real_escape_string($value['email']); 
    $name = mysql_real_escape_string($value['name']); 

    $sql = "INSERT INTO email_list (R_ID, EMAIL, NAME) values ('$R_ID', '$email', '$name')"; 
    mysql_query($sql) or exit(mysql_error()); 
    } 
} 

Lepszym przykładem rozwiązanie z PDO:

$q = $sql->prepare("INSERT INTO `email_list` 
        SET `R_ID` = ?, `EMAIL` = ?, `NAME` = ?"); 

foreach($EMailArr as $value){ 
    $q ->execute(array($value['R_ID'], $value['email'], $value['name'])); 
} 
+0

Odradzam wiele instrukcji 'INSERT'. – Kermit

+0

To tylko szybkie i brudne rozwiązanie jego problemu. –

+0

@John Otrzymuję ten błąd PHP Błąd krytyczny: Zadzwoń do funkcji członkowskiej prepare() na obiekcie nie będącym obiektem obiektu. – BaconJuice

8

Przede wszystkim należy przestać używać mysql_ *. MySQL obsługuje wielokrotne wstawianie jak

INSERT INTO example 
VALUES 
    (100, 'Name 1', 'Value 1', 'Other 1'), 
    (101, 'Name 2', 'Value 2', 'Other 2'), 
    (102, 'Name 3', 'Value 3', 'Other 3'), 
    (103, 'Name 4', 'Value 4', 'Other 4'); 

Po prostu trzeba zbudować jeden ciąg w pętli foreach, która wygląda tak

$values = "(100, 'Name 1', 'Value 1', 'Other 1'), (100, 'Name 1', 'Value 1', 'Other 1'), (100, 'Name 1', 'Value 1', 'Other 1')"; 

a następnie włóż ją po pętli

$sql = "INSERT INTO email_list (R_ID, EMAIL, NAME) VALUES ".$values; 

Innym sposobem będzie Prepared Statements, które są jeszcze bardziej dostosowane do twojej sytuacji.

Powiązane problemy