MAMP の MySQL に PHP の PDO で接続する

はじめに

実務にて、MAMP のデータベースに PHP で接続しようとして上手くいかないので接続できる書き方を教えてほしいという質問があり、それを解決した情報になります。ソースコードをコピペ(コピー&ペースト)するだけで簡単に流用ができます、データベースの名前はご自身のご利用環境に合わせて適宜変更してください。

ソースコード

$pdo = new PDO('mysql:host=localhost;dbname=example', 'root', 'root');

検証環境

解説

PDO(PHP Data Objects)拡張モジュール とは、PHP の中からデータベースにアクセスする際にとても便利なデータベース 抽象化レイヤー クラスです。

MySQLPHP で接続するための情報は および接続の管理 にあり、下記のようになります。

$pdo = new PDO('mysql:host=localhost;dbname=example', $user, $pass);

MAMPMySQLPHP で接続するための情報は Connect to MySQL from PHP にあり、初期値は host が localhost、user が root、pass が root になります。dbname にはデータベース名を記述します。

$pdo = new PDO('mysql:host=localhost;dbname=example', 'root', 'root');

試しに、データベースからデータを取得する簡単なプログラムを作って接続してみます。

データベースとテーブルを MAMP に作成して、テストデータを挿入します。

users-table
dbname: test, table: t_users

定数 ファイルを作成します。

<?php
const DB_CONF = [
  'host' => 'localhost',
  'dbname' => 'test',
  'charset' => 'utf8mb4',
  'user' => 'root',
  'pass' => 'root'
];

クラス ファイルを作成します。

<?php
class UserModel {
  private $pdo;

  public function __construct(PDO $pdo) {
    $this->pdo = $pdo;
  }

  public function fetchAll(): array {
    $sql = 'SELECT * FROM t_users';

    try {
      $stmt = $this->pdo->prepare($sql);
      $stmt->execute();
      return $stmt->fetchAll(PDO::FETCH_CLASS);
    } catch (PDOExseption $e) {
      echo 'UserModel fetchAll() failed: ' . $e->getMessage();
    }
  }

}

メインルーチンを作成します。

require_once __DIR__ . '/constants.php';
require_once __DIR__ . '/classes/UserModel.php';

$dsn = 'mysql:host=' . DB_CONF['host'] . ';dbname=' . DB_CONF['dbname'] . ';charset=' . DB_CONF['charset'];
$user = DB_CONF['user'];
$pass = DB_CONF['pass'];
$options = [
  PDO::ATTR_EMULATE_PREPARES => false
];

$pdo = new PDO($dsn, $user, $pass);
$user_model = new UserModel($pdo);
$users = $user_model->fetchAll();

echo '<pre>';
var_dump($users);
exit;

プログラムを実行するとユーザー一覧が出力されます。

array (size=5)
  0 => 
    object(stdClass)[4]
      public 'id' => string '1' (length=1)
      public 'name' => string '兎田ぺこら' (length=15)
      public 'email' => string 'pekora@example.com' (length=18)
      public 'password' => string 'pekora' (length=6)
      public 'height' => string '153' (length=3)
      public 'age' => string '111' (length=3)
      public 'created_at' => string '2019-07-17' (length=10)
  1 => 
...

以上です。

おわりに

MAMP を使い始めたばかりの方が詰まりやすいポイントです。

一次情報(Software Documentation)を確認する癖をつけると MAMP の仕様が変わったとしても困らないようになります。