こんにちは!今回はPHP始めて10日でページネーションを実現出来たので、どこよりもわかりやすく解説していこうと思います。
今回はその「準備編」です!

「実践編」はこちら↓
PHP初心者でも出来た!ページネーションを超わかり易く解説~実践編~

MySQLの作成や設定が少々手間ですが、コレが出来ればPHPの基本をマスター出来たと言っても過言では無いです!(たぶん)

また、本記事ではLAMP環境を想定しています。
初期位置等が異なる場合があるので、その辺りは自身の環境に合わせて同様の操作を行ってください。

インストール方法や初期設定については、「LAMP環境を構築してPHPプログラミング」コチラの記事で解説していますので割愛します。

【目次】

スポンサーリンク




ページネーションとは?

ページングとも呼ばれますね。
ブログの最新記事を並べて、溢れた分を別ページで表示するような機能です。

絶対に一度は見たことあると思います!

簡単に仕組みを解説すると、
[DBに接続]→[データを取得]→[ページに分割して表示]
って感じでページングを実現しています。

今回はブログ風なページネーションを作成してみます!

My SQLでDBを作成

まずデータベースの基本的な概念として「DBMS」と「データベース」と「テーブル」があります。

  • DBMS…データベースマネジメントシステム。MySQLはこれに当たる。
  • データベース…テーブルを格納する箱みたいなもの。DBMS上に複数作ることができる。
  • テーブル…実際にデータを格納する場所。

厳密ではないですが、持つイメージはこんな感じで良いと思います。

rootユーザでログイン。

$mysql -u root -p
Enter password:    #パスワードを入力

mysql>

データベース「blog」を作成。

mysql>CREATE DATABASE blog;

mysql>SHOW DATABASES;    #データベース一覧を表示

+--------------------+
| Database           |
+--------------------+
| blog               |
| mysql              |
| sys                |
+--------------------+

「blog」データベースが作成できている事を確認出来ました!
初期からあるデータベースは環境によって変わるかもしれないので、とりあえず気にしなくて大丈夫です。

テーブルを作成

まずテーブルを作成する前にテーブルの設計をする必要があります。
ブログの記事一覧を思い浮かべてみて下さい。

最新記事から順に並んでいて、アイキャッチがあって、タイトルがあって、紹介文があって…

今回はタイトルのみを表示するような記事一覧を想定して作成します。

mysql>CREATE TABLE posts(no SERIAL,
                         title TEXT,
                         file_path VARCHAR(100),
                         PRIMARY KEY(no));

カラム「no」を主キーとして記事を格納する「posts」テーブルを作成しました。
「title」には記事タイトル。「file_path」には記事本体へのパスを格納します。

VARCHARとTEXT型は文字列データを格納する時に使用します。
入る文字数があらかじめ把握できる場合はVARCHARでサイズを指定、予測がつかない場合はTEXTとすると効率が良いでしょう。
(マルチバイト文字を扱う場合もTEXTにしておくと安心)

構造を確認してみます。

mysql>SHOW COLUMNS FROM posts;

+-----------+---------------------+------+-----+---------+----------------+
| Field     | Type                | Null | Key | Default | Extra          |
+-----------+---------------------+------+-----+---------+----------------+
| no        | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| title     | text                | YES  |     | NULL    |                |
| file_path | varchar(100)        | YES  |     | NULL    |                |
+-----------+---------------------+------+-----+---------+----------------+

「no」の”auto_increment”は、自動で連番を割り当てる設定であることを示します。
後に出てくる並べ替え等にも使うので、意味を理解しておきましょう。

ファイル構成を考える

テーブルにデータを挿入する前に、ファイル構成について考えておきましょう!

今回はApacheのドキュメントルート直下に「blog」フォルダを作成し、そこに記事を格納していく構成とします。

LAMPのデフォルトの状態であれば「/var/www/html/」がドキュメントルートです。

#mkdir /var/www/html/blog

パーミション(権限)の都合上rootユーザで作業したほうが楽かもしれません。
テスト用のファイルを一つ作成します。

#nano /var/www/html/blog/test1.php

<?php
   echo'準備中です';
?>

test1.phpというファイルを「blog」の下に作成しました。コイツが先ほど作成したテーブルに格納するファイルパスになります。

次に、記事一覧を表示するホームページとなるファイルを形だけ作っておきます。

#touch /var/www/html/blog/home.php

ホームページとなる「home.php」を作成しました。

データをテーブルに挿入する

実際にテーブルにデータを挿入していきます。
とりあえず10レコードくらい作ってみましょう!

mysql>
INSERT INTO posts(title,file_path) VALUES('橋本環奈の魅力を伝えたい','./test1.php'),
('名探偵ピカチュウを見てきました','./test2.php'),
('蜘蛛を飼い始めたらゴキが消えた話','./test3.php'),
('バンドマンは本当にお金が無い?','./test4.php'),
('顎髭をスッキリ抜く方法','./test5.php'),
('100均のピンセットはうんち,'./test6.php'),
('人気ニコ生主加藤純一のススメ','./test7.php'),
('恋愛マスターへの道vol1','./test8.php'),
('恋愛マスターへの道vol2','./test9.php'),
('ラーメンで優勝って何だ?','./test10.php');

値を入れる項目を指定し、VALUESで実際の値を挿入しています。
カラム「no」は”auto_increment”が設定されているので、値を入れないように注意して下さい。

mysql>SELECT * FROM posts;

+----+--------------------------------------------------+--------------+
| no | title                                            | file_path    |
+----+--------------------------------------------------+--------------+
|  1 | 橋本環奈の魅力を伝えたい                         | ./test1.php  |
|  2 | 名探偵ピカチュウ見てきました                     | ./test2.php  |
|  3 | 蜘蛛を飼い始めたらゴキが消えた話                 | ./test3.php  |
|  4 | バンドマンは本当にお金が無い?                   | ./test4.php  |
|  5 | 顎髭をスッキリ抜く方法                           | ./test5.php  |
|  6 | 100均のピンセットはうんち                        | ./test6.php  |
|  7 | 人気ニコ生主加藤純一のススメ                     | ./test7.php  |
|  8 | 恋愛マスターへの道vol1                           | ./test8.php  |
|  9 | 恋愛マスターへの道vol2                           | ./test9.php  |
| 10 | ラーメンで優勝って何だ?                         | ./test10.php |
+----+--------------------------------------------------+--------------+

「SELECT * FROM posts」は、postsテーブルの全フィールドを取得する操作を表します。
無事にデータが入り、自動で採番されていることが確認出来ましたね!

新しいデータは自動で一番うしろのレコードに挿入されていくので、後に挿入したデータの方が新しい記事と考えます。

接続用のユーザを作成

rootユーザをそのまま接続に用いるのは危険なので、まずはデータベース接続用の専用ユーザを作成していきます!

rootユーザでログイン。

$mysql -u root -p
Enter password:    #パスワードを入力

mysql>

ユーザを普通に作成。

mysql>CREATE USER 'ユーザ名'@'ホスト名' IDENNIFIED BY '新しいパスワード';

これがユーザ作成の一番ベーシックな形です。
特に拘りがなければホスト名の所はlocalhostで良いと思います。
今回は「test@localhost」で作成したいと思います。

次にユーザの認証方式を変更したり、権限を付与したりしていきます。

認証方式を変更

ここがハマりポイントで、MySQLのver8.0からデフォルトの認証方式が変更されました。
しかし、PHP側ではまだその対応が出来ていない状態なので、接続時にエラーが起きてしまいます。

ここではPHPのPDOコマンドに対応した認証方式に変更していきます。

まずは現在のユーザを確認してみましょう。

mysql>USE mysql;    #mysqlDBにユーザ情報が存在するため、USEで選択

mysql>SELECT user,host,plugin from user;    #必要なユーザ情報を抽出

+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| root             | localhost | caching_sha2_password |
| test             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+

先ほど作成したユーザを確認できました。「plugin」は認証方式についてのカラムです。

次に、認証方式を「mysql_native_password」に変更していきます。

mysql>ALTER USER 'ユーザ名'@'ホスト名' IDENNIFIED WITH mysql_native_password BY 'パスワード';

mysql>SELECT user,host,plugin from user;

+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| root             | localhost | caching_sha2_password |
| test             | localhost | mysql_native_password |
+------------------+-----------+-----------------------+

無事変更されていることが確認できましたね!

権限を設定

次に作成したユーザに適切な権限を設定していきます。
「blog」データベース全体への全操作権限を持たせるのを目標にします。

まずは付与されている権限を確認。

mysql>SHOW GRANTS FOR 'ユーザ名'@'ホスト名';

+------------------------------------------+
| Grants for test@localhost                |
+------------------------------------------+
| GRANT USAGE ON *.* TO `test`@`localhost` |
+------------------------------------------+

「GRANT 権限 ON データベース.テーブル TO ‘ユーザ名’@’ホスト名’」の書式になっています。
この場合、「test@localhost」は全データベース・テーブルに対して「USAGE」が付与されていることを表します。(USAGEは何も権限が無いことを示す。)

確認出来たところで「blog」データベースの全操作権限を付与します。

mysql>GRANT ALL ON blog.* TO 'test'@'localhost';

mysql>SHOW GRANTS FOR 'test'@'localhost';

+-------------------------------------------------------+
| Grants for test@localhost                             |
+-------------------------------------------------------+
| GRANT USAGE ON *.* TO `test`@`localhost`              |
| GRANT ALL PRIVILEGES ON `blog`.* TO `test`@`localhost`|
+-------------------------------------------------------+

これで目標通りの権限を付与することが出来ました!

PHPにPDOをインストール

「LAMP環境を構築してPHPプログラミング」コチラの記事でも解説していますが、PHPからデータベースを操作するための「PDO」パッケージを別途インストールする必要があります。

#dnf install -y php-pdo

意外とハマりポイントなので要注意です!
「dnf」の部分は自身の環境に合わせて読み替えてください。
(XAMPPなんかは始めからインストールされていると思います。)

接続確認

最後に簡単なPHPファイルとSQLで接続確認を行ってみましょう。

まずはApacheとMySQLの起動を行います。
(GUIで起動しても特に変わりません。とりあえず動かして下さい)

#systemctl start httpd

#systemctl start mysqld

postsテーブルを取得するためのPHPファイル「test.php」を先ほど作成した「blog」フォルダ下に作成。

<?php

    try{
        //test@localhostでblogに接続
        $pdo = new PDO('mysql:dbname=blog;host=localhost;charset=utf8','test','パスワード');
    } catch (PDOException $error) {
        //エラーの場合はエラーメッセージを吐き出す
        exit("データベースに接続できませんでした。<br>" . $error->getMessage());
    }
?>
<ul>
<?php
    //prepareでSQLを準備
    $select = $pdo->prepare('SELECT * FROM posts');
    $select->execute();     //準備したSQLを実行。PDO Statementクラスのオブジェクトが渡される。(SQLの結果も保持する)

    //PDO Statementのfetchメッソドを利用して、結果を一行ずつ取得。データがなくなるとFALSEを返す。
    while ($row = $select->fetch(PDO::FETCH_ASSOC)) {   
        $title = htmlspecialchars($row['title']);   //タイトルを取得
        $file_path = htmlspecialchars($row['file_path']);   //ファイルパスを取得
        echo "<li><a href='$file_path'>$title</a></li>";
      }
?>
</ul>

「SELECT * FROM posts」で全てのデータを抽出し、While文を使って一行づつ取り出して表示させています。

$pdo = new PDO('mysql:dbname=blog;host=localhost;charset=utf8','test','パスワード');

この部分でDBMS,データベース,ユーザ,文字コード…を指定してデータベースに接続しています。
PDOの詳しい解説については次回の記事で説明するので、今回はこれで接続が確認できればひとまず大丈夫でしょう。

ブラウザ上で「localhost/blog/test.php」と指定して表示されれば成功です。

もしも上手く行かない時は…

構文に誤りがない場合、下記項目が原因の可能性があるので確認してみて下さい。

  • 認証方式の変更
  • 権限の設定
  • PDOのインストール
  • ファイルのパーミッション設定
  • SELinuxの設定

おわりに

ページネーション準備編いかがでしたか?
結構準備することが多いですよね…

僕もDBに接続出来なくてかなりハマった思い出が蘇りました(笑)

また、今回はLAMP環境のためコマンドラインのみで操作していますが、GUIから操作しても同じことです。
適所読み替えて挑戦してみて下さい!

次回はついに実践編です!PDOの使い方さえ理解してしまえば後は難しいことは無いので、頑張りましょう;;
PHP初心者でも出来た!ページネーションを超わかり易く解説~実践編~

SQLの説明はかなり割愛しているので、要望があれば別でコッチも記事書こうかなぁ…

また次の記事もよろしくお願いします。
最後までありがとうございました!!