如何用PHP拆分目录列表字符串并写入MySQL多字段?
问题解决:MySQL字符串拆分与PHP自动化实现
错误原因
当前SQL语法错误是因为MySQL不支持MS Access的Mid()、InStrRev()、Left()函数,需替换为MySQL原生字符串函数;同时你代码里的Mid(['pathRAW']写法错误,字段名不需要额外加方括号和单引号。
完整PHP实现代码
以下是适配MySQL的完整代码,包含所有字段提取、数据清理、大小计算逻辑:
<?php // 引入数据库配置文件 include_once 'assets/includes/dbConfig.php'; try { // 清空目标表 $query = "DELETE FROM DirList_FORMATED"; $conn->query($query); echo 'DirList_FORMATED 已清空 <br/>'; // 导入原始数据 $query = "INSERT INTO DirList_FORMATED (pathRAW) SELECT pathRAW FROM DirList_RAW WHERE pathRAW IS NOT NULL"; $conn->query($query); echo 'DirList_RAW 数据已导入 <br/>'; // 1. 提取文件大小(fileSizeRAW) $query = "UPDATE DirList_FORMATED SET fileSizeRAW = SUBSTRING(pathRAW, LOCATE(' ', REVERSE(pathRAW)) * -1)"; $conn->query($query); echo 'fileSizeRAW 字段已生成 <br/>'; // 2. 移除路径中的大小信息并去除首尾空格 $query = "UPDATE DirList_FORMATED SET path = TRIM(REPLACE(pathRAW, fileSizeRAW, ''))"; $conn->query($query); echo '路径已去除大小信息 <br/>'; // 3. 提取文件扩展名(fileExt) $query = "UPDATE DirList_FORMATED SET fileExt = SUBSTRING(path, LOCATE('.', REVERSE(path)) * -1)"; $conn->query($query); echo 'fileExt 字段已生成 <br/>'; // 4. 提取盘符(drive) $query = "UPDATE DirList_FORMATED SET drive = SUBSTRING(path, 1, 1)"; $conn->query($query); echo 'drive 字段已生成 <br/>'; // 5. 批量移除指定盘符的前缀 $query = "UPDATE DirList_FORMATED SET path = SUBSTRING(path, 4) WHERE drive IN ('M', 'N', 'O', 'P')"; $conn->query($query); echo '路径已去除盘符前缀 <br/>'; // 6. 移除文件名中的扩展名部分 $query = "UPDATE DirList_FORMATED SET path = SUBSTRING(path, 1, LENGTH(path) - LOCATE('.', REVERSE(path)) - 1)"; $conn->query($query); echo '路径已去除扩展名 <br/>'; // 7. 提取文件夹名(folderName) $query = "UPDATE DirList_FORMATED SET folderName = SUBSTRING(path, 1, LOCATE('\\\\', path) - 1)"; $conn->query($query); echo 'folderName 字段已生成 <br/>'; // 8. 提取文件名(fileName) $query = "UPDATE DirList_FORMATED SET fileName = SUBSTRING(path, LOCATE('\\\\', REVERSE(path)) * -1)"; $conn->query($query); echo 'fileName 字段已生成 <br/>'; // 9. 标记并删除指定扩展名的文件 $query = "UPDATE DirList_FORMATED SET flag = 'y' WHERE fileExt IN ('srt', 'db')"; $conn->query($query); $query = "DELETE FROM DirList_FORMATED WHERE flag = 'y'"; $conn->query($query); echo '已删除srt/db类型文件 <br/>'; // 10. 计算并格式化GB单位的文件大小 $query = "UPDATE DirList_FORMATED SET fileSizeGB = ROUND(fileSizeRAW / 1024 / 1024 / 1024, 3)"; $conn->query($query); echo 'fileSizeGB 字段已生成 <br/>'; echo '<br/>所有字段处理完成!'; } catch (mysqli_sql_exception $e) { die('SQL执行错误: ' . $e->getMessage()); } // 关闭数据库连接 $conn->close(); ?>
关键函数替换说明
| Access函数 | MySQL替代函数 | 功能说明 |
|---|---|---|
Mid(str, pos) | SUBSTRING(str, pos) | 从指定位置开始截取字符串 |
InStrRev(str, char) | LOCATE(char, REVERSE(str)) | 从字符串末尾查找目标字符的位置 |
Left(str, len) | SUBSTRING(str, 1, len) | 截取字符串的前N个字符 |
Trim(str) | TRIM(str) | 去除字符串首尾的空格 |
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

