我使用Workbench和phpMyAdmin使用mySql,我使用过程和函数等... 有时一个程序会触发另一个函数,依此类推......最终会出现问题。
是否有任何人都知道可以显示mySql运行的所有查询的工具? 就像显示MySql运行的每个命令的命令提示符一样
这将是一个非常有用的调试工具
答案 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以使其获取配置文件中的更改。
这应该记录所有执行的查询(虽然我不确定它是否会记录在存储过程中执行的查询)。