Magento 1 : 증분 ID의 패딩 길이 초과
-
13-12-2019 - |
문제
Magento 1 시스템이 패딩 길이를 초과하는 증분 ID를 생존 할 수 있습니까?
that eav_entity_type
테이블은 기본값 8으로 기본값 인 increment_pad_length
열이 들어 있습니다. 즉, Magento는 eav_entity_store
테이블에서 주문 (또는 따옴표, 선적 등)에 대한 증분 ID를 생성 할 때 숫자를 패드합니다.이
100000012
.
는 PADDINE이 1
또는 0
로 설정된 경우 MAGENTO 시스템이 정상적으로 작동합니까?그 패딩이 4
와 같은 것으로 줄어들면 Magento 시스템이 정상적으로 작동 할 것입니다. 그리고 eav_entity_store
의 실제 증분 ID 값은 10,000 이상입니까?
해결책
Magento의 eav_entity_type
테이블의 열 길이를 초과하지 않는 한,
Magento에서 패드 설정이 사용되는 유일한 위치는 Mage_Eav_Model_Entity_Increment_Alphanum::getNextId
에 있으며 마지막 ID를 사용하여 마지막으로 숫자를 증가시키는 마지막 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"
.
그래서 본질적으로 결과 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
로 이들을 수출했을 때 블로우를 날려 버리고 blaw, P>
test(2.3409235092835E+34)
// =>PHP Fatal error: Uncaught exception 'Exception' with message 'Invalid character found'
.
면책 조항
1.2 CE 일에 이것에 대해 이루어 졌으므로 나와 함께 짊어지고 지식의 나이를 고려해야합니다 (그리고 내가이 가정을하는 1.14.2.2 ee 코드를 읽는 사실을 읽으십시오)