PHPでDBからデータを取得する【PDO①】

PHPでDBからデータを取得する【PDO①】

2021/02/10

ローカルでの実行環境を作成する

まずローカル環境でPHPとSQL(MySQL)を動かすため、XAMPPを使って説明をします。

テストデータ

ユーザー情報は「name(名前)」「age(年齢)」とし、AUTO_INCREMENTで付与されるID(ユーザーID)とtime(登録時間)をデータベースに保存することとします。またデータベース名は「test」、テーブル名は「users」とします。

なお、SQLでテーブルを作成する場合は、以下のSQLを実行します。

データベースでSQLを実行するには、「SQL」タブをクリックします。

CREATE TABLE `users` (
  `id` int(11) NOT NULL,
  `time` datetime NOT NULL DEFAULT current_timestamp(),
  `name` varchar(64) NOT NULL,
  `age` int(11) NOT NULL
)

ALTER TABLE `users`
 ADD PRIMARY KEY (`id`); # 主キーを設定

ALTER TABLE `users`
 MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; # AUTO_INCREMENTを設定

テストデータとして、あらかじめデータを用意しておきます。下のSQLで実行してください。

INSERT INTO `users`(`name`, `age`) VALUES ('John',32);
INSERT INTO `users`(`name`, `age`) VALUES ('Ken',25);

PHPでデータベースの操作を行う

データベースを操作するために、PHPには「PDOクラス」が用意されています。

PHP: PDO - Manual

PHP is a popular general-purpose scripti…
www.php.net
PHPのクラス

PHPのクラスについては、progateなどで学習しておいてください。
キーワード:インスタンス、オブジェクト、メソッド、プロパティ

PDO::__construct

データベースへ接続するために、PDOのインスタンスを作成します。

$dns = 'mysql:dbname=test;host=127.0.0.1;charset=utf8mb4';
$username = 'root';
$password = '';;charset=utf8mb4
$pdo = new PDO($dns, $username, $password);

dns:MySQLの場合は、mysql:dbname=(DB名);host=(ホスト名)

username,passwordはMySQLに接続する、ユーザー名・パスワードを指定します。

phpMyAdminの場合は、ホスト名=127.0.0.1、ユーザー名=root、パスワード=空白 です。

本来であれば、データベースへの接続に失敗した際に、エラーの処理(エラーハンドリング)を行うために以下のような形で書きますが、その処理については今回は省略します。

try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

PDO::prepare

次にSQL文を実行する準備を行います。

$sql = 'SELECT * FROM users';
$sth = $pdo->prepare($sql);

prepareメソッドの引数にはSQL文を指定します。prepareメソッドの返り値は「PDOStatementクラス」のオブジェクトとなります。

PDOStatement::execute

SQL文を実行します。

$sth->execute();

PDOStatement::fetchAll

SQLの実行結果のすべての結果行を配列で返します。

$data = $sth->fetchAll();
print_r($data); //配列を表示

PHPの配列は echo では表示できないため、 print_r を用いて結果を表示します。

結果は以下の通りになります。

Array ( [0] => Array ( [id] => 1 [0] => 1 [time] => 2021-02-10 19:52:34 [1] => 2021-02-10 19:52:34 [name] => John [2] => John [age] => 32 [3] => 32 ) [1] => Array ( [id] => 2 [0] => 2 [time] => 2021-02-10 19:52:34 [1] => 2021-02-10 19:52:34 [name] => Ken [2] => Ken [age] => 25 [3] => 25 ) )

結果をよく見ると、「idと0」、「timeと1」、「nameと2」、「ageと3」が同じ値を指していることがわかります。これを防ぐには、以下のようにコードを変更します。
こうすることによって、数字の方が消えて表示がスッキリします。

$data = $sth->fetchAll(PDO::FETCH_ASSOC);

コード全体

<?php

$dns = 'mysql:dbname=test;host=127.0.0.1;charset=utf8mb4';
$username = 'root';
$password = '';
$pdo = new PDO($dns, $username, $password);

$sql = 'SELECT * FROM users';
$sth = $pdo->prepare($sql);

$sth->execute();

$data = $sth->fetchAll(PDO::FETCH_ASSOC);
print_r($data);