
易優上傳文件報錯涉及數據庫連接問題,以下是系統性解決方案:
// 創建測試文件:test_db.php
<?php
// 測試數據庫連接
$config = [
'hostname' => 'localhost',
'database' => 'your_db',
'username' => 'your_user',
'password' => 'your_pass',
'hostport' => '3306',
'charset' => 'utf8mb4',
];
try {
$link = new mysqli(
$config['hostname'],
$config['username'],
$config['password'],
$config['database'],
$config['hostport']
);
if ($link->connect_error) {
die("連接失敗: " . $link->connect_error);
}
echo "? 數據庫連接成功<br>";
// 測試易優關鍵表
$tables = ['ey_uploads', 'ey_we_media', 'ey_files'];
foreach($tables as $table){
$result = $link->query("SHOW TABLES LIKE '{$table}'");
echo $result->num_rows > 0 ? "? {$table} 表存在<br>" : "? {$table} 表不存在<br>";
}
$link->close();
} catch(Exception $e) {
echo "? 錯誤: " . $e->getMessage();
}
?>// 檢查配置文件:config/database.php return [ // 數據庫類型 'type' => 'mysql', // 服務器地址 'hostname' => '127.0.0.1', // 不要用localhost // 數據庫名 'database' => 'eyouCMS', // 確保正確 // 用戶名 'username' => 'root', // 修改為實際用戶 // 密碼 'password' => 'your_password', // 端口 'hostport' => '3306', // 連接dsn 'dsn' => '', // 數據庫連接參數 'params' => [], // 數據庫編碼默認采用utf8mb4 'charset' => 'utf8mb4', // 數據庫表前綴 'prefix' => 'ey_', // 數據庫調試模式 'debug' => true, // 數據庫部署方式:0 集中式(單一服務器),1 分布式(主從服務器) 'deploy' => 0, // 數據庫讀寫是否分離 'rw_separate' => false, // 讀寫分離后 主服務器數量 'master_num' => 1, // 指定從服務器序號 'slave_no' => '', // 自動讀取主庫數據 'read_master' => false, // 是否嚴格檢查字段是否存在 'fields_strict' => true, // 數據集返回類型 'resultset_type' => 'array', // 自動寫入時間戳字段 'auto_timestAMP' => false, // 時間字段取出后的默認時間格式 'datetime_format' => 'Y-m-d H:i:s', // 是否需要進行SQL性能分析 'sql_explain' => false, // Builder類 'builder' => '', // Query類 'query' => '\\think\\db\\Query', // 是否需要斷線重連 'break_reconnect' => true, // 重要:設置為true // 斷線標識字符串 'break_match_str' => [], ];
-- 檢查上傳相關表是否存在 SHOW TABLES LIKE 'ey_uploads'; SHOW TABLES LIKE 'ey_files'; -- 如果表不存在,重新創建 CREATE TABLE IF NOT EXISTS `ey_uploads` ( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `path` varchar(255) NOT NULL DEFAULT '' COMMENT '文件路徑', `url` varchar(255) NOT NULL DEFAULT '' COMMENT '文件URL', `original_name` varchar(255) NOT NULL DEFAULT '' COMMENT '原始文件名', `file_name` varchar(255) NOT NULL DEFAULT '' COMMENT '存儲文件名', `file_size` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '文件大小', `file_ext` varchar(20) NOT NULL DEFAULT '' COMMENT '文件擴展名', `mime` varchar(100) NOT NULL DEFAULT '' COMMENT '文件MIME類型', `md5` varchar(32) NOT NULL DEFAULT '' COMMENT '文件MD5', `sha1` varchar(40) NOT NULL DEFAULT '' COMMENT '文件SHA1', `create_time` int(10) UNSIGNED NOT NULL DEFAULT '0', `update_time` int(10) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `md5` (`md5`), KEY `sha1` (`sha1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='上傳文件表'; -- 修復表結構 REPAIR TABLE ey_uploads; OPTIMIZE TABLE ey_uploads;
# 檢查文件權限 cd /你的網站目錄 chmod -R 755 runtime chmod -R 755 public/uploads chmod 755 config/database.php # 檢查數據庫用戶權限 mysql -u root -p GRANT ALL PRIVILEGES ON your_database.* TO 'your_user'@'localhost' IDENTIFIED BY 'your_password'; FLUSH PRIVILEGES;
// 修改上傳配置:config/upload.php return [ 'default' => 'local', 'drivers' => [ 'local' => [ 'class' => \think\filesystem\driver\Local::class, 'root' => app()->getRootPath() . 'public/uploads', ], ], 'disks' => [ 'public' => [ 'type' => 'local', 'root' => app()->getRootPath() . 'public/uploads', 'url' => '/uploads', ], ], // 增加以下配置 'max_size' => 10485760, // 10MB 'ext' => 'jpg,jpeg,png,gif,bmp,zip,rar,7z,pdf,doc,docx,xls,xlsx,ppt,pptx,txt', 'mime' => [ 'image/jpeg', 'image/png', 'image/gif', 'application/zip', 'application/x-rar-compressed', 'application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', ], ];
// 臨時開啟詳細錯誤顯示 // 修改 config/app.php 'debug' => true, // 確保為true 'log' => [ 'level' => ['error', 'debug', 'sql'], // 開啟sql日志 ],
# 查看錯誤日志 tail -f runtime/log/error.log tail -f runtime/log/sql.log # 查看PHP錯誤日志 tail -f /var/log/php-fpm/error.log tail -f /usr/local/php/var/log/php-fpm.log
// 創建數據庫連接測試
// test_connection.php
<?php
include 'config/database.php';
try {
$dsn = "mysql:host={$config['hostname']};dbname={$config['database']};charset={$config['charset']}";
$pdo = new PDO($dsn, $config['username'], $config['password']);
echo "數據庫連接成功!";
// 檢查表結構
$stmt = $pdo->query("DESCRIBE ey_uploads");
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($result);
} catch(PDOException $e) {
echo "連接失敗: " . $e->getMessage();
}
?># 解決方案 1. 檢查MySQL服務是否運行 systemctl status mysqld systemctl start mysqld 2. 檢查端口是否正確 netstat -tlnp | grep 3306 3. 修改配置為127.0.0.1 # config/database.php 'hostname' => '127.0.0.1', # 不是localhost
-- 解決方案:重置數據庫密碼 ALTER USER 'your_user'@'localhost' IDENTIFIED BY 'new_password'; FLUSH PRIVILEGES;
-- 表不存在,重新創建 -- 執行易優SQL安裝文件中的創建表語句 source /路徑/EyouCMS.sql
# 安裝PDO擴展 # CentOS yum install php-pdo php-mysqlnd # Ubuntu apt-get install php-mysql php-pdo systemctl restart php-fpm
<?php
/**
* 易優上傳功能修復腳本
*/
error_reporting(E_ALL);
ini_set('dISPlay_errors', 1);
class EyouUploadRepair
{
private $config;
private $db;
public function __construct()
{
$this->loadConfig();
$this->connectDB();
}
private function loadConfig()
{
$configFile = __DIR__ . '/config/database.php';
if(!file_exists($configFile)){
die("? 配置文件不存在: {$configFile}");
}
$this->config = include($configFile);
}
private function connectDB()
{
try {
$dsn = "mysql:host={$this->config['hostname']};port={$this->config['hostport']};dbname={$this->config['database']};charset={$this->config['charset']}";
$this->db = new PDO($dsn, $this->config['username'], $this->config['password']);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "? 數據庫連接成功\n";
} catch(PDOException $e) {
die("? 數據庫連接失敗: " . $e->getMessage());
}
}
public function repairTables()
{
$tables = [
'ey_uploads' => $this->getUploadsTableSQL(),
'ey_files' => $this->getFilesTableSQL(),
'ey_we_media' => $this->getWeMediaTableSQL(),
];
foreach($tables as $table => $sql){
echo "檢查表: {$table}\n";
// 檢查表是否存在
$check = $this->db->query("SHOW TABLES LIKE '{$table}'")->fetch();
if(!$check){
echo "創建表: {$table}\n";
$this->db->exec($sql);
} else {
echo "表已存在,修復結構\n";
$this->db->exec("REPAIR TABLE {$table}");
$this->db->exec("OPTIMIZE TABLE {$table}");
}
}
echo "? 表修復完成\n";
}
public function checkPermissions()
{
$paths = [
'runtime' => 0755,
'public/uploads' => 0755,
'config' => 0755,
];
foreach($paths as $path => $permission){
$fullPath = __DIR__ . '/' . $path;
if(!is_dir($fullPath)){
mkdir($fullPath, $permission, true);
echo "創建目錄: {$path}\n";
}
chmod($fullPath, $permission);
echo "設置權限 {$path}: " . substr(sprintf('%o', fileperms($fullPath)), -4) . "\n";
}
}
public function testUpload()
{
// 測試上傳配置
$testFile = __DIR__ . '/test_upload.txt';
file_put_contents($testFile, 'test');
$uploadData = [
'name' => 'test.txt',
'type' => 'text/plain',
'tmp_name' => $testFile,
'error' => 0,
'size' => 4
];
// 模擬上傳
$_FILES['test'] = $uploadData;
// 測試上傳類
try {
$upload = new \think\File($testFile);
$info = $upload->move('./public/uploads/test');
if($info){
echo "? 上傳測試成功: " . $info->getSaveName() . "\n";
unlink($info->getPathname());
} else {
echo "? 上傳測試失敗: " . $upload->getError() . "\n";
}
} catch(Exception $e){
echo "? 上傳測試異常: " . $e->getMessage() . "\n";
}
unlink($testFile);
}
private function getUploadsTableSQL()
{
return "CREATE TABLE `ey_uploads` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`path` varchar(255) NOT NULL DEFAULT '' COMMENT '文件路徑',
`url` varchar(255) NOT NULL DEFAULT '' COMMENT '文件URL',
`original_name` varchar(255) NOT NULL DEFAULT '' COMMENT '原始文件名',
`file_name` varchar(255) NOT NULL DEFAULT '' COMMENT '存儲文件名',
`file_size` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '文件大小',
`file_ext` varchar(20) NOT NULL DEFAULT '' COMMENT '文件擴展名',
`mime` varchar(100) NOT NULL DEFAULT '' COMMENT '文件MIME類型',
`md5` varchar(32) NOT NULL DEFAULT '' COMMENT '文件MD5',
`sha1` varchar(40) NOT NULL DEFAULT '' COMMENT '文件SHA1',
`create_time` int(10) UNSIGNED NOT NULL DEFAULT '0',
`update_time` int(10) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `md5` (`md5`),
KEY `sha1` (`sha1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='上傳文件表'";
}
private function getFilesTableSQL()
{
return "CREATE TABLE `ey_files` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`filepath` varchar(255) NOT NULL DEFAULT '' COMMENT '文件路徑',
`filename` varchar(255) NOT NULL DEFAULT '' COMMENT '原始文件名',
`filesize` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '文件大小',
`fileext` varchar(20) NOT NULL DEFAULT '' COMMENT '文件擴展名',
`mimetype` varchar(100) NOT NULL DEFAULT '' COMMENT 'MIME類型',
`upload_time` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '上傳時間',
`storage` varchar(20) NOT NULL DEFAULT 'local' COMMENT '存儲位置',
`sha1` varchar(40) NOT NULL DEFAULT '' COMMENT '文件sha1編碼',
PRIMARY KEY (`id`),
KEY `sha1` (`sha1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='上傳文件表'";
}
private function getWeMediaTableSQL()
{
return "CREATE TABLE `ey_we_media` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '素材id',
`media_id` varchar(100) NOT NULL DEFAULT '' COMMENT '媒體id',
`type` varchar(20) NOT NULL DEFAULT '' COMMENT '媒體類型',
`title` varchar(255) NOT NULL DEFAULT '' COMMENT '標題',
`introduction` text COMMENT '描述',
`logic_type` int(1) NOT NULL DEFAULT '0' COMMENT '1永久2臨時',
`media_url` varchar(255) NOT NULL DEFAULT '' COMMENT '圖片url',
`add_time` int(11) NOT NULL DEFAULT '0' COMMENT '添加時間',
`update_time` int(11) NOT NULL DEFAULT '0' COMMENT '修改時間',
PRIMARY KEY (`id`),
UNIQUE KEY `media_id` (`media_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='微信素材表'";
}
}
// 執行修復
echo "開始修復易優上傳問題...\n";
$repair = new EyouUploadRepair();
$repair->checkPermissions();
$repair->repairTables();
$repair->testUpload();
echo "? 修復完成\n";# 每月執行一次數據庫維護 mysqlcheck -u root -p --auto-repair --optimize your_database # 清理臨時文件 find /path/to/eyou -name "*.log" -type f -mtime +7 -delete find /path/to/eyou/public/uploads/temp -type f -mtime +1 -delete
#!/bin/bash # backup.sh DATE=$(date +%Y%m%d_%H%M%S) BACKUP_DIR="/backup/eyou" DB_NAME="your_database" mysqldump -u root -p $DB_NAME | gzip > $BACKUP_DIR/$DB_NAME_$DATE.sql.gz # 保留最近7天備份 find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
// 添加數據庫監控 // application/extra/monitor.php return [ 'database' => [ 'check_interval' => 300, // 5分鐘檢查一次 'alert_threshold' => 5, // 5次連接失敗報警 ], 'upload' => [ 'max_size' => 10485760, // 10MB 'allowed_types' => 'jpg,png,gif,pdf,doc,docx', ], ];
# 1. 立即關閉錯誤顯示 sed -i "s/'debug' => true/'debug' => false/g" config/app.php # 2. 啟用維護模式 echo "網站維護中,請稍后訪問..." > public/maintenance.Html echo "RewriteRule ^(.*)$ /maintenance.html [L]" >> public/.htaccess # 3. 備份當前數據庫 mysqldump -u root -p your_db > backup_$(date +%Y%m%d_%H%M%S).sql # 4. 執行修復腳本 php repair_upload.php # 5. 恢復網站 rm public/maintenance.html sed -i "s/RewriteRule ^(.*)$ \/maintenance.html \[L\]//g" public/.htaccess sed -i "s/'debug' => false/'debug' => true/g" config/app.php
錯誤信息 | 原因 | 解決方案 |
|---|---|---|
Connection refused | MySQL未啟動/配置錯誤 | 啟動MySQL,修改hostname為127.0.0.1 |
Access denied | 用戶名密碼錯誤 | 重置數據庫密碼 |
Table doesn't exist | 表不存在 | 執行修復腳本創建表 |
PDOException | PDO擴展未安裝 | 安裝php-pdo和php-mysqlnd |
Permission denied | 權限不足 | chmod -R 755 runtime uploads |
通過以上系統化方案,可徹底解決易優上傳文件報錯問題。建議從方案一開始逐步排查,大多數問題都能在步驟2-3解決。如果問題仍然存在,請提供具體的錯誤信息以便進一步診斷。
標簽:
本文鏈接:http://www.373753.com/xinwendongtai/2121.html
版權聲明:站內所有文章皆來自網絡轉載,只供模板演示使用,并無任何其它意義!
上一篇: eyoucms更新了系統之后報錯$(...).slide is not a function
下一篇:沒有了