0

変数 $contactid に配列が格納されています。このクエリを実行して、配列内の各 contact_id の行を挿入する必要があります。これを行う最善の方法は何ですか?実行する必要があるクエリは次のとおりです...

$contactid=$_POST['contact_id'];
$eventid=$_POST['event_id'];
$groupid=$_POST['group_id'];

mysql_query($query);
$query="INSERT INTO attendance (event_id,contact_id,group_id) VALUES ('$eventid','$contactid','$groupid')";
4

5 に答える 5

3

foreachループを使用します。

$query = "INSERT INTO attendance (event_id,contact_id,group_id) VALUES ";

foreach($contactid as $value)
{
    $query .= "('{$eventid}','{$value}','{$groupid}'),";
}

mysql_query(substr($query, 0, -1));

ここでのアイデアは、クエリ文字列を連結し、データベースに対して 1 つのクエリのみを作成することです。各値セットはコンマで区切られます。

于 2012-11-28T20:57:16.407 に答える
2

誰もまだそれを述べていないので、実際にはこれを行うことはできません:

$query = '
INSERT INTO [Table] ([Column List])
VALUES ([Value List 1]);
INSERT INTO [Table] ([Column List])
VALUES ([Value List 2]);
';
mysql_query($query);

これは、mysql_query コードでの sql インジェクションを防ぐために防止されているためです。mysql_query で指定されたクエリ パラメータ内にセミコロンを含めることはできません。次の例外を除いて、マニュアルのコメントから抜粋:

ドキュメントには、「複数のクエリはサポートされていません」と記載されています。

ただし、複数のクエリがサポートされているようです。フラグ 65536 を mysql_connect の 5 パラメーター (client_flags) として渡すだけです。この値は /usr/include/mysql/mysql_com.h で定義されています。

#define CLIENT_MULTI_STATEMENTS (1UL << 16) /* マルチステートメント サポートの有効化/無効化 */

一度に複数のクエリを実行すると、mysql_query 関数は最初のクエリの結果のみを返します。他のクエリも同様に実行されますが、結果は得られません。

ただし、これは文書化されておらず、サポートされていない動作であり、コードを SQL インジェクションに対して簡単に開いてしまいます。代わりに、mysql_query でできることは次のとおりです。

$query = '
INSERT INTO [Table] ([Column List])
VALUES ([Value List 1])
     , ([Value List 2])
       [...]
     , ([Value List N])
';
mysql_query($query);

したがって、実際には、1 つのクエリと 1 つの挿入ステートメントで複数の行を挿入できます。この回答には、ループ内の文字列に連結されないコード例があります。これは、このスレッドで提案されているものよりも優れています。


ただし、上記のすべてを無視して、おそらく次のような準備済みステートメントを使用する方がよいでしょう。

$stmt->prepare("INSERT INTO mytbl (fld1, fld2, fld3, fld4) VALUES(?, ?, ?, ?)");
foreach($myarray as $row)
{
    $stmt->bind_param('idsb', $row['fld1'], $row['fld2'], $row['fld3'], $row['fld4']);
    $stmt->execute();
}
$stmt->close();
于 2012-11-28T21:05:11.763 に答える
1

次のようなものを使用してください。mysql_ *関数はもう使用しないでください。また、コードはインジェクションの影響を受けやすいことに注意してください。

for ($i = 0; $i < count($contactid); $i++) {
    $query="INSERT INTO attendance (event_id,contact_id,group_id) VALUES ('$eventid','$contactid[$i]','$groupid')";
    mysql_query($query);
}
于 2012-11-28T20:58:05.547 に答える
0

どうですか:

$contactIds = $_POST['contact_id'];
$eventIds = $_POST['event_id'];
$groupIds = $_POST['group_id'];

foreach($contactIds as $key => $value)
{
    $currentContactId = $value;
    $currentEventId = $eventIds[$key];
    $currentGroupId = $groupIds[$key];

    $query="INSERT INTO attendance (event_id,contact_id,group_id) VALUES ('$currentEventId','$currentContactId','$currentGroupId')";

    mysql_query($query);
}

それをリファクタリングして、すべてを1つのクエリに挿入することもできますが、そのアイデアは得られました。

于 2012-11-28T20:57:50.633 に答える
0

複数のクエリを実行することが最善の方法であるかどうかはわかりません。たとえば、配列の各要素に対して実行される for ループを作成することはお勧めしません。むしろ、再帰ループを作成して、新しい要素を文字列に追加し、それをクエリに渡します。DB 構造の簡単な例と、それをどのように表示するか (つまり、配列をテーブルに入れる方法) を教えていただければ、ループ構文の例を示します。

乾杯!

于 2012-11-28T20:56:55.903 に答える