我有一个完全正常工作的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
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;
}
}
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中的代码......
答案 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字符支持或期望操作二进制对象,则尤其如此。