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 是一个序列化的数组,我已经反序列化了。数组中可以有一个或多个值。$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

您可以为每个记录添加一个值语句然后执行查询,即:

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 回答
1

您可以使用已准备好的语句的 MySQLi 扩展。您将模板一次发送到服务器,然后循环发送数据。

//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() 函数的开销并节省一些带宽。

这是PHP MySQLi 文档的链接

于 2012-08-15T17:43:07.293 回答