2010-08-03 4 views
0

나는 (php/mysql) 시스템을 사용하여 사이트에서 일을하도록 사용자를 보상합니다. 질문을 위해 사용자가 5 개의 모든 의견에 대해 장미를 얻는다 고 가정 해 봅시다.함수는 실시간으로 호출되면 잘못된 값을 저장합니다. 수동으로 호출하여 올바른 값을 저장합니다. 무슨 일이야?

앞 페이지에는 오늘 얼마나 많은 장미를 받았으며, 몇 번이나 장미를 얻었는지 보여주는 카운터가 있습니다. 거친 논리는 다음과 같습니다 :

//Save a single, discrete event. $user --> numerical value, 1:1. 
function first($user) { 
    //save values related to $user into TABLE_1; 
    return second($user); 
} 

//Calculate the sum() of all numerical events for $user for today and save that. 
function second($user) { 
    //save values calculated from TABLE_1 into TABLE_2; 
    return third(); 
} 

//Calculate the sum() of all numerical events for all users 
function third() { 
    //save values calculated from TABLE_2 into TABLE_3; 
    return true/false; 
} 

코멘트가 저장 될 때, first() 기능이 개막된다. first()은 사용자 ID, 이벤트의 숫자 값 (1 개의 주석이 저장되었으므로 1) 및 타임 스탬프와 같이 TABLE_1에 주석 이벤트의 레코드를 저장합니다.

다음으로, second()을 호출합니다. second() 사용자가이 코멘트를 사용하여 장미를 얻었는지 알아 내려면 몇 가지 계산을 수행하고 TABLE_2에 3 개의 값 (uid, roses_today, timestamp)을 저장합니다.

이 값은 엉망입니다. 웬일인지, roses_today의 가치는 때로는 높고 때로는 낮아 져야하는 것과 다릅니다. 패턴이 없습니다 - 일부 값은 격렬하게 높고, 일부는 간신히 너무 낮으며, 어떤 것은 맞습니다. 여기에는 운이나 이유가 없습니다.

작업에 렌치를 던지십시오. second($user)을 수동으로 호출하면 TABLE_2에서 계산하여 저장하는 값이 정확합니다. 이 함수는 실시간으로 호출되는 경우에만 실패하는 것으로 보입니다.

편집 : 코드가없는 코드에 문제가 있거나 코드를 단계별로 실행해야한다고 제안하는 경우 이전 단락을 읽으십시오. 이 함수는 실시간으로 호출되는 경우에만 실패하는 것으로 보입니다. 매우 똑같은 기능을 수동으로 호출하면 올바른 결과가 생성됩니다.

+0

UnitTest가 있습니까? 다른 말로하면,이 기능들이 실제로 당신이 생각하는대로 작동하는지 확인할 수 있습니까? 그리고 UnitTests를 얻은 경우 설명 된 시나리오를 테스트하는 기능 테스트가 있습니까? – Gordon

+1

좋은 오래된 디버깅이 필요합니다. –

+0

대부분의 경우 중요한 문제는 해당 기능의 실제 내용입니다. – JAL

답변

2

이것은 기본적으로 "내가 당신에게 보여주지 않은 코드에는 문제가 있습니다."라는 문구가 있습니다.
따라서 최선의 답변은 다음과 같습니다. xdebug과 같은 디버거를 설치하십시오. netbeans을 프론트 엔드로 사용하고 코드를 단계별로 실행합니다.

+0

에 응답하여 TABLE_2에 계산하여 저장하는 값이 정확합니다. 이 함수는 실시간으로 호출되는 경우에만 실패하는 것으로 보입니다. – Entendu

+0

좋아, 그게 디버거가 무엇을위한 것입니다. 중단 점을 설정하고 "실시간으로"스크립트를 실행 한 다음 중단 점의 코드를 단계별로 실행하십시오. _ 타이밍 _ 문제 일 수 있습니다.이 경우 디버거가 결과에 영향을 미칠 수 있습니다. 하지만 크리스탈 공 또는 디버거 (또는 더 많은 정보 또는 화려한 단위 테스트 ;-)로 올라오고 질문에서 정보를 주어진 – VolkerK

1

자, 코드가 잘못되었습니다. 귀하의 서버는 당신을 괴롭 히지 못할 곳을 파악할만큼 똑똑합니다. 적어도 다음과 같이 할 수 있습니다.

//Save a single, discrete event. $user --> numerical value, 1:1. 
function first($_original_user_value) { 
    echo 'first::' . $_original_user_value; 
    $user = $_original_user_value; 

    //save values related to $user into TABLE_1; 

    if ($user !== $_original_user_value) { 
    echo 'ERROR:: Something modified the value of $user'; 
    } 
    return second($_original_user_value); 
} 

//Calculate the sum() of all numerical events for $user for today and save that. 
function second($user) { 
    echo 'second::' . $user; 
    //save values calculated from TABLE_1 into TABLE_2; 
    return third(); 
} 

두 통화에서 화면의 값이 같지 않은 경우 문제가 발생합니다. SQL 쿼리를 실행하는 경우 오류 메시지 저장/저장/표시도 시도하십시오.

'실시간'코드가 HTML이고 방문자가 이러한 추악한 에코를 보지 못하게하려면 HTML 주석을 추가하십시오.

1

수동으로 실행할 때 시스템이 정상적으로 작동하지만 실제 프로덕션 시스템에서는 정상적으로 작동하지 않기 때문에 경쟁 조건이나 구성상의 차이가 있습니다. 정확하게 당신은 수학을 second()에서 어떻게 지내십니까? table_1에서 일부 SUM()/COUNT() 집계 함수를 수행 한 쿼리를 수행 한 다음 결과를 table_2에 삽입합니까? 당신은 "SELECT * ..."를하고 PHP에서 모든 수학을합니까?

여러 개의 쿼리를 실행 중이고 행/테이블에 적절한 잠금이 설정된 트랜잭션 내에서 실행되지 않는 경우 부실 값 및/또는 불량 데이터를 검색하고 가짜 값을 기준으로 계산할 수 있습니다.TABLE_2에 여러 개의 "장미를 오늘 받았습니다"레코드를 다루고 있고 "수학"쿼리에서 레코드에 대해 GROUP을 집계하는 경우 "roses_today"의 올바른 버전이 사용된다는 보장이 없습니다.

데이터베이스 스키마, 쿼리 및 "수학"계산에 대한 세부 정보가 부족하여 잘못된 정보를 알려줍니다. 경쟁 조건은 전체 세부 사항으로 디버그하기에 충분합니다. 무한한 자정에 조명이없는 유틸리티 벽장 안쪽에서 그것을 시도하는 것을 잊어 버려라.

+0

나는 "따옴표로"수학 사랑, 날 웃었다. second()에 의해 삽입 된 데이터는 sum() 쿼리에 의해 검색된 다음 결과에 대해 계산이 수행되고 (숫자를 나눔) 결과가 삽입됩니다. 나는 sum() 질의가 일들이 엉망이되는 곳이라는 느낌을 가지고있다. – Entendu

관련 문제