错误:找不到驱动程序 - 将PDO与MS Access数据库一起使用

时间:2014-05-29 10:58:10

标签: php sql ms-access pdo

背景:

我有一个完全正常工作的Microsoft Access数据库。我已经创建了一个数据库连接类,只是一个包含该类的简单页面,并触发了一个简单的SQL代码。我知道代码是正确的,因为它几周前工作正常。但是,在那时和现在之间我安装了PHP,MySQL,设置我的IIS并安装了PHPMyAdmin。 (我们的服务器遇到了问题,所以尝试使用localhost,但在我完全使用PHPMyAdmin之前已经解决了)。

所以现在我已经将我的连接类和简单的php页面放到服务器上(使用FTP)。但是,当我运行几周前使用的相同查询时,我现在收到错误消息:

ERROR:could not find driver. Warning: file_put_contents(connection.errors.txt) [function.file-put-contents]: failed to open stream: Permission denied in E:\kunden\blah\blah\blah\www\simpleTest.php on line 31

代码

connectionClass.php:

class connection{

public $con;
private $dbName;

function __construct(){
$this->dbName = $_SERVER["DOCUMENT_ROOT"] . "../database/db.mdb";
 }

function connect(){
    $this->con = new PDO("odbc:DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=$this->dbName; Uid=Admin; Pwd=;");
    $this->con->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    return $this->con;
 }   
}

simpleTest.php

if (!ini_get('display_errors')) {
ini_set('display_errors', '1');
}

try{
include_once 'classes/connectionClass.php';

//get the DB connection
$con = new connection();
$pdoConnection = $con->connect();

//query the DB
$sql = $pdoConnection->prepare("SELECT * FROM celebs");
$result = $sql->execute();
while ($row = $sql->fetch(PDO::FETCH_ASSOC)) {        
    echo $row['firstname'];
    echo $row['surname'];
 }

} catch (Exception $e){
echo 'ERROR:'.$e->getMessage();
file_put_contents('connection.errors.txt', $e->getMessage().PHP_EOL,FILE_APPEND);
}

我没有更改代码,并且想知道设置PHP,MySQL,IIS和PHPMyAdmin是否已经做了一些事情来防止我的代码工作?我看过phpinfo();但我不确定该找什么。

非常感谢任何帮助,谢谢。

编辑:此外,经过一些调试后 - 我非常肯定在尝试建立新连接后,错误围绕simpleTest.php中的代码......

1 个答案:

答案 0 :(得分:4)

通过ODBC从PHP操作Access数据库有一些严重的限制,会影响PDO和旧的odbc_exec方法。如果您使用的是Windows服务器并且绝对必须使用Access数据库后端(strongly discouraged),我建议您在com_dotnet下使用ADO,如下所示:

<?php
// this code requires the following php.ini directive:
//
// extension=php_com_dotnet.dll

$con = new COM("ADODB.Connection"); 
$con->Open(
        "Provider=Microsoft.Jet.OLEDB.4.0;" .
        "Data Source=C:\\Users\\Public\\mdbTest.mdb");
$rst = new COM("ADODB.Recordset");
$rst->Open("SELECT * FROM celebs", $con, 1, 3);  // adOpenKeyset, adLockOptimistic
while (!$rst->EOF) {
    echo $rst["firstname"]->Value . " " . $rst["surname"]->Value . "<br/>";
    $rst->MoveNext;
}
$rst->Close();
$con->Close();

如果您需要完整的Unicode字符支持或期望操作二进制对象,则尤其如此。