PHP: Отладка подключения PDO к базе данных Access (.accdb)

Я новичок в программировании и хотел бы подключиться к базе данных ms-access (accdb), используя класс PDO. Environement: PHP (5.5.11) / XAMPP / Windows 7 pro. Драйвер PDO для ODBC (win32) включен.

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"; } } } 

Когда я пытаюсь создать экземпляр класса, я получаю следующую ошибку:

исключение «PDOException» с сообщением «SQLSTATE [IM002] 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 () Неустранимая ошибка: вызов функции-члена prepare () для не-объекта в C: \ xampp \ htdocs \ BillboardsManagement \ Core \ classes \ bbClasses.php в строке 11

Заранее спасибо за вашу помощь.

Обновления: Я понимаю, что на тот же вопрос был дан ответ раньше. Но я участвую в процессе обучения. Ответ на предыдущий пост состоял в том, чтобы использовать adodb вместо PDO (по причинам, с которыми я полностью согласен), но мне все еще интересно, что пошло не так в моей конкретной ситуации. Я все еще не могу определить, был ли мой код неисправным или какой-то драйвер odbc или проблема с конфигурацией.

Вы указываете данные связи в этой строке:

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

Если мы проверим, как работают строки в PHP, мы можем прочитать это о нашей строке с одним кавычком:

В отличие от синтаксисов с двойными кавычками и heredoc, переменные и escape-последовательности для специальных символов не будут расширяться, если они встречаются в одиночных кавычках.

Поэтому PHP попытается открыть файл с именем $this->$dbName , буквально. Итак, для начала вам может понадобиться один из этих синтаксисов:

  • Строка с двойными кавычками: "File name $foo blah"
  • Конкатенация: '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 Database Engine : 64-разрядная версия не имеет 32-разрядного драйвера для формата * .accdb.

Еще раз спасибо за вашу просветительскую поддержку.