SQLSTATE[23000]: Нарушение ограничения целостности: Столбец 1048 "идентификатор сущности" не может быть пустым


Недавно мне было поручено отладить какой-то неисправный код электронной почты для сброса пароля magento. Я, я думаю, нашел виновника неправильного поведения, но я действительно не знаю, как его решить. Вот мой журнал:

2015-04-23T15:38:02+00:00 DEBUG (7): site id is: 1
2015-04-23T15:38:02+00:00 DEBUG (7): loaded customer by email
2015-04-23T15:38:02+00:00 ERR (3): Recoverable Error: Object of class Mage_Customer_Model_Customer could not be converted to string  in /var/www/magento/apijson/customer/forgotPassword.php on line 30
2015-04-23T15:38:02+00:00 DEBUG (7): the customer is:
2015-04-23T15:38:02+00:00 DEBUG (7): new reset password link token generated
2015-04-23T15:38:02+00:00 DEBUG (7): resetToken is: 44bbce19e297c088c2bca9f97a21d020
2015-04-23T15:38:02+00:00 DEBUG (7): SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'entity_id' cannot be null, query was: INSERT INTO `customer_entity_varchar` (`entity_type_id`,`entity_id`,`attribute_id`,`value`) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UP DATE `value` = VALUES(`value`)

Вот код пароля для сброса электронной почты:

  5 $customer = Mage::getModel("customer/customer");
  6 Mage::log("site id is: ".Mage::app()->getWebsite()->getId());
  7 $customer->setWebsiteId(Mage::app()->getWebsite()->getId());
...
 26 if ($email) {
 27     try {
 28         $customer->loadByEmail($email);
 29         Mage::log("loaded customer by email");
 30         Mage::log("the customer is: ".$customer);
 31         $newResetPasswordLinkToken = Mage::helper('customer')->generateResetPasswordLinkToken();                                                                                                                                                                          
 32         Mage::log("new reset password link token generated");
 33         Mage::log("resetToken is: ".$newResetPasswordLinkToken);
 34         $customer->changeResetPasswordLinkToken($newResetPasswordLinkToken);
 35         Mage::log("rest password link token changed");
 36         $customer->sendPasswordResetConfirmationEmail();
 37         Mage::log("password reset confirmation email sent");                                                                                                                                                                                                              
 38     } catch(Exception $e) {
 39         Mage::log($e->getMessage());                                                                                                                                                                                                                                      
 40     }

Из журнала я знаю, что код завершается ошибкой, когда он попадает в функцию changeResetPasswordLinkToken. Однако я не понимаю, почему. Я много смотрел в Интернете и гуглил в течение последних двух дней, но, похоже, я наткнулся на очень уникальную проблему. Я нашел этот пост, в котором был ответ на мою проблему, но, к сожалению, он не сработал для меня.

Итак, мой вопрос для всех, кто просматривает этот пост. Знаете ли вы, в чем причина проблемы и почему сбой changeResetPasswordLinkToken? Если есть вопрос, подобный этому, который, по вашему мнению, будет полезен, пожалуйста, предоставьте ссылку, так как на данный момент все помогает. Спасибо всем.

Author: engineerKev, 2015-04-23

3 answers

Я думаю, что здесь происходит то, что нагрузка на клиента падает.

Я бы проверил, действительно ли этот адрес электронной почты клиента привязан к клиенту, а также обновил бы ваш журнал для клиента примерно так:

Mage::log("the customer is: ".$customer->getId());

Это быстро покажет вам, если произойдет сбой загрузки. Если загрузка завершится неудачно, то, конечно, установка маркера пароля не будет работать.

 1
Author: David Manners, 2015-04-24 08:58:23

Чтобы помочь вам решить эту проблему, мне нужно больше деталей.

Метод $customer->changeResetPasswordLinkToken($newResetPasswordLinkToken); вызывает тот же метод из модели ресурсов. В модели ресурсов мы видим две строки, которые, скорее всего, вызывают проблему:

 $this->saveAttribute($customer, 'rp_token');
 $this->saveAttribute($customer, 'rp_token_created_at');

Наиболее вероятная проблема находится в первом ряду. Я попытался посмотреть на customer_entity_varchar и найти любые значения атрибута rp_token. Но не было никаких ценностей с такими attribute_id (attribute_id Я получил от eav_attribute).

Скорее всего, Magento пытается изменить несуществующее значение атрибута. Чтобы определить проблема попробуйте поместить Mage::log() везде, как вы делали это раньше. И покажите нам результат.

 1
Author: zhartaunik, 2016-07-08 09:42:03

Попробуйте этот код:

$customer = Mage::getModel('customer/customer');
$customer->setWebsiteId(Mage::app()->getWebsite()->getId());
$customer->loadByEmail($customerdata['email']);

if ($customer->getId()) {
    $customerId = $customer->getId();
    $customer = Mage::getModel('customer/customer')->load($customerId);
    // generate a new password
    $newPassword = $customer->generatePassword();
    $customer->changePassword($newPassword);
} else {
    // do something here for existing customers
}

try {
    $customer->save();
    $customer->setConfirmation(null);
    $customer->save();

    // save successful, send new password
    // uncomment this to send the email to the customer
    // $customer->sendPasswordReminderEmail();
} catch (Exception $e) {
    echo $e->getMessage();
}
 0
Author: akgola, 2016-07-08 09:42:00