cron을 실행하는 동안 PDO 예외 : 뉴스 레터 큐 전송 실패 ( '필드 목록'의 알 수없는 'main_table.data'열)


15

뉴스 레터 대기열을 처리 할 때 크론 작업이 실패합니다. PDO 호출을 디버깅했으며 Magento가 여기에서 필드를 혼합하는 것처럼 보입니다. Magento (또는 Zend PDO)가 필드를 선택할 수있는 단서가 없지만 완전히 혼합 된 것처럼 보입니다.

Magento가 고객의 이름을 얻지 못하는 것 같습니다. 마지막 선택은 다음과 같습니다.

SELECT eav_entity_type.* FROM eav_entity_type WHERE (eav_entity_type.entity_type_code='customer')

DESCRIBE customer_eav_attribute

DESCRIBE customer_eav_attribute_website

그런 다음 존재하지 않는 필드 목록이있는 선택이 제공됩니다.

SELECT main_table.data, main_table.lifetime, main_table.expire, main_table.priority, additional_table.attribute_id, additional_table.is_visible, additional_table.input_filter, additional_table.multiline_count, additional_table.validate_rules, additional_table.is_system, additional_table.sort_order, additional_table.data_model, scope_table.website_id AS scope_website_id, scope_table.is_visible AS scope_is_visible, scope_table.multiline_count AS scope_multiline_count FROM eav_attribute AS main_table INNER JOIN customer_eav_attribute AS additional_table ON additional_table.attribute_id = main_table.attribute_id LEFT JOIN customer_eav_attribute_website AS scope_table ON scope_table.attribute_id = main_table.attribute_id AND scope_table.website_id = :scope_website_id WHERE (main_table.entity_type_id = :mt_entity_type_id)

해당 쿼리의 매개 변수 : :mt_entity_type_id' => 1:scope_website_id' => 0

이 제기

exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'main_table.data' in 'field list''

eav_attribute 테이블에는 필드 데이터, 수명, 만료 또는 우선 순위가 포함되지 않기 때문입니다.

전체 스택 추적은 다음과 같습니다.

Stack trace:
0 /usr/www/users/weartb/shop/lib/Zend/Db/Statement/Pdo.php(228): PDOStatement->execute(Array)
1 /usr/www/users/weartb/shop/lib/Varien/Db/Statement/Pdo/Mysql.php(110): Zend_Db_Statement_Pdo->_execute(Array)
2 /usr/www/users/weartb/shop/app/code/core/Zend/Db/Statement.php(291): Varien_Db_Statement_Pdo_Mysql->_execute(Array)
3 /usr/www/users/weartb/shop/lib/Zend/Db/Adapter/Abstract.php(480): Zend_Db_Statement->execute(Array)
4 /usr/www/users/weartb/shop/lib/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('SELECT `main_ta...', Array)
5 /usr/www/users/weartb/shop/lib/Varien/Db/Adapter/Pdo/Mysql.php(428): Zend_Db_Adapter_Pdo_Abstract->query('SELECT `main_ta...', Array)
6 /usr/www/users/weartb/shop/lib/Zend/Db/Adapter/Abstract.php(737): Varien_Db_Adapter_Pdo_Mysql->query('SELECT `main_ta...', Array)
7 /usr/www/users/weartb/shop/lib/Varien/Data/Collection/Db.php(734): Zend_Db_Adapter_Abstract->fetchAll('SELECT `main_ta...', Array)
8 /usr/www/users/weartb/shop/app/code/core/Mage/Core/Model/Resource/Db/Collection/Abstract.php(521): Varien_Data_Collection_Db->_fetchAll('SELECT `main_ta...', Array)
9 /usr/www/users/weartb/shop/app/code/core/Mage/Eav/Model/Config.php(356): Mage_Core_Model_Resource_Db_Collection_Abstract->getData()
10 /usr/www/users/weartb/shop/app/code/core/Mage/Eav/Model/Config.php(478): Mage_Eav_Model_Config->_initAttributes(Object(Mage_Eav_Model_Entity_Type))
11 /usr/www/users/weartb/shop/app/code/core/Mage/Eav/Model/Entity/Abstract.php(512): Mage_Eav_Model_Config->getEntityAttributeCodes(Object(Mage_Eav_Model_Entity_Type), Object(Mage_Customer_Model_Customer))
12 /usr/www/users/weartb/shop/app/code/core/Mage/Customer/Model/Customer.php(340): Mage_Eav_Model_Entity_Abstract->loadAllAttributes(Object(Mage_Customer_Model_Customer))
13 /usr/www/users/weartb/shop/app/code/core/Mage/Customer/Model/Customer.php(354): Mage_Customer_Model_Customer->getAttributes()
14 /usr/www/users/weartb/shop/app/code/core/Mage/Newsletter/Model/Resource/Subscriber/Collection.php(134): Mage_Customer_Model_Customer->getAttribute('firstname')
15 /usr/www/users/weartb/shop/app/code/core/Mage/Newsletter/Model/Queue.php(191): Mage_Newsletter_Model_Resource_Subscriber_Collection->showCustomerInfo()
16 [internal function]: Mage_Newsletter_Model_Queue->sendPerSubscriber(20)
17 /usr/www/users/weartb/shop/lib/Varien/Data/Collection.php(466): call_user_func_array(Array, Array)
18 /usr/www/users/weartb/shop/app/code/core/Mage/Newsletter/Model/Observer.php(70): Varien_Data_Collection->walk('sendPerSubscrib...', Array)
19 [internal function]: Mage_Newsletter_Model_Observer->scheduledSend(Object(Mage_Cron_Model_Schedule))
20 /usr/www/users/weartb/shop/app/code/core/Mage/Cron/Model/Observer.php(325): call_user_func_array(Array, Array)
21 /usr/www/users/weartb/shop/app/code/core/Mage/Cron/Model/Observer.php(72): Mage_Cron_Model_Observer->_processJob(Object(Mage_Cron_Model_Schedule), Object(Mage_Core_Model_Config_Element))
22 /usr/www/users/weartb/shop/app/code/core/Mage/Core/Model/App.php(1338): Mage_Cron_Model_Observer->dispatch(Object(Varien_Event_Observer))
23 /usr/www/users/weartb/shop/app/code/core/Mage/Core/Model/App.php(1317): Mage_Core_Model_App->_callObserverMethod(Object(Mage_Cron_Model_Observer), 'dispatch', Object(Varien_Event_Observer))
24 /usr/www/users/weartb/shop/app/Mage.php(448): Mage_Core_Model_App->dispatchEvent('default', Array)
25 /usr/www/users/weartb/shop/cron.php(84): Mage::dispatchEvent('default')
26 {main}

Mage_Customer_Model_Customer->getAttribute('firstname')전화 할 때까지 모든 것이 정상으로 보입니다 .

우리는 고객 모델을 확장하지 않았거나 그렇게하는 모듈을 사용하지 않았으며, 뉴스 레터 미리보기도 제대로 작동하고 수동으로 전송하기 때문에이 예외는 Magento가 cron 호출을 통해 뉴스 레터 대기열을 처리하려고 할 때만 발생합니다.


마젠 토의 어떤 버전? Magento 1.9.0.1에서는 실행 Zend_Debug::dump(Mage::getModel('customer/customer')->getAttribute('firstname'));하고 유효하게 Mage_Customer_Model_Attribute돌아올 수 있습니다. 수동 속성이 있음을 데이터베이스에 확인 할 수 firstname있는 eav_attribute오른쪽이 entity_type_id에서를 eav_entity_type?
Tyler V.

답변:


3

핵심 파일 app / code / core / Mage / Newsletter / Model / Resource / Subscriber / Collection.php를 수정했다고 생각합니다.

130 행 근처에서 showCustomerInfo () 함수를 확인하십시오.

public function showCustomerInfo()
{
    $adapter = $this->getConnection();
    $customer = Mage::getModel('customer/customer');
    $firstname  = $customer->getAttribute('firstname');
    $lastname   = $customer->getAttribute('lastname');

    $this->getSelect()
        ->joinLeft(
            array('customer_lastname_table'=>$lastname->getBackend()->getTable()),
            $adapter->quoteInto('customer_lastname_table.entity_id=main_table.customer_id
             AND customer_lastname_table.attribute_id = ?', (int)$lastname->getAttributeId()),
            array('customer_lastname'=>'value')
        )
        ->joinLeft(
            array('customer_firstname_table'=>$firstname->getBackend()->getTable()),
            $adapter->quoteInto('customer_firstname_table.entity_id=main_table.customer_id
             AND customer_firstname_table.attribute_id = ?', (int)$firstname->getAttributeId()),
            array('customer_firstname'=>'value')
        );

    return $this;
}

왜 그렇게 생각합니까?

  1. 오류 로그에는 타사 확장 프로그램이나 마법사 / 로컬 파일이 포함되지 않은 내용이 표시됩니다.

  2. 이 Magento 작업에 대한 표준 SQL 쿼리에는 'main_table.data, main_table.lifetime, main_table.expire, main_table.priority'부분이 없습니다.


1

스택 추적을 통해 실행되는 SQL은 다음과 같습니다.

SELECT `main_table`.`attribute_id`, `main_table`.`entity_type_id`, `main_table`.`attribute_code`, `main_table`.`attribute_model`, `main_table`.`backend_model`, `main_table`.`backend_type`, `main_table`.`backend_table`, `main_table`.`frontend_model`, `main_table`.`frontend_input`, `main_table`.`frontend_label`, `main_table`.`frontend_class`, `main_table`.`source_model`, `main_table`.`is_required`, `main_table`.`is_user_defined`, `main_table`.`default_value`, `main_table`.`is_unique`, `main_table`.`note`, `additional_table`.`is_visible`, `additional_table`.`input_filter`, `additional_table`.`multiline_count`, `additional_table`.`validate_rules`, `additional_table`.`is_system`, `additional_table`.`sort_order`, `additional_table`.`data_model`, `scope_table`.`website_id` AS `scope_website_id`, `scope_table`.`is_visible` AS `scope_is_visible`, `scope_table`.`is_required` AS `scope_is_required`, `scope_table`.`default_value` AS `scope_default_value`, `scope_table`.`multiline_count` AS `scope_multiline_count` FROM `eav_attribute` AS `main_table`
 INNER JOIN `customer_eav_attribute` AS `additional_table` ON additional_table.attribute_id = main_table.attribute_id
 LEFT JOIN `customer_eav_attribute_website` AS `scope_table` ON scope_table.attribute_id = main_table.attribute_id AND scope_table.website_id = :scope_website_id WHERE (main_table.entity_type_id = :mt_entity_type_id)

Magento의 어느 곳에서나 알 수없는 열을 찾을 수없는 것처럼 보이지만, 이것은 세션 / 캐시와 관련이 있지만 100 % 확실하지 않은 교묘 한 열성을 가지고 있습니다. Redis를 사용하도록 설정 했습니까? 그렇다면 캐시를 비활성화하고 지우고 결과가 무엇인지 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.