PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]); } catch (Throwable $e) { fwrite(STDERR, '数据库连接失败: ' . $e->getMessage() . "\n"); exit(1); } $prefix = (string) ($conn['prefix'] ?? ''); $powerTable = $prefix . 'backend_power'; $rolePowerTable = $prefix . 'backend_role_power'; $shopTable = $prefix . 'common_shop'; echo "[连接] {$conn['hostname']}:" . ($conn['hostport'] ?? 3306) . " / {$conn['database']} (表前缀 {$prefix})\n"; /* ------------------------- 3. 菜单 / 权限节点 + 角色授权 ------------------------- */ $tableExists = static function (string $table) use ($pdo): bool { return (bool) $pdo->query("SHOW TABLES LIKE '{$table}'")->fetchColumn(); }; if (! $tableExists($powerTable)) { echo "[权限] {$powerTable} 不存在,跳过\n"; echo "[数据表] {$shopTable} 不存在,跳过\n"; exit(0); } $stmt = $pdo->prepare( "SELECT `id`, `name`, `title` FROM `{$powerTable}` WHERE `name` = 'shop' OR `name` LIKE 'shop:%' ORDER BY `id`" ); $stmt->execute(); $powers = $stmt->fetchAll(); if (! $powers) { echo "[权限] 没有 shop 相关权限节点,跳过\n"; } else { echo '[权限] 命中 ' . count($powers) . " 个节点:\n"; foreach ($powers as $row) { echo sprintf(" #%d %s (%s)\n", (int) $row['id'], $row['name'], $row['title']); } $ids = array_map('intval', array_column($powers, 'id')); $in = implode(',', $ids); $hasRolePower = $tableExists($rolePowerTable); $grantRows = $hasRolePower ? (int) $pdo->query("SELECT COUNT(*) FROM `{$rolePowerTable}` WHERE `power_id` IN ({$in})")->fetchColumn() : 0; $powerRows = (int) $pdo->query("SELECT COUNT(*) FROM `{$powerTable}` WHERE `id` IN ({$in}) OR `pid` IN ({$in})")->fetchColumn(); echo "[授权] {$rolePowerTable} 待删 {$grantRows} 条\n"; echo "[权限] {$powerTable} 待删 {$powerRows} 条(含挂在它们下面的子按钮)\n"; if ($force) { $pdo->beginTransaction(); try { if ($hasRolePower) { $pdo->exec("DELETE FROM `{$rolePowerTable}` WHERE `power_id` IN ({$in})"); } $affected = $pdo->exec("DELETE FROM `{$powerTable}` WHERE `id` IN ({$in}) OR `pid` IN ({$in})"); $pdo->commit(); echo "[执行] 已删授权 {$grantRows} 条、权限节点 {$affected} 条\n"; } catch (Throwable $e) { $pdo->rollBack(); fwrite(STDERR, '[失败] 权限清理回滚: ' . $e->getMessage() . "\n"); exit(1); } } } /* ------------------------- 4. 数据表 ------------------------- */ if ($pdo->query("SHOW TABLES LIKE '{$shopTable}'")->fetchColumn()) { $rows = (int) $pdo->query("SELECT COUNT(*) FROM `{$shopTable}`")->fetchColumn(); echo "[数据表] {$shopTable} 存在,共 {$rows} 行\n"; if ($force) { $pdo->exec("DROP TABLE `{$shopTable}`"); echo "[执行] 已 DROP TABLE `{$shopTable}`\n"; } } else { echo "[数据表] {$shopTable} 不存在,跳过\n"; } echo $force ? "[完成] 内置商城残留已清理。后台菜单即时生效(MenuRegistry 每次请求读库,无缓存)\n" : "[提示] 以上为预演结果,未做任何改动。确认后执行: php scripts/purge_builtin_shop.php --force\n";