Php 删除&;在SQL PDO中插入或更新最佳实践
我试图找到一个答案,这是代码以下部分的最佳实践: 假设我对添加和编辑产品有一个操作 删除并插入Php 删除&;在SQL PDO中插入或更新最佳实践,php,sql,pdo,Php,Sql,Pdo,我试图找到一个答案,这是代码以下部分的最佳实践: 假设我对添加和编辑产品有一个操作 删除并插入 $product_id = 1; $this->db->query("DELETE FROM `product_description` WHERE `product_id` = :product_id"); $this->db->bind(array(":product_id" => $product_id)); $this->db->execute();
$product_id = 1;
$this->db->query("DELETE FROM `product_description` WHERE `product_id` = :product_id");
$this->db->bind(array(":product_id" => $product_id));
$this->db->execute();
$updateset = array(
":product_id" => $product_id,
":name" => $_POST["name"]
);
$this->db->query("INSERT INTO `product_description` SET `product_id` = :product_id, `name` = :name");
$this->db->bind($updateset);
$this->db->execute();
更新或插入
$product_id = 1;
$updateset = array(
":name" => $_POST["name"]
":product_id" => $product_id
);
$this->db->query("UPDATE `product_description` SET `name` = :name WHERE `product_id` = :product_id");
$this->db->bind($params);
$this->db->execute();
if(!$this->db->row_count()) {
$this->db->query("INSERT INTO `product_description` SET `product_id` = :product_id, `name` = :name");
$this->db->bind($updateset);
$this->db->execute();
}
那么哪一个更好呢?这个问题很不清楚,但第二个选项看起来要好得多。 主要原因是,如果您的模式发生了变化,并且最终得到的列比您已有的多,那么第一个选项将删除现有数据
另一方面,第二个选项将确保任何现有数据都保留在数据库中。这两个选项都不好 问题1: 他们都容易受到比赛条件的影响。另一个并发会话可能会在两个SQL语句之间的短时间内插入一行 问题2: 在第二种解决方案中,如果更新的行数为零,则仍可能存在匹配的行,因为当更新未更改行中的值时,它不会对行进行计数 问题3: 如果使用第一个选项,并且使用外键,则如果有任何子行引用您删除的行,则该选项将不起作用。由于子行的原因,删除将被阻止,或者您在删除级联中使用
,
,这意味着您将意外删除子行
更好的解决方案:
为product_id定义唯一约束。您的用法表明此列将是候选键(即每个product_id只能有一行)
然后使用
提示:数组不需要在列名前面加
:
。这在早期版本的PDO中是必需的,但是他们改变了它,所以这已经多年没有被要求了。如果(!$this->db->row_count())
你确定吗?@MasivuyeCokile是的为什么不?PDOStatement->rowCount-返回受上一个SQL语句影响的行数行数行数行数计数前是否看到符号?谢谢您的回答谢谢您的回答
$updateset = array(
"product_id" => $product_id,
"name" => $_POST["name"]
);
$this->db->query("INSERT INTO `product_description`
SET `product_id` = :product_id, `name` = :name
ON DUPLICATE KEY UPDATE `name` = VALUES(`name`)");
$this->db->bind($updateset);
$this->db->execute();