打印mySql生成的所有查询

时间:2010-10-01 09:12:00

标签: php debugging logging mysql

我使用Workbench和phpMyAdmin使用mySql,我使用过程和函数等... 有时一个程序会触发另一个函数,依此类推......最终会出现问题。

是否有任何人都知道可以显示mySql运行的所有查询的工​​具? 就像显示MySql运行的每个命令的命令提示符一样

这将是一个非常有用的调试工具

4 个答案:

答案 0 :(得分:1)

运行SET GLOBAL general_log = 'ON';,所有查询都将记录到日志文件中。见here

答案 1 :(得分: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("me@example.com",
              "[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;
     }

 }


答案 2 :(得分:0)

在数据库抽象类中,最好的方法是添加一个调试选项,将查询和调试信息记录到文件中,或者如果应用程序中有足够的开销,请将它们全部保存在变量中在运行时检查。一旦你在那里得到了所有这些信息,就可以用控件将它输出到一个隐藏的div,或者用xdebug和netbeans之类的东西直接检查它。

总的来说 - 如果你有一个想要调试的大型应用程序,那么花点时间研究断点和交互式调试是非常值得的 - 设置并不是那么复杂且非常有用。我asked about this recently,这真的帮助了我这种东西!

如果您的数据库调用未被抽象(羞耻!),那么您可以使用APD扩展覆盖核心PHP函数以包含调试调用,如PHP站点上的this useful example所示。很有用!例如,您可以使用自己的代码覆盖mysql_query()以记录查询。

答案 3 :(得分:0)

编辑MySQL配置文件(my.cnf或my.ini)并在log="/path/to/yourlog.log"部分添加[mysqld]行。确保重新启动MySQL以使其获取配置文件中的更改。

这应该记录所有执行的查询(虽然我不确定它是否会记录在存储过程中执行的查询)。