0

場合によっては、バックエンドで注文を行うと、新しい顧客の場合、送信時に次のエラーが発生します。

Order saving error: SQLSTATE[23000]: Integrity constraint violation: 1452
Cannot add or update a child row: a foreign key constraint fails 
`artizara_artizara/enterprise_reward`, CONSTRAINT `FK_REWARD_CUSTOMER_ID` 
FOREIGN KEY (`customer_id`) REFERENCES customer_entity` (`entity_id`) 
ON DELETE CASCADE ON UPDATE CASCADE)

エラーログを調べたところ、次のように書かれています。

exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint 
violation: 1452 Cannot add or update a child row: a foreign key constraint fails 
(`artizara_artizara/enterprise_reward`, CONSTRAINT `FK_REWARD_CUSTOMER_ID` 
FOREIGN KEY (`customer_id`) REFERENCES `customer_entity` (`entity_id`) ON DELETE 
CASCADE ON UPDATE CASCADE)' in /chroot/home/artizara/artizara.com/html/lib/Zend/Db/Statement/Pdo.php:228

私はこれをgoogle/Magentoフォーラムで調査しましたが、テーブルがInnobDBではないことに関係していると言う人もいます...

enterprise_rewardそれで私はphpMyAdminに入り、テーブルを引き上げました。[操作] タブを開きました。Storage Engineの横にInnoDB と表示されているので、そこに設定されていると思います...

他の人は、孤立したデータを検索して、問題の SQL ステートメントを作成しようとしました。これが正確に何を探しているのかよくわからないので、SQLステートメントをまとめる方法がわかりません(とにかく、私は少し新しいです)。

誰かがこれを理解するのを手伝ってくれませんか(孤立したデータを検索するなどして)、そもそもなぜこれが起こったのか教えてください。

参考までに-これがすべての新規顧客(管理者で注文したとき)で発生するのか、それとも時々発生するのかについて、彼らは私に明確な画像を提供することはできません-そのため、その情報は(まだ)ありません...

編集 5/16 @ 2:30p:

このSQLコードで孤児を探してみましたが、結果が返されませんでした...

SELECT
  *
FROM
  enterprise_reward
LEFT
  JOIN
    customer_entity
    ON enterprise_reward.customer_id = customer_entity.entity_id
WHERE
  customer_entity.entity_id IS NULL
4

3 に答える 3

0

実際、エンタープライズ 1.10.0.1 でも同じ問題が発生しています。これは、Varien に報告された既知のバグのようです。ただし、解決策が見つかりません。

私が見つけることができる最高のものは、このスレッドです: http://www.magentocommerce.com/boards/v/viewthread/234872

私が見つけたバグレポートは以下に掲載されています。

バグ ID: 26516 投稿日: 2011-09-21 15:22:18

支払い処理が例外で失敗すると、特定の状況で次のエラーが発生します。

Zend_Db_Statement_Exception: SQLSTATE[23000]: 整合性制約違反: 1452 子行を追加または更新できません: 外部キー制約が失敗しました ( magento_enterprise. enterprise_reward, CONSTRAINT FK_REWARD_CUSTOMER_IDFOREIGN KEY ( customer_id) REFERENCES customer_entity( entity_id) ON DELETE CASCADE ON UPDATE CASCADE)

./lib/Zend/Db/Statement/Pdo.php:234
./lib/Zend/Db/Statement.php:300
./lib/Zend/Db/Adapter/Abstract.php:479
./lib/Zend/Db/Adapter/Pdo/Abstract.php:238
./lib/Varien/Db/Adapter/Pdo/Mysql.php:333
./lib/Zend/Db/Adapter/Abstract.php:574
./app/code/core/Mage/Core/Model/Mysql4/Abstract.php:414
./app/code/core/Mage/Core/Model/Abstract.php:318
./app/code/core/Enterprise/Reward/Model/Reward.php:202
./app/code/core/Enterprise/Reward/Model/Observer.php:548
./app/code/core/Enterprise/Reward/Model/Observer.php:564
./app/code/core/Mage/Core/Model/App.php:1265
./app/code/core/Mage/Core/Model/App.php:1246
./app/Mage.php:416
./app/code/core/Mage/Sales/Model/Service/Quote.php:187
./app/code/core/Mage/Sales/Model/Service/Quote.php:126
./EnterpriseRewardTest.php:70

再現する手順:

  • Enterprise Rewards が有効になっている Magento Enterprise を使用します (または同様のコードを持つ別のモジュール。以下を参照)。
  • オンライン承認をサポートする支払いモジュールを使用する
  • 新規顧客として注文をチェックアウトする
  • 支払いエラーを引き起こす (無効な CC 番号を入力するなど)。

問題を確実に再現する PHPUnit テスト ケースを添付しました。

犯人は、次のことを行う Mage_Sales_Model_Service_Quote::submitOrder のコードです。

  1. 取引を開始する
  2. 新しい秩序を築く
  3. 新しい顧客を作成し、注文の customerId フィールドに入力します
  4. 注文を処理しようとすると、例外が発生します
  5. トランザクションをロールバックする
  6. 注文をイベントデータとして使用して、「quote_submit_failure」イベントをディスパッチします。トランザクションがロールバックされたため、注文の customerId フィールドに無効な値が含まれていることに注意してください。

現在、quote_submit_failure のハンドラーが注文の customerId を使用し続けると、必ず前述の「整合性制約違反」エラーがトリガーされます。

この問題は、次のバージョンで再現できます。 - Magento Enterprise Edition v1.10.0.1 - Magento Community Edition v1.6.0.0 (有効な customerId を期待する quote_submit_failure ハンドラーがある場合)

于 2012-12-10T05:24:28.907 に答える
0

$this->_stmt->queryStringを lib/Zend/Db/Statement/Pdo.php (_execute メソッド) の Zend_Db_Statement_Exception に追加して、どのクエリがエラーをスローしているかを確認することもできます。

それは次のようなものになります..

throw new Zend_Db_Statement_Exception($e->getMessage() . $this->_stmt->queryString, (int) $e->getCode(), $e);

ただし、Magento でコアの変更をコミットしないでください。かっこいいじゃない。

ソース: Aftab Naveed のブログ

于 2013-04-19T14:23:35.560 に答える