ニュース(お知らせ)一覧を表示し、記事タイトルをクリックすると、記事ページに遷移し、詳細な情報を表示する。データベースに登録されている情報を表示するため、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」データベース接続ファイル
実行しているファイル(今、いるページ)からみて、どこにデータベースがあるかを記述しています。
- 4行目:変数『&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行目:スクリプト処理を終了します。
- 「try」の中がメイン処理となります。
- 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)の後ろに「?」を付けて、値を受け渡す方法です。
例)ブログサイトや商品検索サイトなど、値が画面上に表示されても構わないページなど
- POST:「formタグ」の中に記述され、画面上には表示されず値を受け渡しする方法です。
<?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行目:スクリプト処理を終了します。
- 「try」の中がメイン処理となります。
- 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>
演習問題
- 上記のコードを使用して、3つのファイル作成し、動作するようにしてみよう。
- データベースやテーブルを変更し、違う情報を利用して、動作するようにしてみよう。