Skip to content
戻る

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

Published:  at  12:30

概要

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

目次

参考サイト様

ソース

https://github.com/Lycheejam/php-crud-sample 🔗

事象

下記のソースコードで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を使う。
リポジトリにあるっぽいのになんでだ…

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使うのにドライバが必要だなんて聞いてないよ〜と言う感じである。



前の記事
docker-compose.ymlで.envファイルに定義した環境変数を使う
次の記事
Docker Composeで使用するDockerfileの名前を変更する