从目录向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
相关产品推荐
相关产品推荐

