Ein merkwürdiges Problem, das mir nun schon bei 2 Magento installationen (Version 1.9.x.x) begegnet ist: ab und zu passiert es, dass Produktseiten nach dem Login nicht mehr erreichbar sind und stattdessen ein 404 error angezeigt wird. Im log (var/log/exception.log) steht dann
Next exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'xxxxx-xxx' for key 'UNQ_REPORT_VIEWED_PRODUCT_INDEX_CUSTOMER_ID_PRODUCT_ID'' in /path/to/shop/lib/Zend/Db/Statement/Pdo.php:234
Dieser Bugreport sieht ganz nach dem selben Problem aus, es scheint als wäre das ein bekanntes Problem von Magento < 2. Der Bugfix steht dann praktischerweise auch gleich mit drin, ich empfehle die Lösung von andrr ganz unten, und zwar dass man in das Magento core eingreift und folgende Datei bearbeitet: app/code/core/Mage/Reports/Model/Resource/Product/Index/Abstract.php in der save() Methode ergänzt man folgendes:
unset($data[$this->getIdFieldName()]);
//start fix
if(Mage::getSingleton('customer/session')->isLoggedIn()){
$this->updateCustomerFromVisitorByProductId($object);
}
//end fix
$matchFields = array('product_id', 'store_id');
Und fügt der Klasse die Methode updateCustomerFromVisitorByProductId hinzu:
public function updateCustomerFromVisitorByProductId(Mage_Reports_Model_Product_Index_Abstract $object)
{
/**
* Do nothing if customer not logged in
*/
if (!$object->getCustomerId() || !$object->getVisitorId() || !$object->getProductId()) {
return $this;
}
$adapter = $this->_getWriteAdapter();
$select = $adapter->select()
->from($this->getMainTable())
->where('visitor_id = ?', $object->getVisitorId())
->where('product_id = ?', $object->getProductId());
$rowSet = $select->query()->fetchAll();
foreach ($rowSet as $row) {
$select = $adapter->select()
->from($this->getMainTable())
->where('customer_id = ?', $object->getCustomerId())
->where('product_id = ?', $row['product_id']);
$idx = $adapter->fetchRow($select);
if ($idx) {
/* If we are here it means that we have two rows: one with known customer, but second just visitor is set
* One row should be updated with customer_id, second should be deleted
*/
$adapter->delete($this->getMainTable(), array('index_id = ?' => $row['index_id']));
$where = array('index_id = ?' => $idx['index_id']);
$data = array(
'visitor_id' => $object->getVisitorId(),
'store_id' => $object->getStoreId(),
'added_at' => Varien_Date::now(),
);
} else {
$where = array('index_id = ?' => $row['index_id']);
$data = array(
'customer_id' => $object->getCustomerId(),
'store_id' => $object->getStoreId(),
'added_at' => Varien_Date::now()
);
}
$adapter->update($this->getMainTable(), $data, $where);
}
return $this;
}
Bei mir hats damit dann funktioniert!