2010-10-01 64 views
2

我使用Workbench和phpMyAdmin與mySql一起工作,使用過程和函數等... 有時一個過程觸發另一個函數等等......最終在某處出錯。打印mySql生成的所有查詢

是否有任何可以顯示mySql所有查詢的人知道的工具? 像在命令提示符下顯示的每個命令的MySQL運行

這將是一個非常有用的調試工具

回答

1

運行SET GLOBAL general_log = 'ON';,所有查詢將被記錄到日誌文件。見here

0

我在一個非常大的網站上使用這個功能我做:




define(test, 3); 

function my_query($SQL){//this is a layer over mysql_query to get interesting data while debugging 

    if(test == 3){ // paranoia 

      $query_start = get_microtime_ms(); 
      $exp = mysql_query("EXPLAIN ".$SQL); 
      $query_end = get_microtime_ms(); 
      $query_time = $query_end - $query_start; 
      $explain .="\n<table border=\"1\">"; 
      $explain .="<tr><td>id</td><td>select_type</td><td>table</td><td>type</td><td>possible_keys</td><td>key</td><td>key_len</td><td>ref</td><td>rows</td><td>Extra</td></tr>"; 

      while($explain_r = mysql_fetch_array($exp)){ 
       $explain .="\n\t<tr>"; 
        for($i=0;$i<10;$i++){ 
         $explain .= "\n\t\t<td>".$explain_r[$i]." </td>"; 
        } 
       $explain .="\n\t</tr>"; 
      } 
      $explain .="\n</table>"; 
      $r = mysql_query($SQL)or die(mysql_error(),$SQL); 
      $returned = mysql_num_rows($r); 
      print("<pre>".trim($SQL)."\n".$explain."Time spent: ".$query_time."\nReturned rows: ".$returned."\n--------------\n</pre>"); 
      return $r; 

    } 

    if(test == 2){ // hard debugging 
     print("<pre>\n\n".trim($SQL)."\n--------------\n</pre>"); 
     $r = mysql_query($SQL)or die((mysql_error(),$SQL)); 
     return $r; 
    } 
    elseif(test == 1){ // testing 
     $r = mysql_query($SQL)or die((mysql_error(),$SQL)); 
     return $r; 
    } 
    elseif(test == 0){ //production 

     if($_SESSION['uid'] == 59){ 
      $only_me = $SQL; 
     } 



    $r = mysql_query($SQL)or die(
     mail("[email protected]", 
       "[Error http://".$_SERVER["HTTP_HOST"].$_SERVER['REQUEST_URI']."] Error on ".$_SERVER['SCRIPT_NAME'], 
       "From: ".$_SERVER['REMOTE_ADDR']. 
       "\nReferer: ".$_SERVER['HTTP_REFERER']."\nDate: ".date()."\nError:\n".mysql_error()."\n".$SQL. 
       "\nUsername: ".$_SESSION['username']."\nhttp://".$_SERVER["HTTP_HOST"].$_SERVER['REQUEST_URI']. 
       "\nRef: ".$_SERVER['HTTP_REFERER']). 
       " a query went wrong <a href=\"http://example.com\">Please click here to go back to home page</a><br><br><pre>$only_me".mysql_error()."</pre>"); 
     return $r; 
    } 

} 


0

在你的數據庫抽象類,做到這一點的最好辦法是添加日誌查詢和調試信息的調試選項一個文件,或者如果在你的應用程序中有足夠的開銷,將它保存在一個你可以在運行時檢查的變量中。一旦你掌握了所有這些信息,你就可以將它輸出到帶有控件的隱藏div中,或者直接用xdebug和netbeans等來檢查它。

一般說明 - 如果你有一個你想調試的大型應用程序,確實值得花一點時間研究斷點和交互式調試 - 它的設置並不複雜,而且非常有用。我asked about this recently,它真的幫助我這種東西!

如果您的數據庫調用不是抽象的(羞愧!),那麼您可以使用APD擴展在PHP網站上覆蓋核心PHP函數以包含調試調用,如this useful example所示。很有用!例如,您可以用您自己的代碼覆蓋mysql_query()以記錄查詢。

0

編輯您的MySQL配置文件(my.cnf或my.ini)並在[mysqld]部分添加log="/path/to/yourlog.log"行。確保你重新啓動MySQL,讓它獲得配置文件中的更改。

這應該記錄所有執行的查詢(儘管我不確定它會記錄在存儲過程中執行的查詢)。

+0

順便說一句,這僅適用於使用MySQL 5.1.29以前的版本... – wimvds 2010-10-01 11:12:38