pdo多次插入记录,等于数据库值

Posted

技术标签:

【中文标题】pdo多次插入记录,等于数据库值【英文标题】:Pdo inserting record multiple times, equal to database value 【发布时间】:2018-03-05 05:03:46 【问题描述】:

我有一个脚本,它可以选择数据、创建数组和插入数据(全部使用 PDO)。我遇到的唯一问题是我需要修改插入和更新的方式。

很简单,每条不同的记录都需要以重复的方式插入(这听起来很疯狂,我已经向我的团队负责人提出了这个问题,但大家一致认为我们希望每条记录都有自己的日期字段,因为只有一些将会被更新)。听起来它不应该那么困难,但我从来没有做过不使用 UPDATE ON DUPLICATE KEY 或 INSERT IGNORE 的事情。这实际上是在寻找复制某些记录。

基本上这一切都取决于我第一次选择时的orqtyc AS QUANTITY 字段。

我需要构建几个 if 语句,但主要问题是我首先需要说类似```WHILE insert count is

这有意义吗?如果不是,我可以澄清一下。

基本上我需要帮助做一些逻辑来修改我如何执行这个已经工作的插入。我可以创建我需要的 if/else 语句,但这是我需要的第一件事,因为任何将要完成的 INSERT 或 UPDATE 都必须等于该订单的数量字段。

所以基本上对于插入的每条记录,都应该插入“n”条记录。如果记录号 1 的数量为 1,则只插入 1。如果记录 2 的数量为 10,则插入该记录 10 次。

$order_ids = [];
while ($row = $ordStat->fetch(PDO::FETCH_ASSOC)) 
$order_ids[] = $row['order_id'];


if (count($order_ids) > 0) 
$placeholders = implode(',', array_fill(0, count($order_ids), '?'));
$detailStatCheck = "
    SELECT 
         invnoc as INVOICE,
         fstatc as STATUS,
         cstnoc AS DEALER,
         framec AS FRAME,
         covr1c AS COVER,
         colr1c AS COLOR ,
         extd2d AS SHIPDATE,
         orqtyc AS QUANTITY
    FROM GPORPCFL
    WHERE invnoc IN ($placeholders)
";

try 
    $detailCheck = $DB2conn->prepare($detailStatCheck);
    $detailRslt = $detailCheck->execute($order_ids);
    $count2 = $detailCheck->fetch();
    print_r($order_ids);
    print_r($count2);
 catch(PDOException $ex) 
    echo "QUERY FAILED!: " .$ex->getMessage();



while ($row2 = $detailCheck->fetch(PDO::FETCH_ASSOC))


 //IF exists and today is before expire date
 //update records = quantity, or insert

 //ELSEIF exists and today is  past expire_date, just insert number for each quantity

 //ELSE doesn't exist at all, perform below

$values = [
 ":DEALER" => $row2["DEALER"],
 ":SHIPDATE" => $row2["SHIPDATE"],
 ":QUANTITY" => $row2["QUANTITY"],
 ":INVOICE" => $row2["INVOICE"],
 ":FRAME" => $row2["FRAME"],
 ":COVER" => $row2["COVER"],
 ":COLOR" => $row2["COLOR"],
];


 $insertPlacement = "
 INSERT INTO placements_new (sku_id, group_id, dealer_id, start_date, expire_date, locations, order_num)
 SELECT 
  id, 
  sku_group_id, 
  :DEALER, 
  DATE_ADD(DATE_FORMAT(CONVERT(:SHIPDATE, CHAR(20)), '%Y-%m-%d'),INTERVAL 7 DAY) as start_date,
  DATE_ADD(DATE_FORMAT(CONVERT(:SHIPDATE, CHAR(20)), '%Y-%m-%d'),INTERVAL 127 DAY) as expire_date, 
  :QUANTITY,
  :INVOICE  
FROM skus s  
  WHERE  s.frame=:FRAME AND s.cover1=:COVER AND s.color1=:COLOR
 ";
 try
 $insert = $mysqlConn->prepare($insertPlacement);
 $insertRslt = $insert->execute($values);
 catch(PDOException $ex)
 echo "QUERY FAILED!!!: " . $ex->getMessage();
 
 

【问题讨论】:

如果表定义中有唯一字段,则不能复制记录(或整行)。解决这个问题的方法可能是为每一行添加一个新的唯一 ID。该 id 将是您的主键。因此,您复制了应用程序数据,而不是整行。使该 id 成为自动增量,因此您无需在插入语句中指定它。数据库会处理这个问题。对于您的限制(记录 2 的数量为 10),您需要在应用程序代码中实现它。检查你已经有多少,然后插入如果数量 @Nic3500 对,对不起。我应该提到我不希望这样,但除了主键之外,我在定义中没有真正唯一的字段,但在我的脚本中,我将 sku_id/dealer_id 视为基于日期的唯一索引(可能没有意义)。无论如何,这只是为每个订单提供自己记录的一种方式,所以我试图找到绕过唯一索引的最简单方法 【参考方案1】:

所以,我想多了,为 QUANTITY 值添加一个迭代器是最简单的方法

 while ($row2 = $detailCheck->fetch(PDO::FETCH_ASSOC)) 

    //IF exists and today is before expire date
    //update records = quantity, or insert
    //ELSEIF exists and today is  past expire_date, just insert number for each quantity
    //ELSE doesn't exist at all, perform below

    $values = [
        ":DEALER" => $row2["DEALER"],
        ":SHIPDATE" => $row2["SHIPDATE"],
        ":QUANTITY" => $row2["QUANTITY"],
        ":INVOICE" => $row2["INVOICE"],
        ":FRAME" => $row2["FRAME"],
        ":COVER" => $row2["COVER"],
        ":COLOR" => $row2["COLOR"],
    ];

    for($i=0; $i<$row2["QUANTITY"]; $i++) 

        try
            $insert = $MysqlConn->prepare($insertPlacement);
            $insertRslt = $insert->execute($values);
        catch(PDOException $ex)
            echo "QUERY FAILED!!!: " . $ex->getMessage();
        

    

【讨论】:

以上是关于pdo多次插入记录,等于数据库值的主要内容,如果未能解决你的问题,请参考以下文章

如果记录已存在,则为 PDO 数组

PHP MySql PDO 多次插入不起作用

如何在使用 PHP-PDO 记录查询时获取最后一个插入 ID

PDO 不能在 Access 数据库中插入新记录,但可以在同一个连接中读取和删除

Pdo - 将值插入数据库错误 SQLSTATE [HY093] [重复]

sql查询字段中所有等于某些值的数据