2014-04-08 2 views
0

사용자가 MySQL 데이터베이스 테이블을 변경하기위한 HTML 프론트 엔드가있는 PHP webapp가 있습니다. 또한 이전 레코드에 대한 아카이브 테이블을 만들어 사용자가 레코드를 변경할 때 레코드를 옮길 수있게했습니다.데이터베이스 레코드를 추적 할 수있는 가장 좋은 방법은 무엇입니까?

하지만 이전 기록을 아카이브 테이블에 저장하고 싶습니다. 특히 어떤 컬럼이 변경되었는지 확인하고자합니다.

웹 기반 데이터베이스 프론트 엔드의 성격으로 인해 사용자가 레코드를 열 때마다 스크립트의 행 내용을 제공하여 해당 열을 value 필드로 전달할 때마다 어떤 열이 변경되었는지 쉽게 알 수 없습니다. HTML input 요소가 내 프런트 엔드에 있습니다 (또는 select, textarea 등).

사용자가 input 필드에서 값을 변경하고 데이터를 제출하면 브라우저는 변경된 필드뿐만 아니라 사용자가 변경 한 값을 포함하여 처음부터 프론트 엔드에 제공된 모든 데이터를 전송합니다 . 따라서 변경되지 않은 값으로 행을 업데이트해야합니다. 예에서

Original data Passed to frontend Changes by user  Data being sent back 
    id=827 
val1=arthur  val1=arthur        val1=arthur 
val2=ford  val2=ford        val2=ford 
val3=tricia  val3=tricia   val3=trillian  val3=trillian 
val4=zaphod  val4=zaphod        val4=zaphod 
val5=marvin  val5=marvin        val5=marvin 
    . 
    . 
    . 

위 단순히 아카이브 테이블에서 현재 레코드의 복사본을 만들고 val5val1의 값으로 '라이브'레코드를 업데이트 할 데이터를 백엔드를 제출 한 후. 이제

나는 마지막 변경, 예를 들어 당신이 변경되었습니다 어떤 정보를 볼 수있는 페이지,하고 싶습니다 :

2014-04-08: User 'douglas' changed val3 in row #827 

또는 ...

2014-04-08: User 'eoin' changed val1, val2 and val3 in row #137 

순간을 가능한 솔루션은 두 가지입니다.

  • 현재 행과 아 + 이브 테이블에서 해당 행을 비교하여 행이 다른 C 럼 (!)의 이름을 가져옵니다. 이 작업을 수행하는 MySQL 함수가 있습니까? PHP에서 이것을 구현해야합니까?

  • 프론트 엔드에서 데이터를받은 후 PHP 백엔드에서 변경된 값만 저장하기 위해 원래 레코드와 다른 값을 즉시 확인하십시오. 그래서 나는 문제의 기둥을 자동으로 가질 것이다.

답변

0

subimt에서 업데이트 된/"또는 아닐지도"필드가 있고 원래 값이 있습니까? 두 데이터 세트는 다음과 같이 표현 될 수 있습니다

이제
$updated_data = ['first_name' => 'John', 'last_name' => 'White']; 
$original_data = ['first_name' => 'Peter', 'last_name' => 'White']; 

당신이 수정 된 필드를 찾을 array_diff_assoc()와 array_keys()를 사용할 수 있습니다

$updated_fields = array_keys(array_diff_assoc($updated_data, $original_data)); 

print_r($updated_fields); # List of updated fields 
관련 문제