2013-02-21 131 views
20

目前我有一个数组,看起来像下面时输出通过print_r();如何插入数组数据到MySQL使用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 
     ) 
) 

我想插入这个数据到一个表中,每个元素值属于其各自的字段。

目前我的PHP代码如下所示

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

*注:R_ID不在此表的主键*

有人可以帮助我了解我应该怎么处理这个情况?感谢您的阅读和您的帮助!

问候。

+2

您应该先停止使用'mysql_'函数。 接下来,您应该使用预准备语句。 [看这个问题](http://stackoverflow.com/questions/14860606/mysqli-inserting-multiple-rows-with-one-prepared-statement)如何做到这一点。 – Kermit 2013-02-21 22:15:06

回答

31

我会避免做每个条目的查询。

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

非常感谢。 – BaconJuice 2013-02-22 14:07:16

+0

如何检索? – 2016-02-22 18:31:37

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

与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

我会建议不要使用多个INSERT语句。 – Kermit 2013-02-21 22:15:25

+0

这只是他的问题的一个快速和肮脏的解决方案。 – 2013-02-21 22:15:57

+0

@John我得到这个错误PHP致命错误:调用一个非对象的成员函数prepare() – BaconJuice 2013-02-21 23:06:24

8

首先,你应该停止使用mysql_ *。 MySQL支持多种插入像

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

你只需要建立一个字符串在你的foreach循环,它看起来像那

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

,然后在循环后插入

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

另一种方法是Prepared Statements,它更适合您的情况。