Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 删除&;在SQL PDO中插入或更新最佳实践_Php_Sql_Pdo - Fatal编程技术网

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();