本程式實作一個輕量級的 MySQL 資料庫瀏覽器,採用單一檔案架構,透過 cmd 參數控制三層導航流程:資料庫列表 → 資料表列表 → 記錄內容。適合快速檢視資料庫結構與資料,可作為管理工具雛形擴充。
if(!isset($cmd)) $cmd = 'db';
switch($cmd){
case 'db': break; // 顯示資料庫列表
case 'table': break; // 顯示指定資料庫的資料表
case 'record':break; // 顯示指定資料表的記錄
default: $cmd='db'; // 預設回資料庫列表
}
使用 switch-case 實作簡單狀態機,根據 cmd 參數決定顯示層級,邏輯清晰易維護。
$host = 'localhost';
$user = 'test';
$password = '';
$con = @mysql_connect($host,$user,$password) or die('無法連接'.$host);
基本連線設定,生產環境建議改用環境變數管理敏感資訊。
?cmd=db)case 'db':
$dbs = mysql_list_dbs($con) or die('mysql_list_dbs 出錯:'.$php_errmsg);
echo 'databases on '.$host.':<br>'.chr(13);
$num_rows = mysql_num_rows($dbs);
for($i=0;$i<$num_rows;$i++){
$db = mysql_tablename($dbs,$i);
echo '<a href="'.$PHP_SELF.'?cmd=table&db='.urlencode($db).'">'.$db.'</a><br>'.chr(13);
}
mysql_free_result($dbs);
break;
呼叫 mysql_list_dbs() 取得所有資料庫,產生連結指向第 2 層並帶入資料庫名稱。
?cmd=table&db=xxx)case 'table':
$tables = @mysql_list_tables($db,$con) or die('mysql_list_tables 出錯:'.$php_errmsg);
echo 'tables on '.$db.' of '.$host.':<br>'.chr(13);
$num_rows = mysql_num_rows($tables);
for($i=0;$i<$num_rows;$i++){
$table = mysql_tablename($tables,$i);
echo '<a href="'.$PHP_SELF.'?cmd=record&db='.urlencode($db).'&table='.urlencode($table).'">'.$table.'</a><br>'.chr(13);
}
mysql_free_result($tables);
echo '<hr><a href="'.$PHP_SELF.'?cmd=db">show databases</a>'.chr(13);
break;
使用 mysql_list_tables() 列出指定資料庫的所有資料表,提供返回資料庫列表的導航連結。
?cmd=record&db=xxx&table=yyy)case 'record':
$records = mysql_db_query($db,'select * from '.$table,$con) or die('mysql_db_query 出錯:'.$php_errmsg);
echo 'records on '.$table.':<br>'.chr(13);
echo '<table border="1" cellspacing="0" cellpadding="0">'.chr(13);
echo '<tr>'.chr(13);
$num_fields = mysql_num_fields($records);
for($i=0;$i<$num_fields;$i++)
echo '<th> '.mysql_field_name($records,$i).'</th>'.chr(13);
echo '</tr>'.chr(13);
while($row=mysql_fetch_row($records)){
echo '<tr>'.chr(13);
for($i=0;$i<$num_fields;$i++)
echo '<td> '.$row[$i].'</td>'.chr(13);
echo '</tr>'.chr(13);
}
echo '</table>'.chr(13);
mysql_free_result($records);
echo '<hr><a href="'.$PHP_SELF.'?cmd=db">show databases</a> <a href="'.$PHP_SELF.'?cmd=table&db='.urlencode($db).'">show tables</a>'.chr(13);
break;
執行 SELECT * 查詢並以 HTML 表格呈現,動態產生欄位標題與資料列,提供雙層返回導航。
$table 直接拼接進 SQL,攻擊者可構造 ?cmd=record&db=test&table=users;DROP TABLE users;--mysql_*,PHP 7.0+ 已移除die() 直接輸出 SQL 錯誤細節// PDO 版本資料庫列表範例
$pdo = new PDO("mysql:host=$host;charset=utf8", $user, $password);
$dbs = $pdo->query("SHOW DATABASES")->fetchAll(PDO::FETCH_COLUMN);
foreach($dbs as $db) {
echo "<a href='?cmd=table&db=".urlencode($db)."'>$db</a><br>";
}
建議採用 PDO + 預處理語句、加入登入驗證、實作資料表名稱白名單驗證、使用模板引擎分離邏輯與顯示。
這個簡單的瀏覽器展示了 PHP 操作 MySQL 中繼資料的核心 API 用法。雖然原始版本存在安全隱憂,但架構概念清晰,是學習資料庫管理工具開發的良好起點。實際部署前請務必完成安全性強化。