Phi*_*hil 0 php ms-access odbc pdo
我是编程新手,想使用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";
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试实例化该类时,我收到以下错误:
消息'SQLSTATE [IM002]的异常'PDOException'SQLDriverConnect:0 [Microsoft] [ODBC驱动程序管理器]未找到数据源名称且未在C:\ xampp\htdocs\BillboardsManagement\Core\config\config.php中指定默认驱动程序:13堆栈跟踪:#0 C:\ xampp\htdocs\BillboardsManagement\Core\config\config.php(13):PDO - > __ construct('odbc:DRIVER = {Mi ...')#1 C:\ xampp\htdocs\BillboardsManagement\Views\selectBB.php(3):db - > __ construct()#2 {main} - > getMessage()致命错误:在C:\中的非对象上调用成员函数prepare()第11行的xampp\htdocs\BillboardsManagement\Core\classes\bbClasses.php
在此先感谢您的帮助.
更新:我知道之前已经回答了类似的问题.但我正处于学习过程中.上一篇文章的答案是使用adodb而不是PDO(出于我完全同意的原因),但我仍然对我在特定情况下出了什么问题感到好奇.我仍然无法确定我的代码是否有问题,或者是某些odbc驱动程序或配置问题.
您在此字符串中提供连接详细信息:
'odbc:DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=$this->$dbName;Uid=$this->$Uid;Pwd=$this->$Upass'
Run Code Online (Sandbox Code Playgroud)
如果我们检查字符串在PHP中是如何工作的,我们可以读一下我们的单引号字符串:
与双引号和heredoc语法不同,特殊字符的变量和转义序列在单引号字符串中出现时不会被扩展.
所以PHP会尝试打开一个名为的文件$this->$dbName.因此,首先,您可能需要其中一种语法:
"File name $foo blah"'File name ' . $foo . ' blah'现在,您想要从对象属性中读取文件名:
protected $dbName = "C:\xampp\htdocs\BillboardsManagement\Core\config\Billboards.accdb";
Run Code Online (Sandbox Code Playgroud)
该手册解释了语法是:
$this->dbName
Run Code Online (Sandbox Code Playgroud)
但是,你有这个:
$this->$dbName
Run Code Online (Sandbox Code Playgroud)
一旦解决了这个问题,验证变量是否包含您认为的变量总是一个好主意.为此,我建议var_dump():
$connection_string = 'odbc:DRIVER={Microsoft ....';
var_dump($connection_string);
Run Code Online (Sandbox Code Playgroud)
值得注意的是,我所解释的所有内容都与基本的PHP语法有关.到目前为止,PDO和Access问题都没有出现.它总是有助于隔离您的问题.