Chapter16 PHPでMySQLに接続

概要と目標 PHPとMySQLの
連携方法を学ぼう。

今回から、本格的なWEBアプリケーションを作成します。
新着情報を管理する簡易的なCMSをテーマに学習しましょう。

今回のゴール

コマンドプロンプト

mysql> select * from posts;
+----+-----------------------------------------------+-------------------------------------------------------------------------------------------------+-------------+---------------------+---------------------+
| id | title                                         | content                                                                                         | category_id | created             | modified            |
+----+-----------------------------------------------+-------------------------------------------------------------------------------------------------+-------------+---------------------+---------------------+
|  1 | Webサイトを公開しました。                     | 本日、Webサイトを公開しました。お楽しみ下さい。                                                 |  1 | 2018-04-01 10:00:00 | 2018-03-28 13:34:34 |
|  2 | 春の握手会について                            | 4月21日(土)、 22日(日)の2日間、握手会を開催致します。                                       |  2 | 2018-04-16 10:00:00 | 2018-03-28 13:34:34 |
|  3 | ゴールデンウィーク休暇について                | 4月28日(土) 〜 5月6日(日)までの9日間は、休みを頂戴いたします。                              |  1 | 2018-04-20 10:00:00 | 2018-03-28 13:34:34 |
+----+-----------------------------------------------+-------------------------------------------------------------------------------------------------+-------------+---------------------+---------------------+
3 rows in set (0.00 sec)

mysql>   

データベース設計 必要な機能を整理し、
必要なテーブルを考える。

本格的なWEBアプリケーションを作る際は、データベースの設計が重要になる。
事前に必要な機能を整理して、データーベースの構造を考察する。

必要な機能の洗い出し

今回作成するCMSは以下の機能を実装する。

  • 新着情報を投稿できる
  • 新着情報をカテゴリで管理できる
  • 新着情報の一覧が見れる
  • 新着情報を更新できる
  • 新着情報を削除できる

フィールドの構造を考察

フィールドの名前や、データ型などを考察する。

posts (記事管理のテーブル)
フィールド名 データ型 備考
id int(11) (正の数のみ) 記事のID (主キー、連番)
title varchar(60) 記事のタイトル (空白不可)
content longtext 記事の内容 (空白不可)
category_id int(11) (正の数のみ) カテゴリーのID
created datetime 公開日
modified timestamp 更新日
categories (カテゴリ管理のテーブル)
フィールド名 データ型 備考
id int(11) (正の数のみ) カテゴリのID (主キー、連番)
category_name varchar(60) カテゴリ名 (空白不可)
データベース設計書
上記のようなフィールド情報をまとめた書類を「データベース設計書」と呼ぶ。
一般的には、Excelなどのスプレッドシートにまとめる。

参考:mini_cms_app (Google スプレッドシート)

データベースの作成 ファイルにSQLを記述し、
データベースを作成する。

先程考察した、データベースを作成する。SQLはファイルに記述し保存しておく。

データベースを作成しよう。

  1. MySQLモニタを起動
  2. 「mini-cms」 › 「setup」フォルダ内に「create-db.sql」を作成
  3. 「mini_cms_app」というデータベースとテーブルを作成するSQL文を記述し、
    コマンドラインツールにコピー&ペースト
mini-cms/setup/create-db.sql
-- データベースの作成
create database mini_cms_app default character set utf8;

-- データベースの変更
use mini_cms_app;

-- テーブルの作成
create table posts (
  id int(11) unsigned primary key auto_increment,
  title varchar(60) not null,
  content longtext not null,
  category_id int(11),
  created datetime,
  modified timestamp
) engine=InnoDB default charset=utf8;

create table categories (
  id int(11) unsigned primary key auto_increment,
  category_name varchar(60) not null
) engine=InnoDB default charset=utf8;

答えを見る

DESCコマンド実行例

コマンドプロンプト

mysql> desc posts;
+-------------+------------------+------+-----+-------------------+-----------------------------+
| Field       | Type             | Null | Key | Default           | Extra                       |
+-------------+------------------+------+-----+-------------------+-----------------------------+
| id          | int(11) unsigned | NO   | PRI | NULL              | auto_increment              |
| title       | varchar(60)      | NO   |     | NULL              |                             |
| content     | longtext         | NO   |     | NULL              |                             |
| category_id | int(11)          | YES  |     | NULL              |                             |
| created     | datetime         | YES  |     | NULL              |                             |
| modified    | timestamp        | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------------+------------------+------+-----+-------------------+-----------------------------+
6 rows in set (0.01 sec)

mysql> desc categories;
+---------------+------------------+------+-----+-------------------+-----------------------------+
| Field         | Type             | Null | Key | Default           | Extra                       |
+---------------+------------------+------+-----+-------------------+-----------------------------+
| id            | int(11) unsigned | NO   | PRI | NULL              | auto_increment              |
| category_name | varchar(60)      | NO   |     | NULL              |                             |
+---------------+------------------+------+-----+-------------------+-----------------------------+
2 rows in set (0.01 sec)

mysql> 
  1. 下記を参考にあらかじめサンプルのレコードを挿入しておく
    「posts」テーブルのサンプルデータ
    id title content category_id created
    1 Webサイトを公開しました。 本日、Webサイトを公開しました。お楽しみ下さい。 1 2018-04-01 10:00:00
    2 春の握手会について 4月21日(土)、 22日(日)の2日間、握手会を開催致します。 2 2018-04-16 10:00:00
    3 ゴールデンウィーク休暇について 4月28日(土) 〜 5月6日(日)までの9日間は、休みを頂戴いたします。 1 2018-04-20 10:00:00
    「categories」テーブルのサンプルデータ
    id category_name
    1 お知らせ
    2 イベント情報
    3 活動報告
mini-cms/setup/create-db.sql
-- サンプルのレコードを挿入
insert into posts (title, content, category_id, created)
  values (
    'Webサイトを公開しました。',
    '本日、Webサイトを公開しました。お楽しみ下さい。',
    1,
    '2018-04-01 10:00:00'
  ),
  (
    '春の握手会について',
    '4月21日(土)、 22日(日)の2日間、握手会を開催致します。',
    2,
    '2018-04-16 10:00:00'
  ),
  (
    'ゴールデンウィーク休暇について',
    '4月28日(土) 〜 5月6日(日)までの9日間は、休みを頂戴いたします。',
    1,
    '2018-04-20 10:00:00'
  );

insert into categories (category_name)
  values (
    'お知らせ'
  ),
  (
    'イベント情報'
  ),
  (
    '活動報告'
  );

答えを見る

SELECT文実行例

コマンドプロンプト

mysql> select * from posts;
+----+-----------------------------------------------+-------------------------------------------------------------------------------------------------+-------------+---------------------+---------------------+
| id | title                                         | content                                         | category_id | created             | modified            |
+----+-----------------------------------------------+-------------------------------------------------------------------------------------------------+-------------+---------------------+---------------------+
|  1 | Webサイトを公開しました。                     | 本日、Webサイトを公開しました。お楽しみ下さい。                                         |           1 | 2018-04-01 10:00:00 | 2018-03-28 13:34:34 |
|  2 | 春の握手会について                            | 4月21日(土)、 22日(日)の2日間、握手会を開催致します。                                       |           2 | 2018-04-16 10:00:00 | 2018-03-28 13:34:34 |
|  3 | ゴールデンウィーク休暇について                | 4月28日(土) 〜 5月6日(日)までの9日間は、休みを頂戴いたします。                              |           1 | 2018-04-20 10:00:00 | 2018-03-28 13:34:34 |
+----+-----------------------------------------------+-------------------------------------------------------------------------------------------------+-------------+---------------------+---------------------+
3 rows in set (0.00 sec)

mysql> select * from categories;
+----+--------------------+
| id | category_name      |
+----+--------------------+
|  1 | お知らせ           |
|  2 | イベント情報       |
|  3 | 活動報告           |
+----+--------------------+
3 rows in set (0.00 sec)

mysql> 

ディレクトリ構造 ディレクト構造を確認をし、
必要なディレクトリを作成。

今回の「Mini CMS」では以下のようなディレクトリ構造を想定している。

ディレクトリ構造
  1. 「mini-cms」フォルダ内に「inc」フォルダを作成
  2. 「mini-cms」フォルダ内に「admin」フォルダを作成

データベースへの接続 PHPでMySQLに接続するには、
PDOを使うのが主流。

データベースに接続する方法はいくつかあるが、PDO (PHP Data Object)という方法が主流。
PDOを使えば、今後「MySQL」から違うデータベースになっても容易に移行できる。
ただし、PDOを使うには、オブジェクト指向というプログラミングの考え方が必要になる。

PDOインスタンスを作成
$変数名 = new PDO('mysql:host=ホスト名;dbname=データベース名;charset=文字コード', ユーザ名, パスワード);

戻り値: データベースハンドル(データベースを操作するために必要なデータ)

詳細はPHPマニュアルを参照

データベースに接続してみよう。

  1. 「mini-cms」フォルダ内に「index.php」を作成
  2. データベースの情報を変数で管理、PDOを使って、データベースに接続するPHPを記述
mini-cms/index.php
<?php
  // データベースへ接続
  $dbh = new PDO('mysql:host=localhost;dbname=mini_cms_app;charset=utf8', 'root', ''); // MAMPはパスワードを「root」に変更
  echo '接続成功';

?>
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>新着記事一覧</title>
</head>
<body>
  <h1>新着情報</h1>

</body>
</html>
  1. 上書き保存
  2. ブラウザで「mini-cms」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/mini-cms/
  3. 「接続成功」が表示されるかを確認
ブラウザでの表示例

RERUN

設定ファイルの作成 データベースの情報を、
外部のファイルで管理。

データベースの情報は、外部ファイルに定数などで保存しておくと管理しやすい。
(定数: プログラミング中に書き換えができない、変数のようなもの)

define関数 ・・・ 定数を定義する関数
define(定数名, 定数の値)

詳細はPHPマニュアルを参照

データベースの情報を定数で管理しよう。

  1. 「mini-cms」 › 「inc」フォルダ内に「config.php」を作成
  2. 定数を使って使ってデータベースの情報を管理するコードを記述
mini-cms/inc/config.php
<?php
// データベースの定数
define('DB_NAME', 'mini_cms_app'); // データベース名
define('DB_USER', 'root'); // ユーザー名
define('DB_PASSWORD', ''); // パスワード (MAMPは「root」)
define('DSN', 'mysql:host=localhost;dbname='. DB_NAME . ';charset=utf8');
  1. 上書き保存
本番環境での注意点
実際にレンタルサーバーなどを借りて公開する際は、上記のようにデータベースの情報などを含む設定ファイルは、公開用フォルダ内に保存しないようにしましょう。公開用フォルダ以外の、HTTPではアクセスできない場所に保存することでセキュリティが向上します。

ファイルの読み込み 外部ファイルを読み込むには、
require_once関数を使う。

外部のPHPファイルを読み込むには、require_once関数を使うとよい。
読み込み時にエラーがあると「Fatal Error」となり、処理が停止する。

require_once関数 ・・・ ファイルを読み込む関数
require_once(読み込むファイルパス)

詳細はPHPマニュアルを参照

「config.php」を読み込んでみよう。

  1. 「mini-cms」フォルダ内の「index.php」をテキストエディタで開く
  2. config.php」を読み込みんで、PDOの引数を定数に変更する
mini-cms/index.php
<?php
  // ファイルの読み込み
  require_once('inc/config.php');

  // データベースへ接続
  $dbh = new PDO(DSN, DB_USER, DB_PASSWORD);
  echo '接続成功';
?>
  1. 上書き保存
  2. ブラウザで「mini-cms」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/mini-cms/
  3. 「接続成功」が表示されるかを確認
ブラウザでの表示例

RERUN

エラーメッセージの表示 PDOはデフォルトではエラーがでない。
try ~ catch構文でエラーを監視。

PDOはデータベースでエラーがあっても画面にエラーメッセージが表示されない。
例えばINSERT文で、存在しないフィールドにレコードを挿入しても、画面には何も表示されない。
エラーを管理するには、まず、PDOsetAttribute()メソッドを使って、
エラーが発生したら、「例外」として処理するという設定に変更する。
そして、例外処理を管理するための、try ~ catchという構文を利用し、
例外が発生した時のエラーメッセージを、getMessage()というメソッドで表示させる。
(メソッド: いまのところ関数とほぼ同じものと捉えておいて下さい。)

エラーを例外として処理する設定に
変更してみよう。

setAttributeメソッド ・・・ PDOの設定を変更する
$DBハンドル->setAttribute(設定名, 設定値);
インスタンス名       メソッド名(パラメータ) 

 メソッドは、インスタンス名に「->(アロー演算子)」を用いて指定する

詳細はPHPマニュアルを参照

PDOエラーレポートの設定
設定名 設置値
PDO::ATTR_ERRMODE PDO::ERRMODE_SILENT
(エラーコードのみ設定する)
PDO::ERRMODE_WARNING
(E_WARNING を発生させる)
PDO::ERRMODE_EXCEPTION
(PDOException という型で例外を投げる)
  1. 「mini-cms」フォルダ内の「index.php」をテキストエディタで開く
  2. データベースに接続した後に、
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    と記述し、エラーが発生したら例外を投げる
mini-cms/index.php
<?php
  // ファイルの読み込み
  require_once('inc/config.php');

  // データベースへ接続
  $dbh = new PDO(DSN, DB_USER, DB_PASSWORD);

  // エラー発生時に「PDOException」という例外を投げる設定に変更
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  echo '接続成功';
?>

try ~ catch構文で
例外処理をしてみよう。

try ~ catch構文 ・・・ 例外処理
try {
  // 例外が発生する可能性のある処理
} catch (例外の型 例外の情報を格納する変数) {
  // 例外が発生した時の処理
}

詳細はPHPマニュアルを参照

  1. 例外処理を管理するデータベース関連の処理を、try { ~ }で囲み
    続いて、catch部分を記述
mini-cms/index.php
<?php
  // ファイルの読み込み
  require_once('inc/config.php');

  try {
    // データベースへ接続
    $dbh = new PDO(DSN, DB_USER, DB_PASSWORD);

    // エラー発生時に「PDOException」という例外を投げる設定に変更
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo '接続成功';
  } catch (PDOException $e) {
    // 例外発生時の処理

  }
?>

エラーメッセージを表示してみよう。

getMessage()メソッド ・・・ 例外メッセージを取得するメソッド
$例外情報の変数->getMessage();

詳細はPHPマニュアルを参照

  1. catch { ~ }の間に、エラーメッセージを表示し、処理を終了するコード記述
mini-cms/index.php
<?php
  // ファイルの読み込み
  require_once('inc/config.php');

  try {
    // データベースへ接続
    $dbh = new PDO(DSN, DB_USER, DB_PASSWORD);

    // エラー発生時に「PDOException」という例外を投げる設定に変更
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo '接続成功';
  } catch (PDOException $e) {
    // 例外発生時の処理
    echo 'エラー' . $e->getMessage();
    exit();
  }
?>
  1. 上書き保存
  2. ブラウザで「mini-cms」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/mini-cms/
  3. 「接続成功」が表示されるかを確認
ブラウザでの表示例

RERUN

$e->getMessage()は、安全そうに見えるが、改ざんされる可能性がある。
従って、htmlspecialchars関数で、無害化したほうがよい。

関数定義ファイルの作成 htmlspecialchars()は長い。
とにかく短く、楽にしたい。

htmlspecialchars()関数は、各ページで何回も利用する。
毎回書くのは面倒なので、外部ファイルに関数を作成しておく。

関数定義用ファイルを作成し、
h」という独自関数を作成しよう。

  1. 「mini-cms」 › 「inc」フォルダ内に「functions.php」を作成
  2. htmlspecialchars()関数を楽に記述できる独自関数を作成する
mini-cms/inc/functions.php
<?php
// XSS対策
function h($s) {
  return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
}
  1. 上書き保存

「functions.php」を読み込み、
h」を使ってみよう。

  1. 「mini-cms」フォルダ内の「index.php」をテキストエディタで開く
  2. 「functions.php」を読み込み、$e->getMessage()
    「h」関数を使って無害化する
mini-cms/index.php
<?php
  // ファイルの読み込み
  require_once('inc/config.php');
  require_once('inc/functions.php');

  try {
    // データベースへ接続
    $dbh = new PDO(DSN, DB_USER, DB_PASSWORD);

    // エラー発生時に「PDOException」という例外を投げる設定に変更
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo '接続成功';
  } catch (PDOException $e) {
    // 例外発生時の処理
    echo 'エラー' . h($e->getMessage());
    exit();
  }
?>
  1. 上書き保存
  2. ブラウザで「mini-cms」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/mini-cms/
  3. 「接続成功」が表示されるかを確認
ブラウザでの表示例

RERUN

SQLの実行 SQLを実行するだけなら
query()メソッドが手軽。

単純にSQLを実行するには、query()メソッドを利用する。

queryメソッド ・・・ SQLを実行するメソッド
$DBハンドル->query(実行するSQL文)

詳細はPHPマニュアルを参照

queryメソッドで、
レコードを挿入してみよう。

  1. 「mini-cms」フォルダ内の「index.php」をテキストエディタで開く
  2. 「接続成功」の出力を削除し、
    query()メソッドで、下記のレコードを挿入するコードを記述
mini-cms/index.php
<?php
  // ファイルの読み込み
  require_once('inc/config.php');
  require_once('inc/functions.php');

  try {
    // データベースへ接続
    $dbh = new PDO(DSN, DB_USER, DB_PASSWORD);

    // エラー発生時に「PDOException」という例外を投げる設定に変更
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // SQL文の作成
    $sql = 'INSERT INTO posts (title, content, category_id, created) values ("握手会のご報告", "先日、握手会を行いました。", 3, now())'; // now() ・・・ SQLの現在の日時を取得する関数

    // SQLを実行
    $dbh->query($sql);

  } catch (PDOException $e) {
    // 例外発生時の処理
    echo 'エラー' . h($e->getMessage());
    exit();
  }
?>
  1. 上書き保存
  2. ブラウザで「mini-cms」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/mini-cms/
  3. 画面にはとくに何も表示されないが、 アクセスと同時にレコードが挿入される

レコードが挿入されたかを確認してみよう。

  1. MySQLモニタを起動
  2. 「posts」の全レコードを表示するSQL文を、
    コマンドラインツールに記述
「posts」の全レコードを表示
select * from posts;

答えを見る

コマンド実行例

コマンドプロンプト

+----+-----------------------------------------------+-------------------------------------------------------------------------------------------------+-------------+---------------------+---------------------+
| id | title                                         | content                                         | category_id | created             | modified            |
+----+-----------------------------------------------+-------------------------------------------------------------------------------------------------+-------------+---------------------+---------------------+
|  1 | Webサイトを公開しました。                     | 本日、Webサイトを公開しました。お楽しみ下さい。                                         |           1 | 2018-04-01 10:00:00 | 2018-03-28 13:34:34 |
|  2 | 春の握手会について                            | 4月21日(土)、 22日(日)の2日間、握手会を開催致します。                                       |           2 | 2018-04-16 10:00:00 | 2018-03-28 13:34:34 |
|  3 | ゴールデンウィーク休暇について                | 4月28日(土) 〜 5月6日(日)までの9日間は、休みを頂戴いたします。                              |           1 | 2018-04-20 10:00:00 | 2018-03-28 13:34:34 |
|  4 | 握手会のご報告                                | 先日、握手会を行いました。                                         |           3 | 2025-12-17 13:14:16 | 2025-12-17 13:14:16 |
+----+-----------------------------------------------+-------------------------------------------------------------------------------------------------+-------------+---------------------+---------------------+
4 rows in set (0.00 sec)

mysql>
  1. このままでは、ブラウザに表示するたびにレコードを挿入するので、
    レコードの挿入に関する処理をコメントにしておく
mini-cms/index.php
<?php
  // ファイルの読み込み
  require_once('inc/config.php');
  require_once('inc/functions.php');

  try {
    // データベースへ接続
    $dbh = new PDO(DSN, DB_USER, DB_PASSWORD);

    // エラー発生時に「PDOException」という例外を投げる設定に変更
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // SQL文の作成
    // $sql = 'INSERT INTO posts (title, content, category_id, created) values ("握手会のご報告", "先日、握手会を行いました。", 3, now())'; // now() ・・・ SQLの現在の日時を取得する関数

    // SQLを実行
    // $dbh->query($sql);

  } catch (PDOException $e) {
    // 例外発生時の処理
    echo 'エラー' . h($e->getMessage());
    exit();
  }
?>
  1. 上書き保存

接続終了 データベースの処理が終わったら、
接続を終了しておく。

データベースは明示的に接続の終了を行わなくても、プログラム終了時に自動的に接続を終了するが、
不要な接続は明示的に終了しておくほうがよい。
接続の終了するには、データベースハンドルの変数に nullを代入する。

データベースの接続終了
$DBハンドル = null;

データベースとの接続を終了しよう。

  1. 「mini-cms」フォルダ内の「index.php」をテキストエディタで開く
  2. データベースとの接続を終了するコードを記述
mini-cms/index.php
<?php
  // ファイルの読み込み
  require_once('inc/config.php');
  require_once('inc/functions.php');

  try {
    // データベースへ接続
    $dbh = new PDO(DSN, DB_USER, DB_PASSWORD);

    // エラー発生時に「PDOException」という例外を投げる設定に変更
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // SQL文の作成
    // $sql = 'INSERT INTO posts (title, content, category_id, created) values ("握手会のご報告", "先日、握手会を行いました。", 3, now())'; // now() ・・・ SQLの現在の日時を取得する関数

    // SQLを実行
    // $dbh->query($sql);

    // データベースとの接続を終了
    $dbh = null;

  } catch (PDOException $e) {
    // 例外発生時の処理
    echo 'エラー' . h($e->getMessage());
    exit();
  }
?>
  1. 上書き保存
データベース操作の雛形
ここまで学習してきたコードがデータベースの操作の基本となる雛形。
データベースの操作が必要なたびに記述するため、覚えるようにしましょう。
データベース操作の基本となる雛形
<?php
  // ファイルの読み込み
  require_once('inc/config.php');
  require_once('inc/functions.php');

  try {
    // データベースへ接続
    $dbh = new PDO(DSN, DB_USER, DB_PASSWORD);

    // エラー発生時に「PDOException」という例外を投げる設定に変更
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // ここにデータべースを使った処理

    // データベースとの接続を終了
    $dbh = null;

  } catch (PDOException $e) {
    // 例外発生時の処理
    echo 'エラー' . h($e->getMessage());
    exit();
  }
?>

練習問題 今回の理解度をチェック。

「tranig」フォルダ内の「index.php」を完成させて下さい。

セレクト文実行例

コマンドプロンプト

mysql> select * from posts;
+----+-----------------------------------------------+-------------------------------------------------------------------------------------------------+-------------+---------------------+---------------------+
| id | title                                         | content                                                                                         | category_id | created             | modified            |
+----+-----------------------------------------------+-------------------------------------------------------------------------------------------------+-------------+---------------------+---------------------+
|  1 | Webサイトを公開しました。                     | 本日、Webサイトを公開しました。お楽しみ下さい。                                                 |  1 | 2018-04-01 10:00:00 | 2018-03-28 13:34:34 |
|  2 | 春の握手会について                            | 4月21日(土)、 22日(日)の2日間、握手会を開催致します。                                       |  2 | 2018-04-16 10:00:00 | 2018-03-28 13:34:34 |
|  3 | ゴールデンウィーク休暇について                | 4月28日(土) 〜 5月6日(日)までの9日間は、休みを頂戴いたします。                              |  1 | 2018-04-20 10:00:00 | 2018-03-28 13:34:34 |
+----+-----------------------------------------------+-------------------------------------------------------------------------------------------------+-------------+---------------------+---------------------+
3 rows in set (0.00 sec)

mysql> 
  1. id title content category_id created modified
    4 握手会のご報告 先日、握手会を行いました。 3 2025-12-17 13:14:16 2025-12-17 13:14:16
解答例
chapter16/training.php
<?php
  // データベースの定数
  define('DB_NAME', 'mini_cms_app');
  define('DB_USER', 'root');
  define('DB_PASSWORD', 'root'); // パスワード (MAMPは「root」)
  define('DSN', 'mysql:host=localhost;dbname='. DB_NAME . ';charset=utf8');

  try {
    // データベースへ接続
    $dbh = new PDO(DSN, DB_USER, DB_PASSWORD);

    // エラー発生時に「PDOException」という例外を投げる設定に変更
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // SQL文の作成
    $sql = 'DELETE FROM posts WHERE id = 4';

    // SQLの実行
    $dbh->query($sql);

    // データベースとの接続を終了
    $dbh = null;

  } catch (PDOException $e) {
    // 例外発生時の処理
    echo 'エラー' . htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8');
    exit();
  }
?>

解答例は全問題のチェックボックスが on になるとご覧いただけます。

まとめ データベースの接続は「PDO」を使う。

データベースへの接続方法はいくつかあるが、「PDO」を使う方法が一般的。

  • データベースに接続するには、PDOを使う
  • PDOのエラーを例外処理にするには、
    setAttribute()メソッドで設定する
  • 例外処理はtry ~ catch構文を使う