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


PHP: Debugging PDO connection to Access database (.accdb)

我是新的编程,并想连接到一个ms-access (accdb)数据库使用PDO类。环境:PHP (5.5.11)/XAMPP/Windows 7 pro。打开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";   
    }
  }
}

当我尝试实例化类时,我得到以下错误:

exception 'PDOException' and message 'SQLSTATE[IM002]SQLDriverConnect: 0 [Microsoft][ODBC Driver Manager]数据源名称未找到且未指定默认驱动程序C: ' xampp '根' BillboardsManagement ' ' config ' config . php核心:13堆栈跟踪:# 0C: ' xampp '根' BillboardsManagement ' ' config ' config . php核心(13):PDO -> __construct("odbc:司机= {Mi…")# 1C: ' xampp '根' BillboardsManagement ' Views ' selectBB.php (3):db->__construct() #2 {main}-> getMessage()致命错误:调用a中的非对象上的成员函数prepare()C: ' xampp '根' BillboardsManagement ' '类' bbClasses.php核心第11行

提前感谢您的帮助。

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

您在此字符串中提供连接细节:

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

如果我们检查一下PHP中的字符串是如何工作的,我们可以读到这个单引号字符串:

与双引号和heredoc语法不同,变量和转义特殊字符的序列在出现时不会展开

PHP会打开一个叫做$this->$dbName的文件。因此,一开始,您可能需要使用以下语法之一:

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

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

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

手册解释的语法是:

$this->dbName

然而,你有这个:

$this->$dbName

一旦你解决了这个问题,验证你的变量是否包含你认为它们所做的事情总是一个好主意。为此,我推荐使用var_dump():

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

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

在大量阅读之后,我发现我使用的是错误版本的Microsoft Access数据库引擎:64位版本没有32位的*驱动程序。accdb格式。

再次感谢您的启发性支持