You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:25:21