2006年10月15日 星期日

trace code中對DB的操作

trace php code時,了解DB Schema是件困難的事,用phpMyAdmin看會對架構有點頭緒,但不容易掌握DB操作的流程,也不容易了解各個table之間的互動,比方註冊一個帳號到底動到那些table的那些field?通常會填入什麼值?

較有規模的php套件應該都會集中用db_query()之類的函式執行SQL指令,所以就在db_query()裡寫入log function,再決定把SQL指令寫到暫存檔或是輸出到web,下面是我改SMF的例子(相當粗糙的改法,抓精神就好)

in Sources/Subs.php:

// 自訂的log function function my_log($function, $string) { global $boarddir; $log_file = "my_log/log.txt"; if (($fw = fopen("$boarddir/$log_file", "a")) == false) { echo "cannot open '$log_file'<br />\n"; return false; } if (fwrite($fw, "<$function>: $string\n") === false) { echo "cannot write to '$log_file'<br />\n"; return false; } fclose($fw); }

// Do a query. Takes care of errors too. function db_query($db_string, $file, $line) { ... $ret = mysql_query($db_string, $db_connection); // add by chlo, 2006/10/03 $log_level = 1; if ($log_level == 2) { // log all sql my_log("db_query", $db_string); } else if ($log_level == 1) { // log insert,delete,update if (strstr(strtolower($db_string), "select") == false) my_log("db_query", $db_string); } // -END- ... }

上面的$log_file和$log_level放到config檔或$_SESSION裡會漂亮點,也可以加上$output的設定,決定要寫入檔案還是web顯示。

於是我們可以修改$log_level決定log DB操作的種類,實際操作SMF,再到my_log/log.txt看操作結果,藉由這樣的作法,很容易就能了解database。自己刻系統時也可以這麼做,方便確認SQL語法有無寫錯

沒有留言:

張貼留言