ทำไม create_at (ตาราง customer_entity) ถูกตั้งค่าให้เปลี่ยนแปลงในการอัปเดต


19

เมื่อมองไปที่โครงสร้างของcustomer_entityตารางผมสังเกตเห็นฟิลด์มีแอตทริบิวต์นี้:created_at on update CURRENT_TIMESTAMPดังนั้นทุกครั้งที่มีการอัปเดตแถวcreated_atเวลาจะเปลี่ยนไป

ดูเหมือนว่าควรมีแอตทริบิวต์นี้อยู่ในupdated_atเขตข้อมูลไม่ใช่created_atเขตข้อมูล ฉันรู้ว่ามันยากที่จะมีการปรับเปลี่ยนตารางนี้โดยตรงเนื่องจากโครงสร้าง EAV แต่ดูเหมือนว่าจะยังไม่ถูกต้องที่จะแก้ไขcreated_atฟิลด์

มีเหตุผลสำหรับโครงสร้างตารางนี้หรือเป็นเพียงข้อผิดพลาดหรือไม่?

แก้ไข: ฉันพบรายงานข้อผิดพลาดที่ยืนยันจาก Magento สำหรับเรื่องนี้ ปัญหา # 27944 ขออภัยคุณต้องเข้าสู่ระบบเพื่อดู http://www.magentocommerce.com/bug-tracking/issue?issue=13882


2
คำถามที่ดี. ฉันอาจเพิ่มว่าตารางเหล่านี้อยู่ในสถานการณ์เดียวกัน: 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อาจมีคนอื่นด้วย ฉันสูญเสียความสนใจในจุดหนึ่งในขณะที่ค้นหาพวกเขา
Marius

ผมสังเกตเห็นครั้งแรกที่มีการตรวจสอบแล้วsales_flat_quote customer_entityเราเพิ่งสังเกตเห็นเพราะรายงานบางส่วนของเราไม่สมเหตุสมผล นี่เป็นข้อผิดพลาดจริง ๆ ได้ไหม
Ryre

ฉันเชื่อว่ามันเป็นเพียงข้อผิดพลาด
Dmytro Zavalkin

ฉันมีวิธีใดบ้างที่เราสามารถแก้ไขได้? ขออภัยฉันเป็นมือใหม่และกำลังเผชิญปัญหาเดียวกันตั้งแต่ฉันอัพเกรดจาก 1.7.0.2 เป็น 1.8.1 ฉันเกือบกลัวที่จะลองแก้ไขฟิลด์ในฐานข้อมูล หวังว่าคุณจะช่วยได้ !! ขอบคุณ Jinal
Jinal

@Jinal ตัวเลือกที่ดีที่สุดของคุณคือทำการเปลี่ยนแปลงผ่าน mysql ตรวจสอบคำตอบของ Marius สำหรับรายละเอียดเพิ่มเติมและตรวจสอบให้แน่ใจว่าได้สำรองฐานข้อมูลของคุณก่อน!
Ryre

คำตอบ:


22

นี่คือสิ่งที่ฉันพบ ปัญหาจะปรากฏเฉพาะใน Magento CE 1.6+ (และรุ่น EE ที่ตรงกัน) เป็นเพราะสคริปต์ติดตั้ง / อัปเกรดใหม่โดยใช้ DDL ร่วมกับ mysql
ในรุ่นก่อน 1.6 นี่คือลักษณะcreated_atและ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', 

ใน 1.6+ ddl มีลักษณะเช่นนี้:

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

และสร้าง:

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

ความแตกต่างคือdefaultค่านั้นหายไป
และเป็นคำอธิบายที่นี่ ,

ด้วย DEFAULT CURRENT_TIMESTAMP และ ON UPDATE CURRENT_TIMESTAMP จะเหมือนกับการระบุทั้ง DEFAULT CURRENT_TIMESTAMP และ ON CURRENT_TIMESTAMP ที่อัปเดต

และเนื่องจาก MySQL อนุญาตให้มีคอลัมน์การประทับเวลาเพียงคอลัมน์CURRENT_TIMESTAMPเดียวซึ่งเป็นค่าเริ่มต้นหรือon updateเป็นcreated_atคอลัมน์คอลัมน์จึงกลายเป็นเช่นนี้

นี่เป็นข้อผิดพลาดของวีโอไอพีอย่างแน่นอน


1
มีการอัปเดตใด ๆ จาก magento เกี่ยวกับเรื่องนี้? ดูเหมือนว่าข้อผิดพลาดยังอยู่ในสถานะใหม่
ลอร่า

@Laura ลิงก์ติดตามข้อบกพร่องในคำตอบยังคงแสดงว่าเปิดอยู่ (เกือบ 2 ปีแล้ว!)
Ryre

2
ใน Magento 1.9 คอลัมน์ created_at พูดว่า: created_attimestamp NOT NULL DEFAULT CURRENT_TIMESTAMP เมื่ออัปเดต CURRENT_TIMESTAMP แสดงความคิดเห็น 'สร้างที่' และในบันทึกประจำรุ่นจะมีการกล่าวถึงว่า "วันที่" ลูกค้านับตั้งแต่ "ถูกต้อง"
MagePsycho

สำหรับ EE จะมีผลกับรุ่นก่อน 1.6 ฉันมี EE 1.13 และมีลักษณะเช่นนี้: `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Created At'
doc_id

4

ก่อนอื่นอ่านคำตอบของ Marius เพื่อดูว่าเกิดอะไรขึ้นในฐานข้อมูล

Mage_Core_Model_Abstractฉันแค่อยากจะพูดถึงว่านักพัฒนาส่วนใหญ่จะไม่ทำงานเป็นปัญหานี้หากรูปแบบของพวกเขาอย่างถูกต้องขยาย สแต็คมีลักษณะดังนี้:

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

นี่ทำสิ่งต่อไปนี้:

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

เพิ่งทราบว่าอาจมีปัญหาสำหรับบางภาษาในทั้ง CE> = 1.8.x และ EE> = 1.13.x


2

เราก็พบข้อผิดพลาดนี้และคิดว่ามันขึ้นอยู่กับความแตกต่างระหว่างการเข้ารหัสวันที่สหรัฐอเมริกาและยุโรป

ในสหรัฐอเมริกามีการเขียนวันที่ MM-DD-YYYY (02-10-2015 = 10 กุมภาพันธ์ 2558) แต่ในยุโรปและสถานที่อื่น ๆ วันที่เขียน DD-MM-YYYY (02-10-2015 = 2 ตุลาคม 2558 หรือ 2 ตุลาคม 2558)

ในขณะที่วีโอไอพีอยู่ในสหรัฐอเมริกาการพัฒนาส่วนใหญ่ดำเนินการโดยโปรแกรมเมอร์ในยูเครน 

เราได้แก้ไขข้อผิดพลาดนี้ด้วยส่วนขยาย Magento ฟรี (เพื่อให้คุณไม่ต้องเปลี่ยนรหัสหลักของวีโอไอพี) เราได้ติดตั้งบนเว็บไซต์ของเราเป็นดาวน์โหลดฟรี: http://www.CustomerParadigm.com/download/Magento-Date-Switch-Fix-Extension.zip

ฉันได้กล่าวถึงรายละเอียดเพิ่มเติมในบล็อกของเราที่นี่: http://www.customerparadigm.com/magento-bug-magento-customer-create-date-juxtaposition/


1
โพสต์บล็อกและโมดูลจะถูกดึงออกจากโพสต์ SE ของฉันที่นี่: magento.stackexchange.com/a/31225
Tyler V.

-1

ce 1.9 ได้แก้ไขข้อผิดพลาดใน ce 1.8.1 ด้านล่างคือความต่าง: ป้อนคำอธิบายรูปภาพที่นี่


1
รหัสใหม่ที่นี่ไม่ได้แก้ไขปัญหานี้ เพียงตรวจสอบรูปแบบ "DDDD-DD-DD DD: DD: DD" หรือส่งคืนค่าว่าง โมฆะนั้นจะยังคงเข้าถึงฐานข้อมูลและกลายเป็นค่าเริ่มต้นของคอลัมน์
Tyler V.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.