Files
oc-server3/htdocs/lib/sqldebugger.inc.php

355 lines
8.3 KiB
PHP

<?php
/****************************************************************************
./lib/sqldebugger.inc.php
--------------------
begin : Mon June 27 2006
For license information see doc/license.txt
Unicode Reminder メモ
****************************************************************************/
require_once($opt['rootpath'] . 'lib/bench.inc.php');
$sqldbg_cmdNo = 0;
$sqldbg_sumTimes = 0;
function sqldbg_begin()
{
header('Content-type: text/html; charset=utf-8');
?>
<html>
<head>
<title></title>
<style type="text/css">
<!--
.sqlno
{
font-size:medium;
}
.sqlcommand
{
}
.selrows
{
margin-bottom:15px;
}
.firstresultrow
{
}
.result
{
display:none;
}
.explain
{
}
.runtime
{
}
.affectedrows
{
}
.allruntime
{
font-size:medium;
}
.comments
{
color:gray;
}
.white
{
color:white;
}
.error
{
color:red;
font-size:medium;
}
.errormsg
{
}
table
{
margin-bottom:15px;
}
td
{
color:gray;
font-size:x-small;
white-space:nowrap;
padding:1px 5px 1px 5px;
}
th
{
color:gray;
}
.slave_title
{
font-style:italic;
color:blue;
}
.slave_sql
{
color:blue;
}
-->
</style>
<script type="text/javascript">
<!--
function switchOpt(id)
{
var cssRules = "";
if (document.all)
cssRules = "rules";
else
cssRules = "cssRules";
var value = document.getElementById(id).checked ? "block" : "none";
for (var i = 0; i < document.styleSheets.length; i++)
for (var j = 0; j < document.styleSheets[i][cssRules].length; j++)
if (document.styleSheets[i][cssRules][j].selectorText == "." + id)
document.styleSheets[i][cssRules][j].style["display"] = value;
}
//-->
</script>
</head>
<body>
<div class="white">/*</div>
<table>
<tr>
<td><input checked="checked" onclick="switchOpt('sqlno')" id="sqlno" type="checkbox" /><label for="sqlno">Command number</label></td>
<td><input checked="checked" onclick="switchOpt('sqlcommand')" id="sqlcommand" type="checkbox" /><label for="sqlcommand">Sql command</label></td>
<td><input checked="checked" onclick="switchOpt('selrows')" id="selrows" type="checkbox" /><label for="selrows">Selected rows</label></td>
<td><input checked="checked" onclick="switchOpt('firstresultrow')" id="firstresultrow" type="checkbox" /><label for="firstresultrow">First result row</label></td>
</tr>
<tr>
<td><input onclick="switchOpt('result')" id="result" type="checkbox" /><label for="result">Result rows</label></td>
<td><input checked="checked" onclick="switchOpt('explain')" id="explain" type="checkbox" /><label for="explain">Explain query</label></td>
<td><input checked="checked" onclick="switchOpt('runtime')" id="runtime" type="checkbox" /><label for="runtime">Runtime</label></td>
<td><input checked="checked" onclick="switchOpt('affectedrows')" id="affectedrows" type="checkbox" /><label for="affectedrows">Affected rows</label></td>
</tr>
<tr>
<td><input checked="checked" onclick="switchOpt('allruntime')" id="allruntime" type="checkbox" /><label for="allruntime">Runtime sum</label></td>
<td><input checked="checked" onclick="switchOpt('comments')" id="comments" type="checkbox" /><label for="comments">Comments</label></td>
</tr>
</table>
<div class="white">*/</div>
<?php
}
function sqldbg_execute($sql, $bSlave)
{
global $dblink;
global $sqldbg_cmdNo;
global $sqldbg_sumTimes;
$sqldbg_cmdNo++;
echo '<p class="sqlno"><span class="white">/*</span> SQL command ' . $sqldbg_cmdNo . ' ';
if ($bSlave)
echo '<span class="slave_title">(slave)</span>';
echo '<span class="white">*/</span>';
echo '</p>';
echo '<p class="sqlcommand">';
if ($bSlave)
echo '<span class="slave_sql">';
echo htmlspecialchars($sql, ENT_COMPAT, 'UTF-8');
if ($bSlave)
echo '</span>';
echo ' ;</p>';
echo '<div class="comments"><div class="white">/*</div><br>';
// Explains
$bUseExplain = true;
$sqlexplain = $sql;
$usebr = false;
if (mb_strtoupper(mb_substr($sqlexplain, 0, 6)) == 'ALTER ')
$bUseExplain = false;
else if (mb_strtoupper(mb_substr($sqlexplain, 0, 7)) == 'DELETE ')
{
$sqlexplain = sqldbg_strip_from($sqlexplain);
}
else if ((mb_strtoupper(mb_substr($sqlexplain, 0, 12)) == 'INSERT INTO ') ||
(mb_strtoupper(mb_substr($sqlexplain, 0, 19)) == 'INSERT IGNORE INTO '))
{
$sqlexplain = sqldbg_strip_temptable($sqlexplain);
if ($sqlexplain == '')
$bUseExplain = false;
}
else if (mb_strtoupper(mb_substr($sqlexplain, 0, 7)) == 'INSERT ')
$bUseExplain = false;
else if (mb_strtoupper(mb_substr($sqlexplain, 0, 7)) == 'UPDATE ')
$bUseExplain = false;
else if (mb_strtoupper(mb_substr($sqlexplain, 0, 11)) == 'DROP TABLE ')
$bUseExplain = false;
else if (mb_strtoupper(mb_substr($sqlexplain, 0, 23)) == 'CREATE TEMPORARY TABLE ')
{
$sqlexplain = sqldbg_strip_temptable($sqlexplain);
if ($sqlexplain == '')
$bUseExplain = false;
}
if ($bUseExplain == true)
{
$bFirstLine = true;
$nLine = 0;
$rs = mysql_query($sqlexplain, $dblink);
echo '<div class="selrows">Number of selected rows: ' . mysql_num_rows($rs) . '</div>';
echo '<table class="firstresultrow" border="1">';
while ($r = sql_fetch_assoc($rs))
{
$usebr = true;
$nLine++;
if ($bFirstLine == true)
{
echo '<tr>' . "\n";
foreach ($r AS $field => $value)
{
echo '<th>' . htmlspecialchars($field, ENT_COMPAT, 'UTF-8') . '</th>' . "\n";
}
echo '</tr>' . "\n";
}
if ($bFirstLine)
echo '<tr>';
else
echo '<tr class="result">';
foreach ($r AS $value)
{
echo '<td>' . htmlspecialchars(($value != null) ? $value : 'NULL', ENT_COMPAT, 'UTF-8') . '</td>';
}
echo '</tr>' . "\n";
if ($nLine == 25) break;
$bFirstLine = false;
}
echo '</table>';
mysql_free_result($rs);
echo '<table class="explain" border="1">';
$bFirstLine = true;
$rs = mysql_query('EXPLAIN EXTENDED ' . $sqlexplain);
while ($r = sql_fetch_assoc($rs))
{
if ($bFirstLine == true)
{
echo '<tr>';
foreach ($r AS $field => $value)
{
echo '<th>' . htmlspecialchars($field, ENT_COMPAT, 'UTF-8') . '</th>';
}
echo '</tr>' . "\n";
$bFirstLine = false;
}
echo '<tr>';
foreach ($r AS $value)
{
echo '<td>' . htmlspecialchars(($value != null) ? mb_ereg_replace('\*/', '* /', $value) : 'NULL', ENT_COMPAT, 'UTF-8') . '</td>';
}
echo '</tr>' . "\n";
}
echo '</table>';
$usebr = true;
}
// dont use query cache!
$sql = sqldbg_insert_nocache($sql);
$bSqlExecution = new Cbench;
$bSqlExecution->start();
$rsResult = mysql_query($sql, $dblink);
$bError = ($rsResult == false);
$bSqlExecution->stop();
$sqldbg_sumTimes += $bSqlExecution->Diff();
if ($bError == true)
{
echo '<div class="error">Error while executing SQL command!</div>';
echo '<div class="errormsg">';
echo '<table>';
$rs = mysql_query('SHOW WARNINGS', $dblink);
while ($r = sql_fetch_assoc($rs))
echo '<tr><td>' . htmlspecialchars($r['Message'], ENT_COMPAT, 'UTF-8') . '</td></tr>';
echo '</table>';
echo '</div>';
}
echo '<div class="runtime">Runtime: ' . sprintf('%01.5f', $bSqlExecution->Diff()) . ' sek.</div>';
echo '<div class="affectedrows">Number of affected rows: ' . mysql_affected_rows($dblink) . '</div>';
echo '<div class="white">*/</div></div>';
return $rsResult;
}
function sqldbg_end()
{
global $sqldbg_sumTimes;
echo '<span class="white">/*</span><div class="allruntime"><hr>';
echo 'Runtime sum: ' . sprintf('%01.5f', $sqldbg_sumTimes) . ' sek.<span class="white">*/</span></div>';
echo '</body></html>';
exit;
}
function sqldbg_strip_temptable($sql)
{
$start = mb_strpos(mb_strtoupper($sql), 'SELECT ');
if ($start === false)
return '';
return mb_substr($sql, $start);
}
function sqldbg_strip_from($sql)
{
$start = mb_strpos(mb_strtoupper($sql), 'FROM ');
if ($start === false)
return '';
return 'SELECT * ' . mb_substr($sql, $start);
}
function sqldbg_insert_nocache($sql)
{
if (mb_strtoupper(mb_substr($sql, 0, 7)) == 'SELECT ')
$sql = 'SELECT SQL_NO_CACHE ' . mb_substr($sql, 7);
return $sql;
}
?>