我使用以下代码将多个记录插入表中。如您所见,查询处于循环中。每次循环执行时,都会运行单独的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查询,并完成所有操作。
提前致谢。
答案 0 :(得分: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);
答案 1 :(得分: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');
答案 2 :(得分: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()函数的开销并节省一些带宽。
的链接