Dlaczego parametr create_at (tabela_klienta) ma się zmieniać podczas aktualizacji?

19

Patrząc na strukturę customer_entitytabeli, zauważyłem, że created_atpole ma ten atrybut: on update CURRENT_TIMESTAMP. Dlatego przy każdej aktualizacji wiersza created_atzmienia się znacznik czasu.

Wygląda na to, że ten atrybut powinien istnieć na updated_atpolu, a nie na created_atpolu. Wiem, że rzadko zdarza się, aby ta tabela była modyfikowana bezpośrednio ze względu na strukturę EAV, ale nadal wydaje się niewłaściwe modyfikowanie created_atpola.

Czy istnieje powód dla takiej struktury tabeli, czy to tylko błąd?

Edycja: Znalazłem w tym celu zgłoszenie błędu z Magento. Wydanie # 27944. Niestety musisz się zalogować, aby go zobaczyć. http://www.magentocommerce.com/bug-tracking/issue?issue=13882

Ryre
źródło
2
Dobre pytanie. Dodam, że te tabele są w takiej samej sytuacji: 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. Mogą być też inni. W pewnym momencie straciłem zainteresowanie, szukając ich.
Marius
sales_flat_quoteNajpierw zauważyłem , a potem sprawdziłem customer_entity. Właśnie to zauważyliśmy, ponieważ niektóre z naszych raportów nie miały żadnego sensu. Czy to naprawdę może być błąd?
Ryre
Wierzę, że to tylko błąd.
Dmytro Zavalkin 24.04.13
Czy mogę w jakiś sposób obejść ten problem? Przykro mi, że jestem nowicjuszem i mam ten sam problem, ponieważ zaktualizowałem system z wersji 1.7.0.2 do wersji 1.8.1. Obawiam się, że spróbuję edytować pole w bazie danych. Mam nadzieję, że możesz pomóc !! Dzięki Jinal
Jinal
@Jinal, najlepszą opcją jest wprowadzenie zmian za pomocą mysql. Sprawdź odpowiedź Mariusa, aby uzyskać więcej informacji, i najpierw wykonaj kopię zapasową bazy danych!
Ryre

Odpowiedzi:

22

Oto co znalazłem. Problem pojawia się tylko w Magento CE 1.6+ (i pasujących wersjach EE). Wynika to z nowych skryptów instalacji / aktualizacji korzystających z DDL w połączeniu z mysql.
W wersjach wcześniejszych niż 1.6 tak wyglądały kolumny created_ati updated_at:

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

W wersji 1.6+ ddl wygląda następująco:

    ->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')

i generuje:

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

Różnica polega na tym, że defaultbrakuje wartości.
I, jak opisano tutaj ,

Bez DEFAULT CURRENT_TIMESTAMP ani ON UPDATE CURRENT_TIMESTAMP, jest to to samo, co określenie zarówno DEFAULT CURRENT_TIMESTAMP, jak i ON UPDATE CURRENT_TIMESTAMP.

A ponieważ MySQL dopuszcza tylko jedną kolumnę ze znacznikiem czasu CURRENT_TIMESTAMPjako domyślną lub dla on update, created_atkolumna kończy się w ten sposób.

To zdecydowanie błąd Magento.

Marius
źródło
1
czy była jakaś aktualizacja Magento na ten temat? wygląda na to, że błąd jest nadal w nowym stanie.
Laura
@Laura, link śledzenia błędów w odpowiedzi wciąż pokazuje się jako otwarty (już prawie 2 lata!).
Ryre,
2
W Magento 1.9 kolumna utworzona_at mówi: created_atznacznik czasu NIE NULL DOMYŚLNY CURRENT_TIMESTAMP W AKTUALIZACJI CURRENT_TIMESTAMP KOMENTARZ „Utworzono o”. W informacjach o wersji wspomniano, że „data„ klienta od ”jest poprawna”.
MagePsycho
W przypadku EE ma to wpływ na wersje PRZED 1.6, mam EE 1.13 i wygląda to tak: `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Created At'
doc_id
4

Przede wszystkim przeczytaj odpowiedź Mariusa, aby zobaczyć, co dzieje się w bazie danych.

Chciałem tylko wspomnieć, że większość programistów nie napotka tego problemu, jeśli ich model odpowiednio się rozszerzy Mage_Core_Model_Abstract. Stos wygląda następująco:

  1. Your_Model::save połączenia
  2. Mage_Core_Model_Abstract::save połączenia
  3. Mage_Eav_Model_Entity_Abstract::save połączenia
  4. Mage_Eav_Model_Entity_Abstract::_beforeSave połączenia
  5. Mage_Eav_Model_Entity_Abstract::walkAttributes połączenia
  6. Mage_Eav_Model_Entity_Attribute_Backend_Time_Created::beforeSave

Robi to:

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

Pamiętaj, że może to powodować problemy z niektórymi lokalizacjami zarówno w CE> = 1.8.x, jak i EE> = 1.13.x.

Tyler V.
źródło
2

My także znaleźliśmy ten błąd i uważamy, że jest on oparty na różnicy między amerykańskim a europejskim kodowaniem daty.

W Stanach Zjednoczonych daty są zapisywane MM-DD-RRRR. (02-10-2015 = 10 lutego 2015). Ale w Europie i wielu innych miejscach daty są zapisywane DD-MM-RRRR. (02-10-2015 = 2 października 2015 lub 2 października 2015).

Chociaż Magento ma siedzibę w Stanach Zjednoczonych, większość prac rozwojowych została wykonana przez programistów na Ukrainie. 

Naprawiliśmy ten błąd za pomocą bezpłatnego rozszerzenia Magento (abyś nie musiał zmieniać żadnego kodu podstawowego Magento). Udostępniliśmy go na naszej stronie do bezpłatnego pobrania: http://www.CustomerParadigm.com/download/Magento-Date-Switch-Fix-Extension.zip

Omówiłem to bardziej szczegółowo na naszym blogu tutaj: http://www.customerparadigm.com/magento-bug-magento-customer-create-date-juxtaposition/

Jeff Finkelstein
źródło
1
Blog i moduł zostały właśnie pobrane z mojego postu SE tutaj: magento.stackexchange.com/a/31225
Tyler V.
-1

ce 1.9 naprawiłem błąd w ce 1.8.1 Poniżej znajduje się różnica: wprowadź opis zdjęcia tutaj

użytkownik12529
źródło
1
Nowy kod tutaj nie jest rozwiązaniem tego problemu. Sprawdza tylko format „DDDD-DD-DD DD: DD: DD” lub zwraca wartość null. Ta wartość null nadal będzie trafiać do bazy danych i stanie się taką, jaka jest domyślna wartość dla kolumn.
Tyler V.,