Magento 1:インクリメントIDのパディング長を超える
-
13-12-2019 - |
質問
Magento 1システムは、パディング長を超える増分IDを生き残ることができますか?
eav_entity_type
テーブルには、デフォルトのincrement_pad_length
列が含まれています。この
100000012
.
PADDINGがeav_entity_store
または1
に設定されている場合、Magentoシステムは通常正常に動作しますか?Paddingが0
のようなものに縮小されている場合、Magentoシステムは通常正常に動作します。
解決
eav_entity_type
テーブルの列の長さを超えない限り、爆発しません。
MagentoでPAD設定を使用する唯一の場所はMage_Eav_Model_Entity_Increment_Alphanum::getNextId
にあり、最後のIDセットを使用して最後の桁を増やします。
次のIDを計算すると、主要な接頭辞からトリミングされ、文字列パッドのみが残っています。 Inbuild PHP関数を使用して、それをパッドよりも長い文字列を無視します。
このREPL出力を参照してください:
[1] boris> str_pad('9999999999',8,'0',STR_PAD_LEFT);
→ string(10) "9999999999"
[2] boris> str_pad('999999999999999999',8,'0',STR_PAD_LEFT);
→ string(18) "999999999999999999"
.
SO ESSENCEは、結果のID文字列を他の文字列であったかのように扱います。その後のfor
ループは、その文字列の全長で周期するのに十分スマートです。任意のサイズを簡単に処理する必要があります。
<?php
function test($lastId){
$nextId = '';
$bumpNextChar = true;
$chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$lchars = strlen($chars);
$lid = strlen($lastId)-1;
for ($i = $lid; $i >= 0; $i--) {
$p = strpos($chars, $lastId{$i});
if (false===$p) {
throw new Exception('Invalid character found');
}
if ($bumpNextChar) {
$p++;
$bumpNextChar = false;
}
if ($p===$lchars) {
$p = 0;
$bumpNextChar = true;
}
$nextId = $chars{$p}.$nextId;
}
var_dump($nextId);
}
test('09234029342');
// =>string(11) "09234029343"
test('22');
// =>string(2) "23"
test('23409235092835029385023958230598235');
// =>string(35) "23409235092835029385023958230598236"
.
PHPの整数で特定の長さを超えると、それは科学的表記に変換されます。これは例外を引き起こします。
そのため、意図的にこれらを文字列として渡しました。
int
としてエクスポートしました。これは、+記号のためにが爆破します。 P>
.
test(2.3409235092835E+34)
// =>PHP Fatal error: Uncaught exception 'Exception' with message 'Invalid character found'
免責事項
私は1.2 CEの日にこれに反対したので、私と一緒に耐え、私の知識の年齢を考慮してください(そして私がこれらの仮定をする1.14.2.2 EEコードを読んでいるという事実を決してしない)