我刚刚安装unixODBC为了访问我的 .mdb 数据源PHP.5.3 CentOS 6.10使用这个命令:
# yum install unixODBC
在 Windows 中我可以简单地取消注释extension=php_pdo_odbc.dll
on php.ini并重新启动httpd/阿帕奇为了访问我的.mdb,然后通过建立连接PDO像这样 :
<?php
$dsn = "{Microsoft Access Driver (*.mdb, *.accdb)}";
$db = "/home/www/html/cetak_absensi/uploaded/db_access/myDB.mdb";
$user = "";
$pass = "";
$connection = new PDO("odbc:DRIVER=".$dsn.";charset=UTF-8; Dbq=".$db."; Uid=".$user."; Pwd=".$pass.";");
...
...
?>
安装后unixODBC and PDO-ODBC已经在我的 php 上运行,我运行上面的代码,不幸的是我遇到了这个错误:
[unixODBC][Driver Manager]Data source name not found, and no default driver specified php linux
在这里搜索另一篇文章后,我认为我的 DSN 不正确。
Linux 中正确的 DSN 是什么?
真的可以访问我的吗.mdb数据来源通过PHP-PDO in Linux尤其CentOS 6.10?
UPDATE
经过搜索,我发现一篇文章对此进行了解释。
我安装了libmdodbc1从这个资源libmdbodbc https://centos.pkgs.org/6/forensics-x86_64/libmdbodbc1-0.7-43.13.el6.x86_64.rpm.html并添加以下行/etc/odbcinst.ini :
# Source Came From:
# 1. https://centos.pkgs.org/6/forensics-x86_64/libmdbodbc1-0.7-43.13.el6.x86_64.rpm.html
# 2. https://gist.github.com/amirkdv/9672857
# etc.
[MDBTools]
Description = MDBTools Driver
Driver64 = /usr/lib64/libmdbodbc.so.1.0.0
Setup64 = /usr/lib64/libmdbodbc.so.1.0.0
FileUsage = 1
UsageCount = 1
然后我像这样更改连接:
连接.php
<?php
/*
ini_set('upload_max_filesize', '100M');
ini_set('post_max_size', '100M');
echo ini_get('upload_max_filesize'), ", " , ini_get('post_max_size');
echo php_uname();
*/
set_time_limit(600);
$query = 'SELECT * FROM LEAVECLASS1';
$mdb_file = '/var/www/html/cetak_absensi/uploaded/db_access/db_absensi_backup.mdb';
$uname = explode(" ",php_uname());
print_r($uname);
$os = $uname[0];
echo "<br>";
echo $os;
switch ($os){
case 'Windows':
$driver = '{Microsoft Access Driver (*.mdb)}';
break;
case 'Linux':
$driver = 'MDBTools';
break;
default:
exit("Don't know about this OS");
}
$dataSourceName = "odbc:Driver=$driver;DBQ=$mdb_file;";
echo "<br>";
try {
$connection = new \PDO($dataSourceName);
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$result = $connection->prepare($query);
$result->execute();
$data = $result->fetchAll(\PDO::FETCH_ASSOC);
} catch (PDOException $e) {
echo "<br><br>";
echo "There is an error " . $e->getMessage();
echo "<br><br>";
}
// I think this following code cause this error:
//$result = $connection->query($query)->fetchAll(\PDO::FETCH_ASSOC);
echo "<br>";
print_r($data);
echo "<br>";
var_dump($connection);
运行此代码后,浏览器显示:
The connection was reset
我增加了我的内存限制 and 最大执行时间 in php.ini但仍然抛出相同的消息。
您能告诉我为什么浏览器会抛出此消息吗?
也许我设置了错误的配置或者我的.mdb数据太大。
UPDATE 2
我卸载了我的libmdodbc1
(我以前的libmdodbc
上面的第一次更新)。然后使用安装 libodbc1$ sudo yum install libmdodbc1
和我的配置/etc/odbcinst.ini仍然与以前相同(与上面第一次更新相同),然后重新启动服务。我参考的是这篇文章如何使用 PHP5 PDO 和 ODBC 在 Linux 中处理 MS Access MDB 文件 https://gist.github.com/amirkdv/9672857.
此外我改变了$mdb_file
变量为$mdb_file = '/var/www/html/cetak_absensi/uploaded/db_access/db_new.mdb'
只有一个表,其中有 3 条记录。我还添加了var_dump($data);
查看获取的数据。
db_new.mdb 看起来像这样:
ID Nama Depan Nama Belakang Pekerjaan
1 First Name 1 Last Name 1 Programmer
2 First Name 2 Last Name 2 Guru
3 First Name 3 Dokter
我跑完之后连接.php, var_dump($connection);
and var_dump($data)
分别结果:
// var_dump($connection);
object(PDO)#1 (0) { }
// var_dump($data);
array(2) { [0]=> array(4) { ["ID"]=> string(1) "2" ["Nama Depan"]=> NULL ["Nama Belakang"]=> NULL ["Pekerjaan"]=> NULL } [1]=> array(4) { ["ID"]=> string(1) "3" ["Nama Depan"]=> NULL ["Nama Belakang"]=> NULL ["Pekerjaan"]=> NULL } }
(第一次审判结束)。
Why $data
只有字段名 with NULLs value ?
以为连接已经建立了,我用以前的测试过.mdb文件(db_absensi_backup.mdb)和页面仍然显示相同的问题。
The connection was reset
And the 错误日志 said:
[Tue Jun 02 14:47:12 2020] [notice] child pid 5366 exit signal Segmentation fault (11)
(第二次审判结束)。
第二次更新的第一次试验几乎成功了,而第二次试验则与我真实的.mdb文件似乎该包已过期。
你能告诉我为什么会发生这些吗?
这些是因为我之前配置错误吗?