为什么这段代码会插入重复的数据集?
这是传递给函数的 $franchises
数组 (2 = count($franchises)
):
(
[0] => Array
(
[franchise_id] => 3
[franchisor_id] => 3
[franchise_name] => Fitness Freaks
)
[1] => Array
(
[franchise_id] => 4
[franchisor_id] => 3
[franchise_name] => Gyms Galore
)
)
下面是使用 for 循环
将数据插入表中的函数:
public static function setLeadData($franchises)
{
try
{
$db = static::getDB();
$sql = "INSERT INTO leads_franchises SET
franchise_id = :franchise_id,
franchisor_id = :franchisor_id,
franchise_name = :franchise_name";
$stmt = $db->prepare($sql);
for($i = 0; $i < count($franchises); $i++)
{
$result = $stmt->execute([
':franchise_id' => $franchises[$i]['franchise_id'],
':franchisor_id' => $franchises[$i]['franchisor_id'],
':franchise_name' => $franchises[$i]['franchise_name']
]);
}
return $result;
}
catch(PDOException $e)
{
echo $e->getMessage();
exit();
}
}
下面是使用 foreach 循环
的相同函数。它还插入重复的数据集(计数为 1 的数组插入 2 个相同的行,计数为 2 个插入 2 组相同的行,插入 3 个 6,等等):
public static function setLeadData($franchises)
{
try
{
$db = static::getDB();
$sql = "INSERT INTO leads_franchises SET
franchise_id = :franchise_id,
franchisor_id = :franchisor_id,
franchise_name = :franchise_name";
$stmt = $db->prepare($sql);
foreach($franchises as $franchise)
{
$result = $stmt->execute([
':franchise_id' => $franchise['franchise_id'],
':franchisor_id' => $franchise['franchisor_id'],
':franchise_name' => $franchise['franchise_name']
]);
}
return $result;
}
catch(PDOException $e)
{
echo $e->getMessage();
exit();
}
}
这是在 foreach 循环
中包含 MySQL 组件的函数:
public static function setLeadData($franchises)
{
try
{
$db = static::getDB();
foreach($franchises as $franchise)
{
$sql = "INSERT INTO leads_franchises SET
franchise_id = :franchise_id,
franchisor_id = :franchisor_id,
franchise_name = :franchise_name";
$stmt = $db->prepare($sql);
$result = $stmt->execute([
':franchise_id' => $franchise['franchise_id'],
':franchisor_id' => $franchise['franchisor_id'],
':franchise_name' => $franchise['franchise_name']
]);
}
return $result;
}
catch(PDOException $e)
{
echo $e->getMessage();
exit();
}
}
这是在 foreach 循环
中使用 stmt = $db->prepare($sql)
的函数:
public static function setLeadData($franchises)
{
try
{
$db = static::getDB();
$sql = "INSERT INTO leads_franchises SET
franchise_id = :franchise_id,
franchisor_id = :franchisor_id,
franchise_name = :franchise_name";
foreach($franchises as $franchise)
{
$stmt = $db->prepare($sql);
$result = $stmt->execute([
':franchise_id' => $franchise['franchise_id'],
':franchisor_id' => $franchise['franchisor_id'],
':franchise_name' => $franchise['franchise_name']
]);
}
return $result;
}
catch(PDOException $e)
{
echo $e->getMessage();
exit();
}
}
(编辑添加):这是在 foreach 循环
中使用 bindParam
的函数:
public static function setLeadData($franchises)
{
try
{
$db = static::getDB();
$sql = "INSERT INTO leads_franchises (franchise_id, franchisor_id, franchise_name)
VALUES (:franchise_id, :franchisor_id, :franchise_name)";
$stmt = $db->prepare($sql);
foreach($franchises as $franchise)
{
$stmt->bindParam(':franchise_id', $franchise['franchise_id']);
$stmt->bindParam(':franchisor_id', $franchise['franchisor_id']);
$stmt->bindParam(':franchise_name', $franchise['franchise_name']);
$result = $stmt->execute();
}
return $result;
}
catch(PDOException $e)
{
echo $e->getMessage();
exit();
}
}
每个版本都产生相同的副本。
显然,我很沮丧。我真的很感激理解这段代码为什么以及如何导致重复。
非常感谢任何帮助!
函数执行后的表:
更新
为了帮助可能遇到此问题的任何人,我想发布重复的原因。正如 Ermat Kiyomov 所证明的那样,功能码正确。
错误在 Ajax 代码中。表单提交了两次。 Chris Sercombe提供的解决方案是here.
除了e.preventDefault()
,我还需要添加e.stopImmediatePropagation
。 More info here.
jQuery Ajax 的提交部分如下所示:
$("#form").submit(function(e) {
e.preventDefault();
e.stopImmediatePropagation();
....
最佳答案
我测试了以下示例,没有出现重复:
class Franchises
{
protected static function getDB()
{
$conn = NULL;
try
{
$conn = new PDO("mysql:host=127.0.0.1;dbname=franchises_db", "dbuser", "dbpassword");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
echo $e->getMessage();
exit();
}
return $conn;
}
public static function setLeadData($franchises)
{
try
{
$db = static::getDB();
$sql = "INSERT INTO leads_franchises SET
franchise_id = :franchise_id,
franchisor_id = :franchisor_id,
franchise_name = :franchise_name";
$stmt = $db->prepare($sql);
foreach($franchises as $franchise)
{
$result = $stmt->execute([
':franchise_id' => $franchise['franchise_id'],
':franchisor_id' => $franchise['franchisor_id'],
':franchise_name' => $franchise['franchise_name']
]);
}
return $result;
}
catch(PDOException $e)
{
echo $e->getMessage();
exit();
}
}
}
$vals = [
[
"franchise_id" => 3,
"franchisor_id" => 3,
"franchise_name" => "Fitness Freaks"
],
[
"franchise_id" => 4,
"franchisor_id" => 3,
"franchise_name" => "Gyms Galore"
]
];
Franchises::setLeadData($vals);
leads_franchises 表的创建代码是:
CREATE TABLE `leads_franchises` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`franchise_id` INT(11) NULL DEFAULT '0',
`franchisor_id` INT(11) NULL DEFAULT '0',
`franchise_name` VARCHAR(128) NULL DEFAULT '',
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
关于php - 插入表中的重复数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48488420/