PHP 7 + MySQLでPDOを使用するとcould not found driverエラーが発生する
概要
Docker Composeで作成したnginx + PHP-FPM + MySQLの環境でPDOを使ったコードを実行するとcould not found driver
エラーが発生しました。
解決したのでメモです。
目次
参考サイト様
- How do you get php-mysql extensions installed for php:7-fpm-alpine · Issue #279 · docker-library/php
- 【Docker】phpでPDOにmysqlを使うと、could not find driverと出る【186日目】 - エンジニアのひよこ_level10
ソース
事象
下記のソースコードでPHPを実行するとcould not found driver
エラーがブラウザに表示される。
コード
DBからデータ取得して表示するためのサンプルコードです。
<?php $dsn = 'mysql:host=db;dbname=SAMPLEDB;charset=utf8mb4'; $username = 'sampleuser'; $password = 'password'; $options = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false ); try { $pdo = new PDO($dsn, $username, $password, $options); $result = $pdo->query('select * from SAMPLETBL'); foreach($result as $row) { echo "No.{$row['ID']}<br>"; echo "NAME : {$row['NAME']}<br>"; echo "AGE : {$row['AGE']}<br>"; echo '<br>'; } } catch (PDOException $e) { exit($e->getMessage()); } ?>
エラー画面
原因
PDOのMySQL用ドライバがPHP-FPMサーバにインストールされていなかったため。
ドライバが未インストールであることを確認
$ docker-compose exec php bash root@71d6f27992e6:/var/www/html# php -m | grep pdo pdo_sqlite
phpomfo()
から確認
対策
PDOのMySQL用ドライバをPHP-FPMサーバにインストールする。
パッケージの確認
yum
がコンテナにインストールされてないのでpecl
で確認した。
$ docker-compose exec php bash root@71d6f27992e6:/var/www/html# pecl search pdo_mysql Retrieving data...0% Matched packages, channel pecl.php.net: ======================================= Package Stable/(Latest) Local PDO_MYSQL 1.0.2 (stable) MySQL driver for PDO
Dockerfile
の編集
コメント部分にインストールコマンドを追記
※pecl
だとエラーとなったためdocker-php-ext-install
を使う。
リポジトリにあるっぽいのになんでだ...
Dockerfile
FROM php:7-fpm RUN pecl install xdebug && \ docker-php-ext-enable xdebug && \ #下記を追記 docker-php-ext-install pdo_mysql
編集後、docker-compose build
でリビルドする。
ドライバがインストールされたことを確認
$ docker-compose exec php bash root@077aa23fd33c:/var/www/html# php -m | grep pdo pdo_mysql pdo_sqlite
phpinfo()
から確認
コードが動作していることを確認
雑感
PDO使うのにドライバが必要だなんて聞いてないよ〜と言う感じである。