xampp(PHP)からaccessに接続しようとしてハマったのでメモ。
環境
- windows10 Pro 64bit
- xampp 64bit
- accessの形式 accdb
PHPのソース
define('ACCESS_DB_DRIVER', '{Microsoft Access Driver (*.mdb, *.accdb)}');
$dbq = 'C:/xampp/htdocs/***.accdb';
$objPdo = new PDO("odbc:Driver=" . ACCESS_DB_DRIVER . ";DBQ=" . $dbq . ";");
エラー内容
PHP Fatal error: Uncaught PDOException: SQLSTATE[IM002] SQLDriverConnect: 0 [Microsoft][ODBC Driver Manager] ...
解決方法
php.iniを編集
;extension=pdo_odbc
コメントアウトを外す
ODBCを確認
コントロール パネル>システムとセキュリティ>管理ツール>ODBCデータソース(64bビット)
「ドライバー」タブにMicrosoft Access Driverが無かったので、ドライバーをインストールすれば解決すると推測
ドライバーダウンロード
こちらの記事を参考にさせていただきました。
Microsoft Access(.mdb、.accdb)のODBC、OLEDBドライバーに関するまとめ
https://www.microsoft.com/ja-jp/download/details.aspx?id=13255
「AccessDatabaseEngine_X64.exe」をダブルクリックしインストール
テーブルによってデータが取得できない
たぶんテーブル名に入っている記号の問題だと思うのですが、バックスラッシュ「`」を入れたら解決しました。
$sql = "SELECT * FROM 03_案件(基本)テーブル;";
↓
$sql = "SELECT * FROM `03_案件(基本)テーブル`;";
抽出条件でデータ型が一致しません。
SQLSTATE[22018]: Invalid character value for cast specification: -3030 [Microsoft][ODBC Microsoft Access Driver] 抽出条 件でデータ型が一致しません。 (SQLExecute[-3030] at ext\pdo_odbc\odbc_stmt.c:259)
数値型に空文字「''」を挿入しようとすると発生するようです。
オートナンバー振り直し
テーブルを開いていない状態から
作成>クエリデザイン>SQL表示
sql
DELETE * FROM table_name;
ALTER TABLE table_name ALTER COLUMN id COUNTER(1,1);
3つ以上のテーブルを結合する時には括弧をつける
こちらの記事を参考にさせていただきました。
[Access] SQLでJOINをかけるときに括弧が必要
$sql = "SELECT * FROM (`テーブル` A INNER JOIN `テーブル` B ON A.id = B.id);";