機能概要

ニュース(お知らせ)一覧を表示し、記事タイトルをクリックすると、記事ページに遷移し、詳細な情報を表示する。データベースに登録されている情報を表示するため、SQLを利用する。

データベース準備

下記のSQL文を実行し、ニューステーブル(news_tbl)を構築します。

/* ニューステーブル(クリエイト文) */
Create Table news_tbl (
 seq_no bigint not null auto_increment,
 title_kj varchar(255) not null,
 article_kj text not null,
 delete_ku char(1) not null,
 insert_at datetime not null,
 update_at datetime not null,

 Primary Key(
  seq_no
 )
);

プログラミングコード

「config.php」データベース接続ファイル

実行しているファイル(今、いるページ)からみて、どこにデータベースがあるかを記述しています。

  • 行目:変数『&dsn』は、データベース名前や位置、文字コードを指定します。
    • dbname = データベース名
    • host = サーバの位置(LAN/WAN含める)localhostは、同一サーバ内を指す。
    • charset = 文字コード(utf8)が一般的
  • 5行目:変数『&user』は、データベースに接続するためのユーザー名を指定します。
  • 6行目:変数『&password』は、データベースに接続するためのパスワードを指定します。
<?php

//データベース接続情報を格納
$dsn = 'mysql:dbname=xxxxx1;host=localhost;charset=utf8';
$user = 'xxxxx2';
$password = 'xxxxx3';

?>

「newslist.php」お知らせ一覧ページファイル

データベースから取得したニュース一覧を表示します。また、タイトルに記事ページへのリンクを貼り、遷移することができます。

  • 4行目:「config.php」を読み込み、その中の変数情報を使用することができるようになります。
  • 6行目:「try~catch」は、プログラムを実行し、エラー(例外)などが発生した際に他のプログラムを実行することができます。
    • 「try」の中がメイン処理となります。
      今回のメイン処理は、データベースに接続し、値を受け取るプログラムとなります。
    • 「catch」は、「try」のメイン処理で、エラーが発生したときに動作するプログラムです。
      • 27行目:エラー内容を取得し、画面上に表示します。
      • 28行目:スクリプト処理を終了します。
  • 37行目:「foreach( )」は、49行目の「endforeach」までを繰り返します。今回の条件では、「&data」内のレコードが無くなるまで繰り返します。
  • 43~44行目:取得したカラム「insert_at」の表記を「yyyy/mm/dd(4桁/2桁/2桁)」にします。
  • 47行目:「GET」タイプで値を次のページに渡します。「aタグ」のリンク部分がポイントです。値を受け渡しには、「POST」と「GET」があります。
    • POST:「formタグ」の中に記述され、画面上には表示されず値を受け渡しする方法です。
      例)お問合せフォームや購入フォームなど他の人に見られたくない値をやり取りするページなど
    • GET:「index.html?seq_no=1」のようにファイル名(ページURL)の後ろに「?」を付けて、値を受け渡す方法です。
      例)ブログサイトや商品検索サイトなど、値が画面上に表示されても構わないページなど
<?php

//データベース接続情報を格納
include("config.php");

try{

    $dbh = new PDO($dsn, $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "select"
            ." nt.seq_no"
            .",nt.title_kj"
            .",nt.insert_at"
            ." from news_tbl nt"
            ." where nt.delete_ku = '0'"
            ." order by nt.seq_no desc"
            .";";
    $stmt = $dbh->prepare($sql);
    $stmt->execute();

    $count = $stmt->rowCount();
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
        $data[] = $row;
    }

}catch (PDOException $e){
    echo($e->getMessage());
    die();
}

?>

<html>
<body>
<h1>ニュース一覧</h1>
<table border=1>
    <tr><th>id</th><th>日付</th><th>タイトル</th></tr>
    <?php foreach($data as $row): ?>
    <tr>
        <td><?php echo $row['seq_no'];?></td>
        <td>
            <?php
                $Date = date($row['insert_at']); 
                echo date('Y.m.d', strtotime($Date));
            ?> 
        </td>
        <td><a href="newsArticle.php?seq_no=<?php echo $row['seq_no'];?>"><?php echo $row['title_kj'];?></a></td>
     </tr>
    <?php endforeach; ?>
</table>
</body>
</html>

「newsArticle.php」お知らせ詳細ページファイル

前のページからの値をもとにデータベースから取得したニュース記事を表示します。

  • 4行目:「config.php」を読み込み、その中の変数情報を使用することができるようになります。
  • 7行目:前のページからの値を「GET」で値を受け取ることができます。
  • 11行目:「try~catch」は、プログラムを実行し、エラー(例外)などが発生した際に他のプログラムを実行することができます。
    • 「try」の中がメイン処理となります。
      今回のメイン処理は、データベースに接続し、値を受け取るプログラムとなります。
    • 「catch」は、「try」のメイン処理で、エラーが発生したときに動作するプログラムです。
      • 26行目:エラー内容を取得し、画面上に表示します。
      • 27行目:スクリプト処理を終了します。
  • 20行目:「:seq_no」は、PHPからSQLを実行する際に、引数として代入することができるようになります。
  • 33行目:データベースから受け取った値を、そのまま表示した場合、HTMLタグとして認識されてしまい正しく表示されません。例)「<」「>」「”」「’」「&」などがあります。
    そこで、「htmlspacialchars」は、画面上で正しく表示されるように違う文字に変換します。
  • 40行目:データベースから受け取った値にある「改行コード」は、HTMLでは反映されません。
    そこで、「nl2br」は、画面上で正しく改行されるように「brタグ」に変換します。
<?php

//データベース接続情報を格納
include("config.php");

//GETで値を受け取る
if($_SERVER['REQUEST_METHOD'] === 'GET'){
    $seq_no = $_GET['seq_no'];
}

try{
    $dbh = new PDO($dsn, $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "select"
            ." nt.seq_no"
            .",nt.title_kj"
            .",nt.article_kj"
            .",nt.insert_at"
            ." from news_tbl nt"
            ." where nt.seq_no = :seq_no";
    $stmt = $dbh->prepare($sql);
    $stmt->bindValue(':seq_no', $seq_no , PDO::PARAM_INT);
    $stmt->execute();
    $result = $stmt->fetch();
}catch (PDOException $e){
    echo($e->getMessage());
    die();
}
?>

<html>
<body>
<h1><?php echo htmlspecialchars($result['title_kj'],ENT_QUOTES,"UTF-8"); ?></h1>
<div>
    <?php
        $Date = date($result['insert_at']); 
        echo date('Y.m.d', strtotime($Date));
    ?>
</div>
<p><?php echo nl2br(htmlspecialchars($result['article_kj'],ENT_QUOTES,"UTF-8")); ?></p>
</body>
</html>

演習問題

  1. 上記のコードを使用して、3つのファイル作成し、動作するようにしてみよう。
  2. データベースやテーブルを変更し、違う情報を利用して、動作するようにしてみよう。