gpt4 book ai didi

PHP MySQL 重复条目异常 - InsertMulti 和 OnDuplicate

转载 作者:行者123 更新时间:2023-11-29 17:01:13 25 4
gpt4 key购买 nike

我正在使用 ThingEngineer/PHP-MySQLi-Database-Class,并且尝试在使用 OnDuplicate 时执行多次插入。目标是在“sku”尚不存在时插入新的产品记录。如果“sku”确实存在,则应更新“名称”而不是创建新条目。

MySQL 架构:

CREATE TABLE `products` (
`product_pk` bigint(9) NOT NULL,
`product_id` int(20) UNSIGNED NOT NULL,
`name` varchar(255) NOT NULL,
`sku` varchar(16) NOT NULL,
`category` int(10) DEFAULT NULL,
`last_update` timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

ALTER TABLE `products`
ADD PRIMARY KEY (`product_pk`),
ADD UNIQUE KEY `sku` (`sku`);

ALTER TABLE `products`
MODIFY `product_pk` bigint(9) NOT NULL AUTO_INCREMENT;

PHP:

$sDate = date("Y-m-d H:i:s");
$lastid = $db->rawQuery('SELECT MAX( product_id ) AS max FROM products');
(!$lastid || !isset($lastid[0]['max'])) ? $pid = 0 : $pid = $lastid[0]['max']++;

foreach ($data as $item){
if (isset($item['sku']) && !null == $item['sku']){
$prod[$pid]['product_id'] = $pid;
$prod[$pid]['sku'] = $item['sku'];
$prod[$pid]['name'] = substr($item['product-name'],0,255);
$prod[$pid]['last_update'] = $sDate;
$pid++;
}
}

$utfEncodedArray =encodeArray($prod, 'UTF-8');
$db->onDuplicate('name', 'product_pk');
$db->insertMulti('products', $utfEncodedArray);

function encodeArray($array, $type)
{
foreach($array as $key => $value)
{
if (is_array($value)){ $array[$key] = encodeArray($value, $type);}else{ $array[$key] = mb_convert_encoding($value, $type);}
}
return $array;
}

我收到的错误是:

Uncaught mysqli_sql_exception: Duplicate entry 'ABC123' for key 'sku'

以下是 insertMulti 调用中使用的数组 $utfEncodedArray 的示例:

Array(
[1] => Array
(
[product_id] => 1
[sku] => ABC123
[name] => product1
[last_update] => 2018-09-08 18:55:20
)
[2] => Array
(
[product_id] => 2
[sku] => ABC124
[name] => product2
[last_update] => 2018-09-08 18:55:20
)
)

到目前为止我尝试过的步骤:

  • 删除“产品”表并重新创建它。多次。
  • 尝试在 onDuplicate 调用中使用“sku”而不是“product_pk”。
  • 尝试了多种排序规则类型
  • 尝试在“sku”和“product_id”上使用唯一 key
    • 当我尝试此方法时,所有条目均已正确插入,但再次运行时它会生成重复项,而不是更新现有行。不确定这是如何发生的,因为“sku”和“product_id”都是唯一的。

$prod 数组当前包含相同的值。因此,每次运行此命令时,我都希望看到“last_updated”列在每次初始插入后都会更新。

这是我第一次使用 onDuplicate 的体验,尽管经过数小时的搜索和阅读文档,我仍然迷失方向。我试图让 db 类处理来自数组的多次插入,但我并不反对在迭代我的产品数组时尝试原始查询。

最佳答案

当然,我一发布这篇文章就发现了问题......

发现数据库类的一个分支,它解决了使用 onDuplicate 时的 insertMulti 问题:

should fix insertMulti() if onDuplicate() is set

关于PHP MySQL 重复条目异常 - InsertMulti 和 OnDuplicate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52239268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com