lycheejam's tech log

チラ裏のメモ帳 | プログラミングは苦手、インフラが得意なつもり。

PHP 7 + MySQLでPDOを使用するとcould not found driverエラーが発生する

概要

Docker Composeで作成したnginx + PHP-FPM + MySQLの環境でPDOを使ったコードを実行するとcould not found driverエラーが発生しました。
解決したのでメモです。

目次

参考サイト様

ソース

github.com

事象

下記のソースコード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()); 
  }
?>

エラー画面

f:id:HM_Atlas:20190506025206p:plain

原因

PDOのMySQL用ドライバがPHP-FPMサーバにインストールされていなかったため。

ドライバが未インストールであることを確認

$ docker-compose exec php bash
root@71d6f27992e6:/var/www/html# php -m | grep pdo
pdo_sqlite

phpomfo()から確認

f:id:HM_Atlas:20190506025247p:plain

対策

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()から確認

f:id:HM_Atlas:20190506025225p:plain

コードが動作していることを確認

f:id:HM_Atlas:20190506025328p:plain

雑感

PDO使うのにドライバが必要だなんて聞いてないよ〜と言う感じである。