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

从目录向SQL Server插入PDF时触发PDOException错误求助

排查PHP插入PDF到SQL Server时的语法错误问题

错误原因分析

兄弟,这个错误的核心原因很明确:SQL Server的OPENROWSET(BULK)函数不支持参数绑定。你用PDO的:filename占位符传递文件路径,PDO会把它替换成SQL Server的参数变量@P1,但OPENROWSET(BULK)不接受这种形式的参数,所以直接报了语法错误。

另外你的代码里还有个小bug:你把fetchAll()放在了execute()之前,这完全搞反了执行顺序——得先执行语句,再去拿结果,而且你这是INSERT操作,本来也不会返回数据集,fetchAll()完全没必要留着。

解决方法

要解决这个问题,我们得用动态SQL来构造包含文件路径的查询语句,同时得做好SQL注入防护(直接拼字符串风险大,必须转义)。

修正后的dbData.php代码

public function insFile($filename) { 
    $db = getDB(); 
    // 用PDO的quote方法转义文件名,避免SQL注入
    $escapedFilename = $db->quote($filename);
    // 动态构造SQL语句,把转义后的路径直接写入
    $query = $db->prepare(" 
        INSERT INTO images(id, imageFile) 
        SELECT NEWID(), BulkColumn 
        FROM OPENROWSET(BULK $escapedFilename, SINGLE_BLOB) as f; 
    "); 
    // 先执行语句,再做后续处理
    $query->execute(); 
    $db = null; 
    return null; 
}

简化home.php代码

你原来的glob已经返回完整的文件路径了,没必要再拼接basename,简化后更清晰:

<?php 
require_once(__DIR__.'/oconfig.php'); 
foreach (glob("D:/dir/dir/pdf/*.pdf") as $filename) { 
    $userData = $dbData->insFile($filename); 
    echo $userData; 
} 
?>

额外要注意的点

  • 确保运行PHP的进程(比如IIS、Apache、PHP-FPM)对目标PDF文件有读取权限,不然OPENROWSET会读不到文件。
  • 如果你的SQL Server是远程的,文件路径得用网络共享路径(比如\\server\share\file.pdf),而且SQL Server的服务账号得有访问这个共享的权限。

内容的提问来源于stack exchange,提问作者Giuseppe The Dreamer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:03:06