PHP扫描MP4文件后向SQLite表插入数据异常,求修正方案
问题分析与解决方案
你的问题核心在于数组变量直接拼接进SQL字符串导致解析错误,同时没有正确处理文件名格式、也没遍历数组逐个插入数据。下面是具体的修正步骤和代码:
1. 错误原因拆解
- 当你在SQL字符串里写
array_values($mp4_files)时,PHP会把数组直接转换成字符串"Array",最终SQL语句变成了INSERT INTO Podcast_Export ('House#', 'Status') VALUES ('array_values(Array)', 'Go'),这就是插入错误内容的根源。 - 你没有遍历
$mp4_files数组,而是尝试一次性插入整个数组,逻辑上不符合“逐个文件对应一条数据”的需求(你看到两行错误数据,大概率是代码里有循环但每次都用了错误的拼接方式)。
2. 修正后的完整代码
$src_dir = '\\\\ABCD-ST-001\\Audio_Test\\podcast\\incoming_folder'; // 扫描目录并筛选MP4文件(加i忽略大小写,可选) $mp4_files = preg_grep('~\.(mp4)$~i', scandir($src_dir)); // 重置数组索引,方便遍历 $mp4_files = array_values($mp4_files); // 遍历每个MP4文件,逐个插入数据库 foreach ($mp4_files as $filename) { // 第一步:去掉.mp4后缀,得到基础文件名(比如36031P、hello) $base_name = pathinfo($filename, PATHINFO_FILENAME); // 第二步:提取你需要的House#值——从36031P中取数字部分,普通文件名直接保留 preg_match('/^\d+/', $base_name, $matches); $house_number = !empty($matches) ? $matches[0] : $base_name; // 第三步:用参数绑定执行SQL插入(绝对不要直接拼接字符串!) $stmt = $db->prepare("INSERT INTO Podcast_Export (`House#`, `Status`) VALUES (:house, :status)"); $stmt->bindValue(':house', $house_number, SQLITE3_TEXT); $stmt->bindValue(':status', 'Go', SQLITE3_TEXT); $stmt->execute(); }
3. 关键细节说明
- 文件名处理:用
pathinfo获取不带后缀的文件名,比手动截取字符串更可靠;正则/^\d+/专门提取文件名开头的连续数字,若你的文件名规则有变化,直接调整正则即可适配。 - SQL安全:使用
prepare+bindValue做参数绑定,既能避免SQL注入风险,又能自动处理字符串转义问题,比直接拼接SQL字符串稳定得多。 - 遍历逻辑:通过
foreach逐个处理数组中的文件名,确保每个MP4文件对应一条数据库记录。
内容的提问来源于stack exchange,提问作者flash
相关产品推荐
相关产品推荐

