こんにちは、
炭酸水を飲むことにはまっているサトウです。
さて、本題に入りたいと思います。
phpの学習を進めていくとデータベースの情報を「ソートする機能」を実装したいと思う方も多いのではないでしょうか。SQLではselect文を使って情報をソートすることが可能ですが、理解できない方も少なくないのでは、、、。と思い、今回は「select」を使ったソート方法について分かりやすく説明していきます。
phpやSQLを学び始めた方や、「select」「selectを使ったソート方法」について分からない方は、是非読んでみてくださいね。
目次
select文の書き方
まずはSQLの基本的な書き方を解説していきます。
select文の基本的な書き方
データベースのテーブルから情報を検索するには「select」を使用します。
例えば「users」テーブルから「idが84」の「user_name」レコードを抽出したい時は以下のSQL文になります。
1 |
SELECT user_name FROM users WHERE id = 84 |
実際にMySQL上で確認してみましょう。
テーブル情報(SQL実行前)
この状態で以下を実行します。
1 |
SELECT user_name FROM users WHERE id = 84 |
実行結果
idが84の「テスト84」というユーザーだけ抽出できましたね。
これがselect文の基本的な書き方になります。
並び順を指定する:order by
ここからはソートする時に使用するSQLの書き方について解説していきます。
並び順を指定する時には「order by」を使用します。
並び順は昇順・降順も指定することができます。
・DESC・・・降順
以下の「product」というテーブルを例に説明します。
画面イメージ(productテーブル)
「name」や「category_code」といったカラム情報がバラバラに登録されているテーブルです。
この状態で「category_code」が小さい順に並び替えたい時のSQL文は以下のように書きます。
SQL文
画面イメージ(SQL実行後)
category_codeが昇順(カテゴリーコードの数字の少ない順)に並び替えられているのが確認できますね。
降順並び替えたい時も同様に記載します。
(例)priceカラムを降順(高い順)に並び替えたい場合
画面イメージ(SQL実行後)
priceカラムが降順(値段が高い順)に並び替わりましたね。
selectを使ってソート機能を実装してみよう!
ここからはselect文を使って、画面上からもソートできる機能を実装しながら解説していきます。
画面イメージ(完成後)
※今回はソートしたデータベースを画面表示するシンプルな実装内容にしています。
「検索する」「ボタンを押したらコンテンツが並び替わる」といった内容は含んでいないため、
興味がある方は是非調べながら記事の内容を改良して試してみてください。
サンプルコード(完成後)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
<?php // ログの表示 ini_set('log_errors','On'); ini_set('error_log','php.log'); //=================================================== //php側(サーバサイド)での処理 //=================================================== // (1)try-catchを使ってDBへの接続準備 try{ // DBへ接続の準備 $dsn = 'mysql:dbname=mysql_test;host=localhost;charset=utf8'; $user = 'root'; $password = パスワード; $options = array( // SQL実行失敗時には例外をスローしてくれる PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // カラム名をキーとする連想配列で取得する.これが一番ポピュラーな設定 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // バッファードクエリを使う(一度に結果セットをすべて取得し、サーバー負荷を軽減) // SELECTで得た結果に対してもrowCountメソッドを使えるようにする PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,); //(2)pdoオブジェクトでDB接続 $dbh = new PDO($dsn,$user,$password,$options); //(3)SQL文「product」テーブルの「name」カラムを検索し、昇順で並び替える $sql = 'SELECT name FROM product ORDER BY name ASC'; //(4)queryメソッドを使ってSQLの実行 $stmt = $dbh->query($sql); //(5)fetchメソッドを呼び出してクエリの実行結果を取得する $result = $stmt->fetchAll(PDO::FETCH_COLUMN); }catch(Exception $e){ error_log('エラー発生:' .$e->getMessage()); } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="style.css"> <title>SQLソート</title> </head> <body> <section class="container"> <select name="selectbox" id=""> <option value="" selected>選択してください</option> <!-- (6)$resultの中身をforeachで展開する --> <?php foreach ($result as $key => $value) { ?> <option value=""><?php echo $value;?></option> <?php } ?> </select> </section> </body> </html> |
処理の流れ
(2)pdoオブジェクトでDB接続
(3)SQL文「product」テーブルの「name」カラムを検索し、昇順で並び替える
(4)queryメソッドを使ってSQLの実行
(5)fetchメソッドを呼び出してクエリの実行結果を取得する
(6)$resultの中身をforeachで展開する
※(3)がselectを使ったSQL文を書いている箇所です
try-catchを使ってDBへの接続準備
まずはtry-catch(例外処理)を使ってデータベースへの接続準備をします。例としてmysql_testというデータベースを使用します。
サンプルコード(該当部分)
1 2 3 4 5 6 7 8 9 10 11 |
// (1)try-catchを使ってDBへの接続準備 try{ // DBへ接続の準備 $dsn = 'mysql:dbname=mysql_test;host=localhost;charset=utf8'; $user = 'root'; $password = パスワード; $options = array( }catch(Exception $e){ error_log('エラー発生:' .$e->getMessage()); } |
pdoオブジェクトでDB接続
PDOオブジェクトでデータベース接続するため、(1)で使用した情報を引数として使用します。
サンプルコード(該当部分)
1 2 |
//(2)pdoオブジェクトでDB接続 $dbh = new PDO($dsn,$user,$password,$options); |
SQL文「product」テーブルの「name」カラムを検索し、昇順で並び替える
ここでSELECT ORDER BYを使います。今回は「product」テーブルの「name」カラムを昇順で並べ替えます。
1 2 |
//(3)SQL文「product」テーブルの「name」カラムを検索し、昇順で並び替える $sql = 'SELECT name FROM product ORDER BY name ASC'; |
queryメソッドを使ってSQLの実行
SQLを実行するためにqueryメソッドを使用します。引数に(3)で記載したSQL文を使用します。
サンプルコード(該当部分)
1 2 |
//(4)queryメソッドを使ってSQLの実行 $stmt = $dbh->query($sql); |
fetchメソッドを呼び出してクエリの実行結果を取得する
fetchAllを使って、クエリの結果を連想配列の形式で取得します。
今回はnameカラム以外の情報は使用しないため一次元配列で情報取得可能なPDO::FETCH_COLUMNと書きます。
サンプルコード(該当部分)
1 2 |
//(5)fetchメソッドを呼び出してクエリの実行結果を取得する $result = $stmt->fetchAll(PDO::FETCH_COLUMN); |
$resultの中身をforeachで展開する
クエリの実行結果が入っている$resultをforeachで展開します。
foreachは以下のように書くと中身を展開(表示していく)ことが可能です。
必要な処理を記載
}
今回の処理はプルダウン形式で表示します。そのため、foreachで展開した値($value)を<option>タグを使って挟みます。
サンプルコード
1 2 3 4 5 6 7 8 9 |
<!-- (6)$resultの中身をforeachで展開する --> <?php foreach ($result as $key => $value) { ?> <!-- value部分(nameカラムの値)はechoで画面表示する --> <option value=""><?php echo $value;?></option> <?php } ?> |
まとめ
いかがでしたか?今回は、SQLのselectを使ってソートする方法について説明しました。
プログラミングを学び始めた頃は、「selectを使ったソート方法」について難しく感じることあると思います。ですがまずはデータの少ない情報からSQL文を書いていけば、簡単に使えることができる日が来ると思うので、焦らずにゆっくりと理解を深めていってくださいね
この記事が、phpの学習に役立つと嬉しいです。