Files
FendxPHP/scripts/quick-db-check.php

159 lines
4.4 KiB
PHP
Raw Normal View History

<?php
declare(strict_types=1);
/**
* 快速数据库检查脚本
* 用法: php scripts/quick-db-check.php
*/
// 加载环境配置
function loadEnv(): void
{
$envFile = __DIR__ . '/../.env';
if (file_exists($envFile)) {
$lines = file($envFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
if (strpos($line, '=') !== false && !str_starts_with($line, '#')) {
list($key, $value) = explode('=', $line, 2);
$_ENV[trim($key)] = trim($value);
$_SERVER[trim($key)] = trim($value);
}
}
}
}
// 检查数据库连接
function checkDatabaseConnection(): array
{
$config = [
'host' => $_ENV['DB_HOST'] ?? 'localhost',
'port' => $_ENV['DB_PORT'] ?? '3306',
'database' => $_ENV['DB_DATABASE'] ?? 'fendx_php',
'username' => $_ENV['DB_USERNAME'] ?? 'root',
'password' => $_ENV['DB_PASSWORD'] ?? '',
];
echo "🔍 检查数据库连接...\n";
echo " 主机: {$config['host']}:{$config['port']}\n";
echo " 数据库: {$config['database']}\n";
echo " 用户名: {$config['username']}\n\n";
try {
$dsn = "mysql:host={$config['host']};port={$config['port']};charset=utf8mb4";
$pdo = new PDO($dsn, $config['username'], $config['password'], [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
echo "✅ 数据库连接成功\n";
return ['success' => true, 'pdo' => $pdo, 'config' => $config];
} catch (PDOException $e) {
echo "❌ 数据库连接失败: " . $e->getMessage() . "\n";
return ['success' => false, 'error' => $e->getMessage()];
}
}
// 检查数据库是否存在
function checkDatabaseExists(PDO $pdo, string $database): bool
{
try {
$stmt = $pdo->query("SHOW DATABASES LIKE '$database'");
$result = $stmt->fetch();
if ($result) {
echo "✅ 数据库 '$database' 存在\n";
return true;
} else {
echo "❌ 数据库 '$database' 不存在\n";
return false;
}
} catch (PDOException $e) {
echo "❌ 检查数据库失败: " . $e->getMessage() . "\n";
return false;
}
}
// 创建数据库
function createDatabase(PDO $pdo, string $database): bool
{
try {
$pdo->exec("CREATE DATABASE IF NOT EXISTS `$database` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
echo "✅ 数据库 '$database' 创建成功\n";
return true;
} catch (PDOException $e) {
echo "❌ 创建数据库失败: " . $e->getMessage() . "\n";
return false;
}
}
// 检查表结构
function checkTables(PDO $pdo, string $database): void
{
try {
$pdo->exec("USE `$database`");
$stmt = $pdo->query("SHOW TABLES");
$tables = $stmt->fetchAll(PDO::FETCH_COLUMN);
if (empty($tables)) {
echo "⚠️ 数据库中没有表\n";
return;
}
echo "📊 数据库表:\n";
foreach ($tables as $table) {
$stmt = $pdo->query("SELECT COUNT(*) FROM `$table`");
$count = $stmt->fetchColumn();
echo " - $table ($count 条记录)\n";
}
} catch (PDOException $e) {
echo "❌ 检查表失败: " . $e->getMessage() . "\n";
}
}
// 主检查函数
function main(): void
{
echo "🚀 FendxPHP 快速数据库检查\n";
echo str_repeat("=", 40) . "\n";
// 加载环境配置
loadEnv();
// 检查数据库连接
$result = checkDatabaseConnection();
if (!$result['success']) {
echo "\n💡 解决建议:\n";
echo " 1. 检查数据库服务是否启动\n";
echo " 2. 验证数据库连接配置\n";
echo " 3. 确认用户权限正确\n";
return;
}
$pdo = $result['pdo'];
$database = $result['config']['database'];
echo "\n";
// 检查数据库是否存在
if (!checkDatabaseExists($pdo, $database)) {
echo "\n🔧 尝试创建数据库...\n";
if (createDatabase($pdo, $database)) {
echo "✅ 数据库已创建,请运行迁移命令:\n";
echo " php bin/console migrate:run\n";
}
return;
}
echo "\n";
// 检查表结构
checkTables($pdo, $database);
echo "\n" . str_repeat("=", 40) . "\n";
echo "✅ 数据库检查完成\n";
}
// 运行检查
main();
?>