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? Если есть вопрос, подобный этому, который, по вашему мнению, будет полезен, пожалуйста, предоставьте ссылку, так как на данный момент все помогает. Спасибо всем.
3 answers
Я думаю, что здесь происходит то, что нагрузка на клиента падает.
Я бы проверил, действительно ли этот адрес электронной почты клиента привязан к клиенту, а также обновил бы ваш журнал для клиента примерно так:
Mage::log("the customer is: ".$customer->getId());
Это быстро покажет вам, если произойдет сбой загрузки. Если загрузка завершится неудачно, то, конечно, установка маркера пароля не будет работать.
Чтобы помочь вам решить эту проблему, мне нужно больше деталей.
Метод $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()
везде, как вы делали это раньше. И покажите нам результат.
Попробуйте этот код:
$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();
}