目次
ローカルでの実行環境を作成する
まずローカル環境で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のクラスについては、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);