Jam*_*ban 6 server php apache2 drivers odbc
我需要能够读取从 Linux 上的 Windows 系统(特别是 Ubuntu 18.04)复制的 .mdb(Microsoft Access\xc2\xa9 (JET) 文件)。我搜索了数十个网站,但找不到实现此目的的直接方法。大多数页面只讨论如何在 Windows 系统上执行此操作,当然 PHP 安装已经安装了对标准 Microsoft 数据库引擎的支持。特别是页面http://php.net/manual/en/pdo.drivers.php没有在任何描述中列出“Microsoft Access”、“JET”、“.mdb”或“.accdb”列出的驱动程序。
\n\n对于此应用程序,要求最终用户使用 mdbtools 之类的工具将 .mdb 文件转换为 MySQL/MariaDB/Postgres/SQLite/... 数据库将过于麻烦。用户界面必须能够识别包含客户现有数据的文件。然后该文件被上传到服务器,在服务器上读取其内容以初始化或更新服务器数据库,但转换并不简单,因为服务器 SQL 数据库的结构与 Access 数据库的结构不同,这主要是因为 DBA设计这个特定的 Access 数据库时假设永远不需要多个用户同时访问数据库。与大多数初学者一样,DBA 对几乎所有表都使用服务器管理或“自动增量”主键。两个数据库中的确切数字键值不会相同。我没有在任何计算机上运行 Windows 的许可证,因此我无法测试仅在 Windows 上运行的实现。
\n\n有些网站建议使用 ODBC 作为解决方法,因此我安装了 php7.2-odbc 包,如下所示:
\n\nsudo apt install php7.2-odbc\n...\nSetting up php7.2-odbc (7.2.10-0ubuntu0.18.04.1) ...\nCreating config file /etc/php/7.2/mods-available/odbc.ini with new version\nCreating config file /etc/php/7.2/mods-available/pdo_odbc.ini with new version\nProcessing triggers for libapache2-mod-php7.2 (7.2.10-0ubuntu0.18.04.1)\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,要安装的软件包并不是特别明显,因为我发现的所有网页都指定安装 php5-odbc 或 php7.0-odbc,具体取决于它们发布的时间,虽然这可能是显而易见的包维护者认为驱动程序包必须与已安装的 PHP 版本相匹配,这对于只想安装“正确”包的最终用户来说并不明显。这是扩展 PHP 所需安装的所有内容的问题。安装命令应该提供一种选择所需软件包的方法,而不强迫最终用户首先检查系统上运行的是哪个版本的 PHP。例如 apt-get install php*-odbc。
\n\n为了以防万一我将来需要它们,我还安装了 SQLite 和 Postgres 驱动程序,同时所需的知识我还记忆犹新。
\n\n那么现在我的Ubuntu 18.04系统上当前对PDO的驱动支持总结为:
\n\nphp -i | grep PDO \nPDO\nPDO support => enabled\nPDO drivers => mysql, odbc, pgsql, sqlite\nPDO Driver for MySQL => enabled\nPDO_ODBC\nPDO Driver for ODBC (unixODBC) => enabled\nPDO Driver for PostgreSQL => enabled\nPDO Driver for SQLite 3.x => enabled\nRun Code Online (Sandbox Code Playgroud)\n\n我重新启动了 Apache 服务器,phpinfo.php 显示了所有到位的驱动程序。
\n\n所以我从网页上抄写了一些代码:
\n\n$db_username = \'\'; //username\n$db_password = \'\'; //password\n// path to database file\n$database_path = "/home/jcobban/FamilyTree/Cobban.mdb";\n// check file exist before we proceed\nif (!file_exists($database_path)) {\n die("Access database file not found !");\n}\n//create a new PDO object\n$database = new PDO("odbc:DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=$database_path; Uid=$db_username; Pwd=$db_password;");\n$sql = "SELECT * FROM tableName";\n$result = $database->query($sql);\nwhile ($row = $result->fetch(PDO::FETCH_ASSOC)) {\n print_r($row);\n}\n\nFatal error: Uncaught PDOException: SQLSTATE[01000] SQLDriverConnect: 0 [unixODBC][Driver Manager]Can\'t open lib \'Microsoft Access Driver (*.mdb, *.accdb)\' : file not found in /home/jcobban/public_html/testAccess.php:14 Stack trace: #0 /home/jcobban/public_html/testAccess.php(14): PDO->__construct(\'odbc:DRIVER={Mi...\') #1 {main} thrown in /home/jcobban/public_html/testAccess.php on line 14\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,文件 Cobban.mdb 确实存在于该位置,因为脚本并未在第 7 行终止。
\n\n问题似乎是我没有安装正确的驱动程序,因为我找不到任何有关要安装的正确包名称的文档,或者我能找到的连接字符串应该是什么的每个示例都是错误的,包括https: //stackoverflow.com/questions/27066516/microsoft-access-with-php-and-pdo,/sf/ask/1616168921/数据库等。特别是我找不到连接字符串的权威站点。站点 www.connectionstrings.com 仅在 ActiveX 数据对象 (ADO) 方面讨论它们,这不适用于 Linux。页面http://php.net/manual/en/ref.pdo-odbc.php仅包含如何将其与 MSSQL Server 一起使用的示例。
\n\n当《将 PHP 连接到 Microsoft Access ODBC》特别警告时,我并没有受到鼓舞:“到处都有从 PHP 访问 Jet 数据库的食谱,但它们都是转移注意力的 - 它们都假设您在 Windows 上运行 PHP安装了 MS Access 的计算机,并使用仅限 Windows 的 ODBC 驱动程序来打开与 Access 捆绑在一起的 Jet(“access”)文件。在 Linux 上对您没有好处。
\n\n因此,我不断地浏览网络并确认,如上所述,PDO 的所有官方文档和所有志愿者提供的页面中的所有建议和示例仅适用于 Windows 。我发现我需要安装以下内容:
\n\nsudo apt-get install odbc-mdbtools\nsudo apt-get install unixodbc-dev\nRun Code Online (Sandbox Code Playgroud)\n\n并更改连接字符串以指定“Driver=MDBTools;” 这主要在https://gist.github.com/amirkdv/9672857中进行了解释。所以我现在可以使用 PDO 读取 Access JET 文件。
\n\n我仍然找不到任何有关如何设置连接的文档,因此 .mdb 文件中使用的过时的 UCS-2LE 编码被转换为 UTF-8,我在 MySQL/MariaDB 支持中使用它。这是缺乏连接字符串文档的一部分,应该在其中指定此类信息。
\n| 归档时间: |
|
| 查看次数: |
7744 次 |
| 最近记录: |