2013-02-21 11 views
20

Derzeit habe ich ein Array, das wie folgt aussieht, wenn es durch print_r() ausgegeben wird;Wie man Datenfeld in mysql mit PHP einfügt

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

Ich möchte diese Daten in eine Tabelle einfügen, wobei jeder Elementwert zu seinem jeweiligen Feld gehört.

Derzeit sieht mein PHP-Code wie folgt

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

* Hinweis: R_ID ist nicht der Primärschlüssel in dieser Tabelle *

Kann mir jemand helfen zu verstehen, wie ich diese Situation nähern sollte.? Danke fürs Lesen und deine Hilfe!

Grüße.

+2

Sie sollten zuerst aufhören mit 'mysql_' Funktionen. Als nächstes sollten Sie vorbereitete Anweisungen verwenden. [Siehe diese Frage] (http://stackoverflow.com/questions/14860606/mysqli-inserting-multiple-rows-with-one-prepared-statement), wie es geht. – Kermit

Antwort

31

Ich würde vermeiden, eine Abfrage für jeden Eintrag zu tun.

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

Vielen Dank. – BaconJuice

+0

Wie wird das abgerufen? –

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

Ein besseres Beispiel Lösung mit 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

Ich würde von mehreren 'INSERT'-Anweisungen abraten. – Kermit

+0

Dies ist nur eine schnelle und schmutzige Lösung für sein Problem. –

+0

@John Ich erhalte diesen Fehler PHP Schwerwiegender Fehler: Aufruf einer Elementfunktion Prepare() auf einem Nicht-Objekt – BaconJuice

8

Zunächst einmal sollten Sie * mit mysql_ stoppen. MySQL unterstützt mehrere Einfügen wie

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

Sie haben nur eine Zeichenfolge in Ihrem foreach-Schleife zu bauen, die wie das

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

und dann legen Sie sie nach der Schleife

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

Ein anderer Weg wäre Prepared Statements, die für Ihre Situation noch besser geeignet sind.

Verwandte Themen