連接資料庫,查詢所有資料表,統計各表記錄筆數,並依筆數由大到小排序輸出。
<?php
$host = '127.0.0.1';
$port = 3306;
$dbname = 'test';
$username = 'root';
$password = '';
// 通用輸出函數(支援 CLI 與 Web)
function ee($p) {
if (PHP_SAPI == 'cli') { echo "\n"; }
else { echo "<pre>"; }
print_r($p);
if (PHP_SAPI == 'cli') { echo "\n"; }
else { echo "</pre>"; }
}
// PDO 連線設定
$dsn = "mysql:host={$host};port={$port};dbname={$dbname}";
$opts = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_AUTOCOMMIT => 0,
);
try {
$pdo = new PDO($dsn, $username, $password, $opts);
} catch (PDOException $e) {
echo $e->getMessage();
exit;
}
// 有結果集查詢
function query($sql) {
global $pdo;
$stmt = $pdo->query($sql);
return $stmt->fetchAll(PDO::FETCH_BOTH);
}
// 無結果集執行
function execute($sql) {
global $pdo;
return $pdo->query($sql);
}
// 1. 取得所有資料表
$tables = query("SHOW TABLES");
$sort_data = array();
$sort_index = array();
// 2. 統計各表記錄數
foreach ($tables as $table) {
$table_name = $table[0];
$count_sql = "SELECT COUNT(*) AS num FROM `{$table_name}`";
$stmt = $pdo->query($count_sql);
$info = $stmt->fetch(PDO::FETCH_BOTH);
// 為了輸出對齊,補空白至 25 字元
$pad_table = str_pad($table_name, 25, ' ');
$sort_data[] = array('table' => $pad_table, 'num' => $info['num']);
$sort_index[] = $info['num'];
}
// 3. 多維陣列排序:依 num 遞減
array_multisort($sort_index, SORT_DESC, $sort_data);
// 4. 輸出結果
foreach ($sort_data as $val) {
$row_str = <<<EOF
{$val['table']} [{$val['num']}]
EOF;
ee($row_str);
}
<<<EOF ... EOF 方便多行字串輸出users [1500] orders [892] products [456] logs [234] categories [12]
SHOW TABLE STATUS