PHP:调试与Access数据库(.accdb)的PDO连接

时间:2014-07-12 12:00:11

标签: php ms-access pdo odbc

我是编程新手,想使用PDO类连接到ms-access(accdb)数据库。 Environement:PHP(5.5.11)/ XAMPP / Windows 7专业版。启用了ODBC(win32)的PDO驱动程序。

class db{
  protected $dbName = "C:\xampp\htdocs\BillboardsManagement\Core\config\Billboards.accdb";
  protected $Uid="";
  protected $Upass="";
  protected $conn;

  public function __construct() {
    try{
        $this -> conn = new PDO('odbc:DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=$this->$dbName;Uid=$this->$Uid;Pwd=$this->$Upass');
    } catch (Exception $e) {
        echo "\n $e-> getMessage()\n";   
    }
  }
}

当我尝试实例化该类时,出现以下错误:

  带有消息'SQLSTATE [IM002]的

异常'PDOException'   SQLDriverConnect:0 [Microsoft] [ODBC驱动程序管理器]数据源名称   找不到,也没有指定默认驱动程序   C:\ xampp \ htdocs \ BillboardsManagement \ Core \ config \ config.php:13 Stack   追踪:#0   C:\ XAMPP \ htdocs中\ BillboardsManagement \核心\配置\ config.php的(13):   PDO-> __ construct('odbc:DRIVER = {Mi ...')#1   C:\ XAMPP \ htdocs中\ BillboardsManagement \视图\ selectBB.php(3):   db-> __ construct()#2 {main} - > getMessage()致命错误:调用a   成员函数prepare()在非对象中   C:\ xampp \ htdocs \ BillboardsManagement \ Core \ classes \ bbClasses.php on   第11行

提前感谢您的帮助。

更新:我知道之前已经回答了类似的问题。但我正处于学习过程中。上一篇文章的答案是使用adodb而不是PDO(出于我完全同意的原因),但我仍然对我在特定情况下出了什么问题感到好奇。我仍然无法确定我的代码是否有问题,或者是某些odbc驱动程序或配置问题。

2 个答案:

答案 0 :(得分:5)

您在此字符串中提供连接详细信息:

'odbc:DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=$this->$dbName;Uid=$this->$Uid;Pwd=$this->$Upass'

如果我们检查how strings work in PHP,我们可以阅读有关我们的单引号字符串:

  

与双引号和heredoc语法不同,变量和转义   特殊字符的序列在发生时不会被扩展   用单引号字符串。

因此,PHP会尝试打开一个名为$this->$dbName的文件。因此,首先,您可能需要其中一种语法:

  • 双引号字符串:"File name $foo blah"
  • 连接:'File name ' . $foo . ' blah'

现在,您想要从对象属性中读取文件名:

protected $dbName = "C:\xampp\htdocs\BillboardsManagement\Core\config\Billboards.accdb";

语法为manual explains

$this->dbName

但是,你有这个:

$this->$dbName

一旦解决了这个问题,验证变量是否包含您认为的变量总是一个好主意。为此,我建议var_dump()

$connection_string = 'odbc:DRIVER={Microsoft ....';
var_dump($connection_string);

值得注意的是,我所解释的所有内容都与基本的PHP语法有关。到目前为止,PDO和Access问题都没有出现。它总是有助于隔离你的问题。

答案 1 :(得分:3)

经过大量阅读后,我发现我使用的是Microsoft Access Database Engine的错误版本:64位版本没有* .accdb格式的32位驱动程序。

再次感谢您的启发。