前提
我使用PHP MySQL製作了一個資料添加修改功能,關於修改功能。我需要擷取每次資料修改了什麼內容,以便儲存為一個log資料,以備查看。
樣本
有一個資料表,內容分別是
id,名稱,編號,等…
有一條資料內容是
1,小明,101,等…
然後我通過update語錄,修改了小明為小紅,修改了101為102等資料。
這時候我要做一個log記錄,儲存某某某時間 將小明改為小紅,等
問題
這時候問題來了。如何快捷有效判斷出修改內容。
我的做法
因為編輯資料前我載入了一次資料到網頁中,然後網頁提交的時候,我就判斷提交的內容和剛載入的資料是否相同,不相同表示這裡修改過了。
我認為的弊端
因為我的資料很多很多不只有id 名稱這幾個,所以判斷起來特別麻煩,很多if,比如if name == newname 之類的判斷語錄。
需求
有沒有更高效,代碼更精鍊的方式實現?
回複內容:
前提
我使用PHP MySQL製作了一個資料添加修改功能,關於修改功能。我需要擷取每次資料修改了什麼內容,以便儲存為一個log資料,以備查看。
樣本
有一個資料表,內容分別是
id,名稱,編號,等…
有一條資料內容是
1,小明,101,等…
然後我通過update語錄,修改了小明為小紅,修改了101為102等資料。
這時候我要做一個log記錄,儲存某某某時間 將小明改為小紅,等
問題
這時候問題來了。如何快捷有效判斷出修改內容。
我的做法
因為編輯資料前我載入了一次資料到網頁中,然後網頁提交的時候,我就判斷提交的內容和剛載入的資料是否相同,不相同表示這裡修改過了。
我認為的弊端
因為我的資料很多很多不只有id 名稱這幾個,所以判斷起來特別麻煩,很多if,比如if name == newname 之類的判斷語錄。
需求
有沒有更高效,代碼更精鍊的方式實現?
新舊資料如果用一維數組表示,可以用PHP函數array_diff_assoc比較兩個數組。
用很多if判斷是很笨的方法,另外也不建議交給資料庫來做這種工作
$old = array('id'=>'1','name'=>'a','sort'=>'1');$new = array('id'=>'1','name'=>'b','sort'=>'2');$result1 = array_diff_assoc($new, $old);$result2 = array_diff_assoc($old, $new);print_r($result1); //Array ( [name] => b [sort] => 2 )print_r($result2); //Array ( [name] => a [sort] => 1 )
直接分析mysql日誌不就好了。
如果是表單資料的話, 一種方法是把多維表單資料壓縮成字串,然後求出字串的長度(int) 值存入到改條目裡面。下次對比的時候只要調出該字串長度然後跟提交表單的壓縮字串對比一下就知道了。長度相同為沒改,長度不同為該了。注意繁體簡體字的問題。
觸發器?我記得在oracle是可以的 我們也做過 有一個表哪行改了就把資料拷貝到另外一份表裡
但是如果diff到欄位可能不現實
之前上次也是做了一個需要判斷哪些欄位改沒改
我也是採用你那樣的做法,只不過沒有各種判斷if,也就是兩個數組(新資料,舊資料)進行比較,他們的key值要一致,然後直接寫個方法兩個key值對應去比較值,不同就記錄下來
其實我覺得題主的方法未必不可,通過題主的描述,應該是一個大表單的Update
而這種入口也不會很多吧?
我覺得唯一可以做的,就是不需要把這些東西放在主商務程序裡面而且應該是非同步。噶虐可以通過訊息機制或者其它方式來非同步完成這件事情。