Create_at (customer_entity tablosu) neden güncelleme sırasında değişecek şekilde ayarlandı?


19

Yapısına baktığınızda customer_entitytabloda, ben fark created_atalan bu özellik vardır: on update CURRENT_TIMESTAMP. Böylece satır her güncellendiğinde created_atzaman damgası değişir.

Görünüşe göre bu özellik updated_atsahada değil created_atsahada olmalıdır. Bu tablonun EAV yapısı nedeniyle doğrudan değiştirilmesinin nadir olduğunu biliyorum, ancak yine de created_atalanı değiştirmek yanlış görünüyor .

Bu tablo yapısının bir nedeni var mı, yoksa sadece bir hata mı?

Düzenleme: Bunun için Magento onaylanmış bir hata raporu buldum. Sayı # 27944. Maalesef görüntülemek için giriş yapmalısınız. http://www.magentocommerce.com/bug-tracking/issue?issue=13882


2
İyi soru. Ben bu tablolar aynı durumda olduğunu ekleyebiliriz: cron_schedule, api_user, admin_user, customer_entity_address, downloadable_link_purchased, downloadable_link_purchased_item, index_event, eav_entity log_customer, sales_flat_quote_address, sales_flat_quote, sales_flat_quote_address_item, sales_flat_quote_payment, sales_flat_quote_shipping_rate, sales_recurring_profile. Başkaları da olabilir. Bunları ararken bir noktada ilgimi kaybettim.
Marius

sales_flat_quoteÖnce fark ettim , sonra kontrol ettim customer_entity. Bunu fark ettik, çünkü bazı raporlarımız hiçbir anlam ifade etmiyordu. Bu gerçekten bir hata olabilir mi?
Ryre

Bence bu sadece bir hata.
Dmytro Zavalkin

Bunun üzerinde çalışabileceğimiz bir yol var mı? Üzgünüm ben bir acemi ve aynı sorunla karşı karşıyayım çünkü 1.7.0.2'den 1.8.1'e yükseltildi Veritabanındaki alanı düzenlemeyi denemekten neredeyse korkuyorum. Yardımcı olabilir umut !! Teşekkürler Jinal
Jinal

@Jinal, en iyi seçeneğiniz değişiklikleri mysql ile yapmaktır. Daha fazla ayrıntı için Marius'un cevabını kontrol edin ve önce veritabanınızı yedeklediğinizden emin olun!
Ryre

Yanıtlar:


22

İşte bulduğum şey. Sorun yalnızca Magento CE 1.6+ (ve eşleşen EE sürümlerinde) ortaya çıkıyor. Çünkü mysql ile birlikte DDL kullanan yeni yükleme / yükseltme komut dosyaları.
1.6'dan önceki sürümlerde created_atve updated_atsütunları şöyle görünür:

`created_at` datetime NOT NULL default '0000-00-00 00:00:00',
`updated_at` datetime NOT NULL default '0000-00-00 00:00:00', 

1.6+ sürümünde ddl şuna benzer:

    ->addColumn('created_at', Varien_Db_Ddl_Table::TYPE_TIMESTAMP, null, array(
        'nullable'  => false,
        ), 'Created At')
    ->addColumn('updated_at', Varien_Db_Ddl_Table::TYPE_TIMESTAMP, null, array(
        'nullable'  => false,
        ), 'Updated At')

ve üretir:

`created_at` timestamp NOT NULL COMMENT 'Created At',
`updated_at` timestamp NOT NULL COMMENT 'Updated At',

Fark, defaultdeğerin eksik olmasıdır.
Ve burada tarif edildiği gibi ,

Ne DEFAULT CURRENT_TIMESTAMP ne de ON UPDATE CURRENT_TIMESTAMP ile, hem DEFAULT CURRENT_TIMESTAMP hem de ON UPDATE CURRENT_TIMESTAMP belirtmekle aynı değildir.

Ve MySQL CURRENT_TIMESTAMPvarsayılan olarak veya için yalnızca bir zaman damgası sütununa izin verdiğinden on update, created_atsütun bu şekilde sonuçlanır.

Bu kesinlikle bir Magento hatası.


1
Magento'dan bu konuda bir güncelleme oldu mu? böcek hala yeni durumda görünüyor.
Laura

@Laura, cevaptaki hata izleme bağlantısı hala açık görünüyor (neredeyse 2 yıl!).
Ryre

2
Magento 1.9'da, oluşturulan_at sütunu şunu söylüyor: created_atzaman damgası , NUR DEFAULT CURRENT_TIMESTAMP ÜZERİNDE GÜNCELLEŞTİRME CURRENT_TIMESTAMP COMMENT 'Oluşturulma Tarihi'. Ve sürüm notlarında, "" tarihten bu yana müşteri "doğru."
MagePsycho

EE için 1.6 ÖNCE sürümleri etkiliyor, EE 1.13 var ve şöyle görünüyor: `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Created At'
doc_id

4

Her şeyden önce, veritabanında neler olduğunu görmek için Marius'un cevabını okuyun.

Sadece, modellerinin düzgün bir şekilde uzandığı takdirde çoğu geliştiricinin bu problemle karşılaşmayacağından bahsetmek istedim Mage_Core_Model_Abstract. Yığın şöyle görünür:

  1. Your_Model::save aramalar
  2. Mage_Core_Model_Abstract::save aramalar
  3. Mage_Eav_Model_Entity_Abstract::save aramalar
  4. Mage_Eav_Model_Entity_Abstract::_beforeSave aramalar
  5. Mage_Eav_Model_Entity_Abstract::walkAttributes aramalar
  6. Mage_Eav_Model_Entity_Attribute_Backend_Time_Created::beforeSave

Bu şunları yapar:

$attributeCode = $this->getAttribute()->getAttributeCode();
$date = $object->getData($attributeCode);
if (is_null($date)) {
    if ($object->isObjectNew()) {
        $object->setData($attributeCode, Varien_Date::now());
    }
}

Bunun hem CE> = 1.8.x hem de EE> = 1.13.x'teki bazı yerel ayarlarda sorun yaşayabileceğini unutmayın.


2

Biz de bu hatayı bulduk ve bunun ABD ve Avrupa tarih kodlaması arasındaki farka dayandığını düşünüyoruz.

Amerika Birleşik Devletleri'nde tarihler AA-GG-YYYY olarak yazılır. (02-10-2015 = 10 Şubat 2015). Ancak Avrupa'da ve diğer birçok yerde, tarihler DD-AA-YYYY olarak yazılır. (02-10-2015 = 2 Ekim 2015 veya 2 Ekim 2015).

Magento ABD merkezli olsa da, gelişimin çoğu Ukrayna'daki programcılar tarafından yapıldı. 

Bu hatayı ücretsiz bir Magento uzantısıyla düzelttik (böylece herhangi bir Magento Temel Kodunu değiştirmek zorunda değilsiniz). Sitemize ücretsiz olarak indirdik: http://www.CustomerParadigm.com/download/Magento-Date-Switch-Fix-Extension.zip

Bunu blogumuzda daha ayrıntılı olarak ele aldım: http://www.customerparadigm.com/magento-bug-magento-customer-create-date-juxtaposition/


1
Blog yazısı ve modül burada SE yazıdan alınmıştır
Tyler V.

-1

ce 1.9 ce 1.8.1 hata düzeltmek var Aşağıda fark: resim açıklamasını buraya girin


1
Buradaki yeni kod bu soruna yönelik bir düzeltme değildir. Sadece bir "DDDD-GG-GG DD: DD: DD" biçimini doğrular veya null değerini döndürür. Bu null hala veritabanına çarpar ve varsayılan sütun değeri ne olursa olsun olur.
Tyler V.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.