2010-10-01 86 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