如何使用 PHP 将附件插入 Access 数据库?

Posted

技术标签:

【中文标题】如何使用 PHP 将附件插入 Access 数据库?【英文标题】:How to insert an Attachment into an Access database using PHP? 【发布时间】:2017-08-18 17:16:51 【问题描述】:

我需要将从 html 表单上传的一些文件添加到 MS Access DDBB。 使用 php、SQL 和 ODBC,我对 Access 文件的查询没有任何问题,附件字段除外。

INSERT INTO TEMAS (DATOSADJUNTOS.FILENAME, DATOSADJUNTOS.FILEDATA) VALUES ("ExampleName.txt", "Wathever") WHERE ID = 4;

此查询返回以下错误:

SQLSTATE[07009]: Invalid descriptor index: -1003 [Microsoft][Controlador ODBC Microsoft Access] Argumento no válido. (SQLExecute[-1003] at ext\pdo_odbc\odbc_stmt.c:260)

无论我用什么代替“Wathever”,错误总是一样的。除非它是一个空字符串,否则查询运行没有问题,并且确实有效,正如您在 next image.

中看到的那样

知道我应该在查询中输入什么以使其工作,或者以任何其他方式将附件插入 MS Access DDBB 吗?

谢谢

【问题讨论】:

【参考方案1】:

Erik 是对的:您不能使用 ODBC 插入附件。您需要使用 Access DAO,如下所示:

$dbe = new COM("DAO.DBEngine.120") or die("Cannot create DBEngine object.");
$db = $dbe->OpenDatabase("C:\\Users\\Public\\Database1.accdb");
$rsMain = $db->OpenRecordset("SELECT DATOSADJUNTOS FROM TEMAS WHERE ID=4", 2);  // dbOpenDynaset
$rsMain->Edit;
$rsAttach = $rsMain->Fields("DATOSADJUNTOS")->Value;
$rsAttach->AddNew;
$fldAttach = $rsAttach->Fields("FileData");
$fldAttach->LoadFromFile("C:\\Users\\Gord\\Desktop\\sample.pdf");
$rsAttach->Update;
$rsAttach->Close;
$rsMain->Update;
$rsMain->Close;
$db->Close;

请注意,Access DAO 是 Access 数据库引擎的一个组件,因此这种方法不需要完整安装 Microsoft Access 应用程序。

【讨论】:

比我提出的解决方案容易得多!我的 PHP 经验仅限于 Linux,不知道您可以在 PHP 中使用 COM,当然也不知道它这么简单。 @ErikvonAsmuth - com_dotnet 仅在 PHP 的 Windows 版本中可用,并且通常默认情况下不启用,但取消注释 php.ini 中的相应行可以解决此问题。顺便说一句,您最近在这里做出了出色的贡献;非常感谢他们。 非常感谢!添加:[COM_DOT_NET] extension=php_com_dotnet.dllmy php.ini 配置文件后,它对我来说效果很好。【参考方案2】:

据我所知,仅使用 PHP 和 ODBC 时这是不可能的。您将需要可以通过 COM 或命令行直接与 Access 交互的东西。

您可以创建一个宏来从 Access 中的某个文件夹导入所有文件,或者听命令行并导入单个文件。然后你可以在 PHP 中使用shell_exec 来触发它。这意味着您需要在运行命令的服务器上拥有访问权限。

这并不容易。如果您真的想这样做,我可以为您提供有关步骤的指示。

请参阅this google discussion,其中一位 Microsoft 员工表示 ACE ODBC 不支持附件字段。

(如果有人知道方法,我很乐意得到纠正)

【讨论】:

问题是,由于某些原因,我不能编辑 Access 文件,而是按原样使用它。我很难相信没有办法做到这一点。让我们等一下,以防万一有人能弄清楚。万一我们最终无法通过 SQL 完成,宏和 shell_exec 听起来是个好主意。但宏应该在不同的 Access 文件中。 将宏放在不同的文件中对其复杂性几乎没有影响,因此这是一种有效的方法 @RubénAguado - Erik 是对的:您不能使用 ODBC 插入附件。但是,您不需要使用 COM 自动化或 shell_exec;您只需要使用 Access DAO,它包含在 Access 数据库引擎组件中。详情见我的回答。

以上是关于如何使用 PHP 将附件插入 Access 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Windows 窗体中的 Access 附件字段?

在php中使用access数据库

如何检查 Access 中的附件字段是不是为空?

简单访问 PHP

如何通过 ASP.net 网站将新条目插入 Access db 表?

如何使用 UCanAccess 从 Java 将两个字符串插入我的 Access 数据库?