22

現在、print_r(); を介して出力すると、次のような配列があります。

Array
(
    [0] => Array
        (
            [R_ID] => 32
            [email] => a@a.com
            [name] => Bob
        )

    [1] => Array
        (
            [R_ID] => 32
            [email] => b@b.com
            [name] => Dan
        )

    [2] => Array
        (
            [R_ID] => 32
            [email] => c@c.com
            [name] => Paul
        )

    [3] => Array
        (
            [R_ID] => 35
            [email] => d@d.com
            [name] => Mike
        )  
)

このデータを、各要素の値がそれぞれのフィールドに属する 1 つのテーブルに挿入したいと思います。

現在、私の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 は、このテーブルの主キーではありません。*

この状況にどのように取り組むべきかを誰かが理解するのを手伝ってくれますか? 読んでくれてありがとう!

よろしく。

4

4 に答える 4

34

I would avoid to do a query for each entry.

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()); 
}
于 2013-02-21T22:21:34.983 に答える
9

まず、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ループで1つの文字列を作成するだけです

$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です。

于 2013-02-21T22:20:15.340 に答える
1
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'] ));
 }
于 2013-02-21T22:14:51.323 に答える