我是新的编程,并想连接到一个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格式。
再次感谢您的启发性支持