当我在Magento使用信用卡/借记卡订购时,我收到以下错误:
Order saving error: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '282-189' for key 2
我无法得到确切的痕迹,因为它只是不想向我显示,但是,我已经在app/code/core/Mage/Checkout/controllers/OnepageController.php
(未经编辑)上追溯到501
。确切的行是:
$this->getOnepage()->saveOrder();
现在,逻辑告诉我这只是两个在尝试添加订单时具有相同密钥的订单,或者我完全错了?
无论如何,除此之外,解决这个问题的最佳方法是什么?我曾想过导出订单,将它们全部删除,然后重新导入它们,但我觉得它不起作用。
我正在使用Magento 1.6.2.0
编辑:我刚刚意识到,如果我发现哪个表未通过完整性检查,我可能会清空该表(取决于它是哪个表),这会自行修复吗?关于如何找出哪个表格搞乱的任何想法?EDIT2:所以在OğuzÇelikdemir的回答之后,结果证明以下是罪魁祸首:
2012-03-14T13:59:01+00:00 DEBUG (7): SQL: INSERT INTO `sales_order_tax_item` (`tax_id`, `item_id`, `tax_percent`) VALUES (?, ?, ?) (254, 8, 10)
2012-03-14T13:59:01+00:00 DEBUG (7): SQL: INSERT INTO `sales_order_tax_item` (`tax_id`, `item_id`, `tax_percent`) VALUES (?, ?, ?) (254, 8, 10)
显然,无法插入两个相同的tax_id。任何人都知道如何解决它?
答案 0 :(得分:3)
截断以下log
表。为了保护自己,请从CONSOLE备份,而不是在Magento。
TRUNCATE `log_customer`;
ALTER TABLE `log_customer` AUTO_INCREMENT=1;
TRUNCATE `log_quote`;
ALTER TABLE `log_quote` AUTO_INCREMENT=1;
TRUNCATE `log_summary`;
ALTER TABLE `log_summary` AUTO_INCREMENT=1;
TRUNCATE `log_visitor_info`;
ALTER TABLE `log_visitor_info` AUTO_INCREMENT=1;
TRUNCATE `log_url`;
ALTER TABLE `log_url` AUTO_INCREMENT=1;
TRUNCATE `log_url_info`;
ALTER TABLE `log_url_info` AUTO_INCREMENT=1;
TRUNCATE `log_visitor`;
ALTER TABLE `log_visitor` AUTO_INCREMENT=1;
TRUNCATE `report_event`;
ALTER TABLE `report_event` AUTO_INCREMENT=1;
TRUNCATE `log_summary_type`;
ALTER TABLE `log_summary_type` AUTO_INCREMENT=1;
编辑:
对于SQL调试,请打开/lib/Varien/Db/Adapter/Pdo/Mysql.php
文件并查找protected $_debug
。默认状态应为false
,更改为true
。
之后,日志文件应该在var/debug/sql.txt
另外,请使用此stackoverflow ansver How do I print all the queries in Magento?
编辑2:
因此,这是处理销售物品税的文件。
app/code/core/Mage/Tax/Model/Observer/Observer.php
# Line 144 ( Magento 1.6 edition )
Mage::getModel('tax/sales_order_tax_item')->setData($data)->save();
正在调用sales_order_tax_item
模型。
app/core/Mage/Tax/Model/Resource/Sales/Order/Tax/Itemp.php
# Line 51
public function getTaxItemsByItemId($item_id)
{
$adapter = $this->_getReadAdapter();
$select = $adapter->select()
->from(array('item' => $this->getTable('tax/sales_order_tax_item')), array('tax_id', 'tax_percent'))
->join(
array('tax' => $this->getTable('tax/sales_order_tax')),
'item.tax_id = tax.tax_id',
array('title', 'percent', 'base_amount')
)
->where('item_id = ?', $item_id);
return $adapter->fetchAll($select);
}
这是从Observer调用的函数。那么,你现在可以做什么,只需在Observer或Function上添加断点并查看调试器输出。为什么两次调用这个函数!
答案 1 :(得分:2)
我发现了一个快速肮脏的黑客。我会尝试将此作为错误发布给开发人员。
打开文件app/code/core/Mmage/Tax/Model/Observer.php
并转到第132行。
在该语句中有一个if($item)
语句,将代码包装起来:
$define = 'FIX_'.$item->getId().'_'.$result->getTaxId();
if(!defined($define) || constant($define) != true) {
// code
define($define, true);
}
示例:
if (isset($ratesIdQuoteItemId[$id])) {
foreach ($ratesIdQuoteItemId[$id] as $quoteItemId) {
if ($quoteItemId['code'] == $tax['code']) {
$item = $order->getItemByQuoteItemId($quoteItemId['id']);
if ($item) {
$define = 'FIX_'.$item->getId().'_'.$result->getTaxId();
if(!defined($define) || constant($define) != true) {
$data = array(
'item_id' => $item->getId(),
'tax_id' => $result->getTaxId(),
'tax_percent' => $quoteItemId['percent']
);
Mage::getModel('tax/sales_order_tax_item')->setData($data)->save();
define($define, true);
}
}
}
}
}
答案 2 :(得分:2)
请转到“管理员面板”中的Sales -> Tax -> Manage Tax Rules
部分,并检查所有记录,以获取关系区域类的重复项。
在我的情况下,我在Checkout页面上对于具有Tax class“Taxable Goods”的产品有相同的错误,而在Tax Rules中我有两个这个类的条目,每个条目都有相同的税区。因此,系统尝试对产品适用两次相同的税。