1

次のコードを使用して、複数のレコードをテーブルに挿入しています。ご覧のとおり、クエリはループしています。ループが実行されるたびに、別の SQL クエリが実行されて挿入されます。

複数のクエリを実行する代わりに、単一の INSERT sql クエリのみを複数の挿入ステートメントで実行するアプローチが必要です。

私のこのコードは完全に機能していますが、最適化する必要があります。

$managed_ailments = unserialize($ailments);
foreach($managed_ailments as $ailment_id)
{
    $sql = "INSERT INTO ". TABLE_PATIENTS_AILMENTS_RECORDS ."";
    $sql .= "(patient_id, ailment_id, datecreated) VALUES";
    $sql .= "($patient_id, $ailment_id, now())";
    $query = $mysql->query($sql);
}

ここで $managed_ailments は、私がシリアル化を解除したシリアル化された配列です。配列には 1 つまたは複数の値を含めることができます。$mysql->query($sql) は私のカスタム関数です。

このコードをすべて実行する単一の SQL クエリに変換するのを手伝ってください。

前もって感謝します。

4

3 に答える 3

3

このようなものが動作するはずです:

$managed_ailments = unserialize($ailments);
$sql = "INSERT INTO ". TABLE_PATIENTS_AILMENTS_RECORDS ."";
$sql .= "(patient_id, ailment_id, datecreated) VALUES (";

$query_parts = array();

foreach($managed_ailments as $ailment_id) {
    $query_parts[] = "($patient_id, $ailment_id, now()";
}
$sql .= implode(",", $query_parts);
$sql .= ")";

$query = $mysql->query($sql);
于 2012-08-15T17:36:10.747 に答える
1

プリペアドステートメントのあるMySQLi拡張機能を使用できます。テンプレートをサーバーに1回送信してから、データを送信するだけのループを解除します。

//initialize and connect $mysqli via MySQLi extension 


$sql = "INSERT INTO ". TABLE_PATIENTS_AILMENTS_RECORDS ."";
$sql .= "(patient_id, ailment_id, datecreated) VALUES";
$sql .= "(?, ?, now())";

$stmt = $mysqli->prepare($query)

$managed_ailments = unserialize($ailments);
foreach($managed_ailments as $ailment_id) {
    $stmt->bind_param("ii", $patient_id, $ailment_id);
    $stmt->execute();
}

$patient_idと$ailment_idの両方が整数であると想定していることに注意してください。また、$ queryを上書きしているため、実行されたクエリの結果を保持したくないと仮定します。

これにより、NOW()関数のオーバーヘッドが削減され、帯域幅がいくらか節約されます。

PHPMySQLiドキュメントへのリンクは次のとおりです

于 2012-08-15T17:43:07.293 に答える
1

各レコードに値ステートメントを追加してから、クエリを実行できます。つまり、次のようになります。

INSERT INTO example 
    (example_id, name, value, other_value)
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');
于 2012-08-15T17:37:17.777 に答える