将Magento从1.7升级到1.8(有一些第三个扩展名),我无法再保存产品。每当我保存产品时,我都会收到此错误:
SQL错误:SQLSTATE [21S01]:插入值列表与列列表不匹配:1136列数与第1行的值计数不匹配
通过调试技术,我可以找到错误查询:
SQL QUERY:
INSERT INTO `catalogrule_product_price`
SELECT NULL AS `rule_product_price_id`,
`dates`.`rule_date`,
`t`.`customer_group_id`,
`t`.`product_id`,
MIN(rule_price) AS `rule_price`,
1 AS `website_id`,
`t`.`latest_start_date`,
`t`.`earliest_end_date`
FROM
(SELECT `cppt`.`customer_group_id`,
`cppt`.`product_id`,
CASE WHEN IFNULL((@group_id), 'N/A') != cppt.grouped_id THEN @price := CASE `cppt`.`action_operator` WHEN 'to_percent' THEN cppt.price * cppt.action_amount/100 WHEN 'by_percent' THEN cppt.price * (1 - cppt.action_amount/100) WHEN 'to_fixed' THEN IF((cppt.action_amount < cppt.price), cppt.action_amount, cppt.price) WHEN 'by_fixed' THEN IF((0 > cppt.price - cppt.action_amount), 0, cppt.price - cppt.action_amount) END WHEN IFNULL((@group_id), 'N/A') = cppt.grouped_id AND IFNULL((@action_stop), 0) = 0 THEN @price := CASE `cppt`.`action_operator` WHEN 'to_percent' THEN @price * cppt.action_amount/100 WHEN 'by_percent' THEN @price * (1 - cppt.action_amount/100) WHEN 'to_fixed' THEN IF((cppt.action_amount < @price), cppt.action_amount, @price) WHEN 'by_fixed' THEN IF((0 > @price - cppt.action_amount), 0, @price - cppt.action_amount) END ELSE @price := @price END AS `rule_price`, `cppt`.`from_date` AS `latest_start_date`, `cppt`.`to_date` AS `earliest_end_date`, CASE WHEN IFNULL((@group_id), 'N/A') != cppt.grouped_id THEN @action_stop := cppt.action_stop WHEN IFNULL((@group_id), 'N/A') = cppt.grouped_id THEN @action_stop := IFNULL((@action_stop), 0) + cppt.action_stop END, @group_id := cppt.grouped_id,
`cppt`.`from_time`,
`cppt`.`to_time`
FROM
`catalogrule_product_price_tmp` AS `cppt`
ORDER BY `cppt`.`grouped_id` ASC,
`cppt`.`sort_order` ASC,
`cppt`.`rule_product_id` ASC) AS `t` INNER JOIN (SELECT DATE_ADD(FROM_UNIXTIME(1382202000), INTERVAL -1 DAY) AS rule_date UNION SELECT FROM_UNIXTIME(1382202000) AS rule_date UNION SELECT DATE_ADD(FROM_UNIXTIME(1382202000), INTERVAL 1 DAY) AS rule_date) AS `dates` ON 1=1 WHERE (UNIX_TIMESTAMP(dates.rule_date) >= from_time) AND (IF((to_time = 0), 1, UNIX_TIMESTAMP(dates.rule_date) <= to_time))
GROUP BY `customer_group_id`, `product_id`, `dates`.`rule_date`;
你能指出我为什么这个查询有这个错误吗?谢谢!
更新:原因是TBT Rewards模块在catalogrule_product_price表中添加了一个名为“rules_hash”的列。
答案 0 :(得分:1)
刚刚为朋友的网站升级到1.9.2.2并遇到此问题,我在文件中放置了以下补丁,
[Magento的/应用程序/代码/核心/法师/ CatalogRule /型号/动作/索引/ Refresh.php]
我不能说可能存在什么样的onflow效果,如果当然覆盖了这个文件,未来的更新必须小心不要错过这个功能,但要开始添加行:
'rules_hash' => new Zend_Db_Expr('NULL'),
使select语句看起来如下:
$select = $this->_connection->select()
->from($indexSelect, array())
->joinInner(
array(
'dates' => $this->_connection->select()->union(
array(
new Zend_Db_Expr(
'SELECT ' . $this->_connection->getDateAddSql(
$this->_connection->fromUnixtime($time),
-1,
Varien_Db_Adapter_Interface::INTERVAL_DAY
) . ' AS rule_date'
),
new Zend_Db_Expr('SELECT ' . $this->_connection->fromUnixtime($time) . ' AS rule_date'),
new Zend_Db_Expr(
'SELECT ' . $this->_connection->getDateAddSql(
$this->_connection->fromUnixtime($time),
1,
Varien_Db_Adapter_Interface::INTERVAL_DAY
) . ' AS rule_date'
),
)
)
),
'1=1',
array()
)
->columns(
array(
'rule_product_price_id' => new Zend_Db_Expr('NULL'),
'rule_date' => 'dates.rule_date',
'customer_group_id' => 'customer_group_id',
'product_id' => 'product_id',
'rule_price' => 'MIN(rule_price)',
'website_id' => new Zend_Db_Expr($website->getId()),
'latest_start_date' => 'latest_start_date',
'earliest_end_date' => 'earliest_end_date',
/**
Added because rules_hash was created by some module and not handled properly,
see http://stackoverflow.com/questions/19480415/whats-wrong-with-this-magento-query
*/
'rules_hash' => new Zend_Db_Expr('NULL'),
)
)
->where(new Zend_Db_Expr($this->_connection->getUnixTimestamp('dates.rule_date') . " >= from_time"))
->where(
$this->_connection->getCheckSql(
new Zend_Db_Expr('to_time = 0'),
new Zend_Db_Expr(1),
new Zend_Db_Expr($this->_connection->getUnixTimestamp('dates.rule_date') . " <= to_time")
)
)
->group(array('customer_group_id', 'product_id', 'dates.rule_date'));
return $select;
答案 1 :(得分:1)
关注@Dale Holborow还会在app \ code \ community \ TBT \ Rewards \ Model \ Observer \ Catalog \ Product \ Flat \ Update \ Product.php
中替换以下代码 if ($product) {
$target_product_id = $product->getEntityId ();
if (! $target_product_id)
$target_product_id = null;
//if no product id
//available, reset our assumption because this must be some other
//unrecognized request.
}
替换为
if ( $product ) {
if ($product instanceof Mage_Catalog_Model_Product) {
$target_product_id = $product->getEntityId();
} elseif(is_numeric($product)) {
$target_product_id = $product;
}
if ( ! $target_product_id )
$target_product_id = null;
}
答案 2 :(得分:0)
您是否确定了哪个扩展程序正在生成该查询?似乎insert语句没有考虑catalogrule_product_price表中的任何新字段。您可以通过将INSERT限制为特定列来修复它:
INSERT INTO `catalogrule_product_price`
VALUES (rule_product_price_id, rule_date, customer_group_id, product_id, rule_price, website_id, latest_start_date, earliest_end_date)
SELECT NULL AS `rule_product_price_id`,
`dates`.`rule_date`,
`t`.`customer_group_id`,
`t`.`product_id`,
MIN(rule_price) AS `rule_price`,
1 AS `website_id`,
`t`.`latest_start_date`,
`t`.`earliest_end_date`
FROM
(SELECT `cppt`.`customer_group_id`,
`cppt`.`product_id`,
CASE WHEN IFNULL((@group_id), 'N/A') != cppt.grouped_id THEN @price := CASE `cppt`.`action_operator` WHEN 'to_percent' THEN cppt.price * cppt.action_amount/100 WHEN 'by_percent' THEN cppt.price * (1 - cppt.action_amount/100) WHEN 'to_fixed' THEN IF((cppt.action_amount < cppt.price), cppt.action_amount, cppt.price) WHEN 'by_fixed' THEN IF((0 > cppt.price - cppt.action_amount), 0, cppt.price - cppt.action_amount) END WHEN IFNULL((@group_id), 'N/A') = cppt.grouped_id AND IFNULL((@action_stop), 0) = 0 THEN @price := CASE `cppt`.`action_operator` WHEN 'to_percent' THEN @price * cppt.action_amount/100 WHEN 'by_percent' THEN @price * (1 - cppt.action_amount/100) WHEN 'to_fixed' THEN IF((cppt.action_amount < @price), cppt.action_amount, @price) WHEN 'by_fixed' THEN IF((0 > @price - cppt.action_amount), 0, @price - cppt.action_amount) END ELSE @price := @price END AS `rule_price`, `cppt`.`from_date` AS `latest_start_date`, `cppt`.`to_date` AS `earliest_end_date`, CASE WHEN IFNULL((@group_id), 'N/A') != cppt.grouped_id THEN @action_stop := cppt.action_stop WHEN IFNULL((@group_id), 'N/A') = cppt.grouped_id THEN @action_stop := IFNULL((@action_stop), 0) + cppt.action_stop END, @group_id := cppt.grouped_id,
`cppt`.`from_time`,
`cppt`.`to_time`
FROM
`catalogrule_product_price_tmp` AS `cppt`
ORDER BY `cppt`.`grouped_id` ASC,
`cppt`.`sort_order` ASC,
`cppt`.`rule_product_id` ASC) AS `t` INNER JOIN (SELECT DATE_ADD(FROM_UNIXTIME(1382202000), INTERVAL -1 DAY) AS rule_date UNION SELECT FROM_UNIXTIME(1382202000) AS rule_date UNION SELECT DATE_ADD(FROM_UNIXTIME(1382202000), INTERVAL 1 DAY) AS rule_date) AS `dates` ON 1=1 WHERE (UNIX_TIMESTAMP(dates.rule_date) >= from_time) AND (IF((to_time = 0), 1, UNIX_TIMESTAMP(dates.rule_date) <= to_time))
GROUP BY `customer_group_id`, `product_id`, `dates`.`rule_date`;